如何在git中交互式取消暂存特定的代码块?

125
在git中,如果我已经将一个文件的几个补丁放入了暂存区,那么如何交互式地取消其中一个补丁的暂存?
是否有任何替代方法可以仅取消其中的一个补丁,而不是取消整个文件的暂存,然后重新暂存我想要保留的补丁,或手动撤消工作副本中的更改,然后交互式地添加这些撤消的更改?
3个回答

172

尝试使用 git reset --patch 文件名;这应该与 git add --patch 相反,根据文档。 短形式的-p对于这两个命令也适用。


我认为我的版本没有它(它是1.6.3.3),但这看起来像是正确的答案。 - Andrew Grimm
2
在这种情况下(并且假设由于某些原因您无法升级),我建议您使用 git stash save --keep-index 保存并重置当前的工作副本更改。然后,您可以重置文件并撤消您不想要的更改。如果您首先将文件复制到某个临时位置,则可以使用 diff 保存您撤消的更改。然后,您可以再次添加文件(不需要交互式添加,因为您已经隐藏了其他不感兴趣的更改)。使用 git stash pop 获取旧更改,并使用 diff 应用您撤消的更改。相当繁琐... :-( - Aasmund Eldhuset
短格式“-p”对于这两个命令也适用。你是指git reset -p filename吗? - Nawaz
1
@Nawaz:没错 - git add -p 文件名 可以选择性地将该文件的更改提交,而 git reset -p 文件名 可以选择性地取消提交。还有 git checkout -p -- 文件名,它可以让你选择性地放弃文件中的更改。警告:addreset 中的任何一个都可以用来撤消另一个,但如果你使用这种形式的 checkout 来丢弃一个更改,你就无法再找回它了。 - Aasmund Eldhuset

4

git gui提供了一个不错的图形界面,可以交互式地暂存或取消暂存代码块或行。虽然有更漂亮/更好的图形界面客户端,但git gui很轻量级,内置且跨平台(lin、win、mac)。

https://git-scm.com/docs/git-gui

只需右键单击一个块即可暂存/取消暂存。对于行,请先突出显示行,然后右键单击。


git gui以出色的方式完成了这个任务。我想知道是否有一种非图形界面的方式,在终端上使用,比如连接到Linux服务器时。 - undefined

-1

1
对于Windows用户来说,Git扩展拥有类似美观的用户界面。 - Aasmund Eldhuset
4
git gui 内置的功能也是如此,只不过我不确定是否应该使用 "nice" 这个词。 - Tyler
1
SourceTree(Windows + Mac)也有一个漂亮的用户界面来完成这个任务。 - chrnola
我应该提到更近期的图形化Git客户端 - GitKraken非常漂亮,并支持此功能(尽管现在商业使用需要付出高昂的费用)。GitHub的GitHub Desktop是免费的,美观的,并支持轻松地暂存和取消暂存补丁。GitKraken和GitHub Desktop都是跨平台的,但都不是开源的。 - jdgregson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接