更好的git add -p?

10
有时我在没有安装X Window的系统上工作,无法使用Git GUI。
有什么现成的控制台替代方案可以替代“git add -p”?
我喜欢它几乎所有的功能(比Git GUI更多),但我讨厌它不能让我看到整个图片并选择我想要查看块的顺序。这是Git GUI对我而言唯一的实际优势,但它相当重要。
我尝试过tig,但我不喜欢它提供的用户体验。
有任何建议吗?

你是否知道 'g' 命令?虽然不是最理想的方法,但它可以给你提供所有补丁块的列表,并且让你移动到特定的块(实际上允许你选择顺序)。 - William Pursell
我意识到了,但这还不够好——我需要将文件中的所有修改作为一个整体来查看,才能决定现在是否要提交它们。 - Alexander Gladysh
3个回答

19

Vim有一个插件叫做"fugitive"

编辑:这个链接的Vimcast(评论)很好,我推荐一下。我想要添加一个提示,通常不需要手动输入:diffget:diffput,因为你可以在正常/可视模式下通过按下dodp来直接完成同样的操作。

使用这个功能最好的命令似乎是:Gstatus


Vim是一个终端编辑器(也有GUI版本)

fugitive插件将简单地让您同时编辑文件的索引和工作树版本,并让您diffput / diffobtain,直到您满意。 Vim的diff模式非常复杂,并且比git add --patch更灵活/直观。

  • 滚动绑定
  • 同时进行语法高亮和单词级别的差异突出显示
  • 自动差异折叠(对未更改的区域)

您可以从这里获取fugitive插件

:he fugitive中的片段:

编辑工作树中的文件并进行一些更改。 使用|:Gdiff|打开索引版本。 在各种块上使用|do|和|dp|来将文件同步,或者使用|:Gread|来拉取所有更改。 写入索引版本以将文件暂存。


你有没有看过Fugitive?话说,我相信Emacs会有一个diff模式,因为它是一款通用编辑器。 - sehe
3
最近的一期Vimcast介绍了fugitive插件中git add --patch命令的等效操作。链接地址为:http://vimcasts.org/episodes/fugitive-vim-working-with-the-git-index/。 - Chris Johnsen

0

那么一个简单的怎么样?

git diff

要"全面了解整个情况",然后再行动。

git add -i
5

要选择您想提交的第一个文件,暂存块,然后使用下一个文件重复该过程吗?


1
那里的“5”有什么意义吗? - sehe
1
我希望能够同时完成所有这些操作。经常情况下,我在几个不同的文件中有几个未提交的一系列 hunks(每次提交一个系列)。每次都需要运行 git add -p 循环处理各个 hunks 很烦人。此外,使用 git add -i 与在 git add -p 调用中实际使用文件名相同,改善不大。 - Alexander Gladysh
@Alexander Gladysh:我不确定你的意思 - 想通过git add -i给你更多概述(例如查看更改的代码行)。是的,您必须为每个不同/下一个提交调用git add -igit commit,但这就是git的工作方式。您所说的“同时完成所有操作”具体指什么? - Markus
1
@Alexander Gladysh:那么你对我来说就没什么帮助了。我唯一能给你的提示是,改变你的编码风格,每次只做一个小的更改并在开始下一个更改之前提交它们。然后你就不需要将更改委托给不同的提交,这更符合git的理念:一次只做一件事情。进行小的提交。如果你在处理不同的东西,请为每个创建一个临时分支。相应地合并/变基它们。 - Markus
@markus:有道理,但有时候为了提交代码而打断“流程”并不实际。 - Alexander Gladysh
显示剩余2条评论

0
如果我处于与你相同的情况(一些块混合在一起,其中一些块比其他块“更重要”),我会将较小的块提交到它们自己的提交中,并留下那些“更重要”的块,以便它们不会妨碍差异或git add -i。
对于“不太重要”的块,使用易于区分的提交消息应该很容易处理它们。

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