How do I undo a part of the changes applied to a file that happened a while a go.
I have the following commits and the accidental changes happened between A
and B
to 'file.txt'
...--A--B--...
I have a diff patch of the file in file.txt-B-A.patch
which reverts all changes.
However I only want to undo certain changes in file.txt
, much like manually picking changes in a merge conflict. Is there a way to do so without modifying the patch file?
Try Git checkout --<file> to discard uncommitted changes to a file. Git reset --hard is for when you want to discard all uncommitted changes. Use Git reset --hard <commit id> to point the repo to a previous commit.
You previously saw how to use git checkout to undo the changes that you made since the last commit. This command can also be used to go back even further into a file's history and restore versions of that file from a commit.
Many git commands have the -p
option ("patch") or -i
("interactive") to do something partially. For arbitrary diffs I don't think this is supported, but you can apply the patch and then selectively undo unstaged changes using git checkout -p -- <path(s)>
, e.g. git checkout -p -- .
if you're at the top level of the repo.
There's another way to do this that doesn't require the patch file at all.
The problem happened going from A
to B
, so first revert the changes in B
but don't automatically commit.
$ git revert --no-commit <commit hash of B>
The changes that git revert
would do are staged. Unstage them.
$ git reset HEAD
Next, interactively go through file.txt
and stage only the changes you want to keep.
$ git add --patch file.txt
Only the reverts you selected are now staged. Commit them.
$ git commit
Finally, clean up the unstaged leftovers from git revert
.
$ git reset --hard
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With