Reverting part of a commit with git

浪子不回头ぞ 提交于 2019-11-28 13:34:01

问题


I want to revert a particular commit in git. Unfortunately, our organization still uses CVS as a standard, so when I commit back to CVS multiple git commits are rolled into one. In this case I would love to single out the original git commit, but that is impossible.

Is there an approach similar to git add --patch that would allow me to selectively edit diffs to decide which parts of a commit to revert?


回答1:


Use the --no-commit (-n) option to git revert, then unstage the changes, then use git add --patch:

$ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes

Note: The files you add using git add --patch are the files you want to revert, not the files you want to keep.




回答2:


I have used the following successfully.

First revert the full commit (puts it in index) but don't commit.

git revert -n <sha1>  # -n is short for --no-commit

Then interactively remove the reverted GOOD changes from the index

git reset -p          # -p is short for --patch  

Then commit reverse diff of the bad changes

git commit -m "Partially revert <sha1>..."

Finally the reverted GOOD changes (which have been unstaged by the reset command) are still in the working tree. They need to be cleaned up. If no other uncommitted changes are left in the working tree, this can be done by

git reset --hard



回答3:


Solution:

git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.



回答4:


Personally, I prefer this version, which reuses the auto-generated commit message and gives the user the opportunity to edit and stick the word "Partially" in before finally committing.

# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .



回答5:


Another alternative (if your current version of a file isn't too far from the version you're trying to revert) is to get the hash of the commit immediately before the one you wish to partially revert (from git log). Then your command becomes:

$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext

This does change the files in your working tree but creates no commits, so if you really stuff up you can just start again with git reset --hard -- file/you/want/to/fix.ext.




回答6:


You can use git-revert -n, and then use add --patch to select hunks.



来源:https://stackoverflow.com/questions/4795600/reverting-part-of-a-commit-with-git

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!