Answers:
在中使用--no-commit
(-n
)选项git revert
,然后撤消更改,然后使用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
注意:使用git add --patch添加的文件是要还原的文件,而不是要保留的文件。
git reset --hard
丢弃您不想还原的其他更改。
git reset --hard
对于新手来说很危险,因为它可能会丢失想要的编辑内容。而是习惯了git status
,这暗示着git checkout -- FILE..
可以更安全地还原内容。
git
; git revert
应该只是--patch
吵架。
git revert
用于还原整个提交。您可以git checkout -p
用来交互式地选择要还原的位。
commit
第一,或者stash
,再试试revert
。
我已经成功使用了以下内容。
首先还原完整的提交(将其放入索引),但不提交。
git revert -n <sha1> # -n is short for --no-commit
然后以交互方式从索引中删除还原的GOOD更改
git reset -p # -p is short for --patch
然后提交差价的反向差异
git commit -m "Partially revert <sha1>..."
最终,还原的GOOD更改(已由reset命令取消暂存)仍在工作树中。他们需要清理。如果工作树中没有其他未提交的更改,可以通过以下方法完成
git reset --hard
reset HEAD .
)的最佳替代方法,因为它不需要最终清除工作目录吗?
reset -p
它比reset HEAD
后跟的要短add -p
。但这仍然需要清理,因为在提交后,已重置的“好”块仍在工作目录中。
就我个人而言,我更喜欢这个版本,它可以重用自动生成的提交消息,并为用户提供在最终提交之前编辑并粘贴“部分地”一词的机会。
# 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 -- .