如何撤消git中未分阶段的部分更改?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我如何撤销我在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只用于还原更改。有更好的方法吗?

提问于
用户回答回答于

你可以用git checkout -p,这使你可以从工作副本和索引之间的差异中选择单个块来恢复。同样,git add -p允许选择要添加到索引中的块,以及git reset -p允许从索引之间的差异中选择单个块,并将其从索引的头到后移出索引。

$ 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有时使用起来会有点笨拙。种Emacs模式,非常有助于使用Git。在Magit,你可以magit-status,查找要还原的更改的差异,选择希望还原的行(如果希望一次还原一个块,而不是一次恢复一行,则只需将光标放在希望还原的块上),然后按下k来还原那些特定的行。如果你使用Emacs,我强烈推荐Magit。

用户回答回答于
git diff > patchfile

然后编辑修补文件并删除不想撤消的部分,然后:

patch -R < patchfile

扫码关注云+社区