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-BA.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?
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
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)>
, eg git checkout -p -- .
if you're at the top level of the repo.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.