如何在git中撤消部分未分阶段的更改,但将其余部分保留为未分阶段?我想出的方法是:
git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply
Run Code Online (Sandbox Code Playgroud)
这样可行,但如果git commit --interactive只有恢复变更的话会很好.有更好的方法吗?
Bri*_*ell 253
您可以使用git checkout -p,它允许您从工作副本和索引之间的差异中选择单个帅哥来还原.同样,git add -p允许您选择要添加到索引的数据库,并git reset -p允许您从索引和HEAD之间的差异中选择单个数据库以退出索引.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Run Code Online (Sandbox Code Playgroud)
如果您希望事先对git存储库进行快照以在还原它们之前保留这些更改,我喜欢这样做:
$ git stash; git stash apply
Run Code Online (Sandbox Code Playgroud)
如果您经常使用它,您可能想要别名:
[alias]
checkpoint = !git stash; git stash apply
Run Code Online (Sandbox Code Playgroud)
如果你使用一个好的编辑器模式或插件,可以更容易恢复个人或线条,这可能为直接选择线条提供支持,-p有时可能有点笨拙.我使用Magit,一种Emacs模式,对于使用Git非常有帮助.在Magit中,您可以运行magit-status,找到要恢复的更改的差异,选择您想要还原的行(或者只是将光标放在想要还原的块上,如果您想要一次还原一个块而不是一次一行),然后按k以恢复这些特定行.如果您使用Emacs,我强烈推荐Magit.
小智 23
git diff > patchfile
Run Code Online (Sandbox Code Playgroud)
然后编辑补丁文件并删除您不想撤消的部分,然后:
patch -R < patchfile
Run Code Online (Sandbox Code Playgroud)