Git交互式取消暂存文件部分或者块状内容

62

git add -p可以将修改内容暂存,git checkout -p可以交互式地丢弃修改。那么如何通过补丁的方式从索引中取消暂存的更改呢?

(我想也许git unstage -p或者git reset HEAD -p可以实现这个功能。)


你是否好奇为什么要键入“git reset HEAD -p”而不是“git unstage -p”?自1.6.5版本以来,“reset -p”命令就已经存在了。 - Josh Lee
问题应该是如何通过交互式方式取消暂存索引中的文件块。 - Hrishikesh Kadam
3个回答

80
如果我没理解错的话,你想要交互式地取消暂存 hunks?我认为 git reset -p 正好可以做到这一点。它的提示信息甚至就是 Unstage this hunk? 另外从手册中可以看到:

这意味着 git reset -p 是 git add -p 的相反操作,即你可以使用它来选择性地取消暂存 hunks。请参阅 git-add(1) 中的“交互模式”部分以了解如何操作 --patch 模式。


很遗憾我在文档中错过了这一部分。对不起,伙计们。 - Dziamid
2
@Dziamid,这一点毫不可耻。我个人认为重置应该是添加的相反操作并不明显,甚至它们被伪命名为stage/unstage也不明显。但幸运的是,你完成了提问这一重要任务!(尽管有些笨拙,因为你似乎已经知道答案)赞一个:D - Superole
这是我在Stack Overflow上找到的最好的东西!好吧...至少,它解决了我手动修复已经很长时间的问题。 - Chris Pfohl
4
好知道:反向操作会使编辑模式(e)有点奇怪。所有加号(+)行都将被取消暂存。如果您不想取消暂存,请删除加号 - 编辑模式中的文档对此并不清楚。如果您决定在编辑器中取消操作并在不保存的情况下关闭它,则结果是取消整个块的暂存,这在某种程度上是危险的。 - Daniel Alder

6

我发现这个回答在学习暂存时非常有用,所以我想修改它来操作取消暂存。由于在stackoverflow上没有找到关于“如何git取消暂存一行或部分文件”的详细回答。

如@manojlds所说,您可以使用git reset --patch <filename>(也可以使用-p代替--patch),然后Git会将您的文件拆分为它认为合理的“块”(文件部分)。

然后Git会提示您与此类似的问题:

Unstage this hunk [y,n,q,a,d,g,/,j,J,k,K,s,e,?]?

以下是各个选项的说明:
  • y:取消提交前缓存此 hunk 的更改。
  • n:将此 hunk 缓存以供下一次提交使用。
  • q:退出;不要取消提交此 hunk 或其余任何 hunks。
  • a:取消提交此 hunk 和文件中后续所有 hunks 的更改。
  • d:不要取消提交此 hunk 或文件中后续任何 hunks。
  • g:选择要转到的 hunk。
  • /:搜索与给定正则表达式匹配的 hunk。
  • j:不决定此 hunk,查看下一个未决定的 hunk。
  • J:不决定此 hunk,查看下一个 hunk。
  • k:不决定此 hunk,查看上一个未决定的 hunk。
  • K:不决定此 hunk,查看上一个 hunk。
  • s:将当前 hunk 拆分成较小的 hunks。
  • e:手动编辑当前 hunk。
  • ?:打印 hunk 帮助信息。

关于 e 手动编辑的注意事项:使用上面的编辑 (e) 模式时要格外小心,因为它并不直观。下面是一些内联的 Git 文档,我会包含并修改它们:

# To remove '+' lines, make them ' ' lines (context).
# To remove '-' lines, delete them.                
# Lines starting with # will be removed. 

为了更清晰:

  • 所有以+开头的行都是当前已暂存要添加的行,现在将被取消暂存。为了保留那些不想被取消暂存的+行 (即将它们留作已暂存的更改),请将初始+替换为一个空格。
  • 所有以-开头的行都是当前已暂存要删除的行,现在将被取消暂存。为了保留那些不想被取消暂存的-行 (即将它们留做已暂存的更改),请完全删除每一行。
  • 所有带有#的行都是注释行,不影响提交内容。
  • 也可以记住@Daniel-Alder的评论,以避免意外地取消整个巨块(hunk)。

之后,您可以使用:

  • git diff --staged检查您是否取消/暂存了正确的更改
  • git add -p暂存被错误删除的巨块(hunk)
  • git commit -v在编辑提交消息时查看您的提交。

未来参考: Git工具 - 交互式暂存


2
这是一个非常优秀的答案。特别要注意关于手动编辑的注释 - Alexar

-1

由于尚未提及且希望不是非常明显:使用VScode。

  • 从单页源代码控制差异中,突出显示要取消暂存的部分。
  • 选择右上角的三个点。应该有一个"取消暂存所选范围"选项。
  • 我觉得比"reset -p"好,因为你可以控制块的大小,例如单行。

仅在Mac上进行了测试。当前的VScode版本是1.80.1

这对我目前非常有效(对潜在的回复过时表示歉意)


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