撤消git中未暂存的部分更改

asm*_*rer 153 git

如何在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.

  • 抱歉,我刚刚意识到 `git checkout` 也有一个 `-p` 标志,它完全符合您在单个命令中所要求的功能。对之前复杂的步骤表示歉意;你可以只使用`git checkout -p`。就保存东西而言,在做一些可能具有破坏性的事情之前,我经常会做一个“git stash;”。git stash apply`(或创建一个别名,将其作为`git checkpoint`或其他东西)将当前树记录在存储中,以便在出现问题时我可以返回它。 (2认同)

小智 23

git diff > patchfile
Run Code Online (Sandbox Code Playgroud)

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

patch -R < patchfile
Run Code Online (Sandbox Code Playgroud)

  • 然而,这个答案在其简单性和易用性方面尤其令人钦佩.+1 (5认同)
  • 请注意,您还可以使用“git apply -R”而不是“patch”(只是为了保持在 git 的范围内,或者在“patch”不可用的情况下) (4认同)

Dre*_*ins 5

你可以做到

git checkout master -- path/to/file
Run Code Online (Sandbox Code Playgroud)

对于要重置的每个文件.