小编典典

撤消 git 中的部分未分级更改

all

如何撤消 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

git commit --interactive这行得通,但如果有类似的东西只用于恢复更改,那就太好了。有更好的方法吗?


阅读 80

收藏
2022-08-29

共1个答案

小编典典

您可以使用git checkout -p,它允许您从工作副本和索引之间的差异中选择单独的块来恢复。同样,git add -p允许您选择要添加到索引的块,并git reset -p允许您从索引和 HEAD 之间的差异中选择单个块以退出索引。

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

如果您希望事先对 git 存储库进行快照以在还原它们之前保留这些更改,我喜欢这样做:

$ git stash; git stash apply

如果你经常使用它,你可能想给它起别名:

[alias]
    checkpoint = !git stash; git stash apply

如果您使用良好的编辑器模式或插件,恢复单个块或行会更容易,它可以支持直接选择要恢复的行,因为-p有时使用起来有点笨拙。我使用Magit,这是一种
Emacs 模式,对使用 Git 非常有帮助。在 Magit 中,您可以运行magit- status,找到要还原的更改的差异,选择要还原的行(或者,如果您想一次还原一个大块,则只需将光标放在要还原的大块上,而不是一次一行),然后按k恢复那些特定的行。如果你使用
Emacs,我强烈推荐 Magit。

2022-08-29