How do I reverse a specific hunk of a commit in git?
Asked Answered
C

5

47

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)?

Cricoid answered 22/11, 2010 at 17:24 Comment(0)
C
52
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^.

Coeternity answered 22/11, 2010 at 17:27 Comment(6)
More precisely, that will let you selectively check out versions of content from the previous commit; changes between your current commit and the work tree will also be discarded.Polonium
Yes I've done this that before. But this reverts back all the changes? I'm looking to revert back only some of the changes.Cricoid
@DKinzer: No, the -p option will let you interactively select hunks to apply to your working tree.Coeternity
No problem. Note that a lot of git commits (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
I'm new to git and so far only knew about -i for selectively choosing commits when doing a rebase. I think the -p option will be very useful to me.Cricoid
In order to remove hunks, select 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
K
4

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.

Kulseth answered 28/1, 2021 at 12:12 Comment(0)
A
2
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.

Asuncionasunder answered 28/8, 2013 at 20:27 Comment(0)
R
0

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>
Rattat answered 22/6, 2012 at 14:9 Comment(0)
K
0

The way I like to do this is to use:

  1. git rebase -i HEAD~n where 'n' is the number of commits back.
  2. Use 'edit', on the commit you want to remove the hunk from.
  3. Follow this with git add -p or manual edits.
  4. git commit --amend.
  5. git rebase --continue to end the rebase.
Klansman answered 20/6 at 5:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.