I'm wondering if there is a way to quickly reverse specific hunk of a commit.
I can generate a diff
between two commits or HEAD
to see the difference.
How do I reverse just one of those hunks (or better yet, a set of specific hunks)?
I'm wondering if there is a way to quickly reverse specific hunk of a commit.
I can generate a diff
between two commits or HEAD
to see the difference.
How do I reverse just one of those hunks (or better yet, a set of specific hunks)?
git checkout -p $REF -- path/to/file
e.g.,
git checkout -p HEAD^ myfile
Where $REF
is a ref name or commit ID that specifies the commit you want to take the file state from. For example, to selectively revert changes made in the last commit, use HEAD^
.
-p
option will let you interactively select hunks to apply to your working tree. –
Coeternity add
, checkout
, reset
, etc.) will take the -p
option this way and will let you pick which hunks to act on. This is really handy when two hunks in the same file should go into different commits. –
Coeternity y
when prompted for each hunk. This will produce a staged diff on top of your previous commit without modifying it. You can then view the diff by unstaging it (git reset <file>
) then git diff
. Finally, you can merge it into your previous commit via git commit --amend <file>
). –
Ottillia To revert one or more hunks from specific commit(s) do like this - using add -p
in essence:
git revert --no-commit <commit>…
git reset # unstage things
git add -p [OPTIONS] [<pathspec>…] # choose hunks interactively
git restore . # wipe the rest (in root directory)
... maybe further changes ...
git commit [--fixup] ...
Future git versions may support git revert -p
directly...
Note: Methods like git checkout/restore -p ...
do not consistently revert hunks from a specific commit but go to pick parts from a certain file state - possibly loosing changes in other later commits.
git difftool $REF -- /path/to/file
where $REF
is a ref name or commit ID that specifies the commit you want to take the file state from. For example, to selectively revert changes made in the last commit, use HEAD^.
This question was already answered by @cdhowie, but I find it somewhat nicer to use an interactive difftool like meld
to selectively restore old hunks/lines of code, especially if there is a newly-introduced, hard-to-find bug in the code.
To recover a deleted file from a previous commit I used the answer here:
Find and restore a deleted file in a Git repository
git checkout <deleting_commit>^ -- <file_path>
The way I like to do this is to use:
git rebase -i HEAD~
n where 'n' is the number of commits back.git add -p
or manual edits.git commit --amend
.git rebase --continue
to end the rebase.© 2022 - 2024 — McMap. All rights reserved.