Question

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?

Was it helpful?

Solution 2

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

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top