我能修改git-add的hunk大小吗?

30
我有一个文件一直在编辑,后来意识到之前的几行有个错误。我很快修正了错误并想在提交之前先将其提交。幸运的是,这时可以使用 git add --patch!
然而,我只看到一个 hunk 包含了两个修改。是否有办法手动告诉 git 我需要拆成两个 hunks?

1
你是指:“如何减小默认的块大小?”吗? - Geremia
2
@Geremia 哇,递归链接! - Antony D'Andrea
谢谢你提供的有用链接,@Geremia,正是我在寻找的。Git似乎认为我的终端有更多的行数,而且在补丁模式下无法滚动。 - Tom Zych
3个回答

50

除了“y”和“n”之外,当询问您有关一块修改的内容时,您可以给出的答案之一是“s”,表示“将此块分割成较小的块”。完整的列表如下:

y - stage this hunk
n - do not stage this hunk
q - quit, do not stage this hunk nor any of the remaining ones
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

4
如果您 真的 需要控制,可以尝试使用 'e' 键直接编辑补丁。这样您甚至可以更改补丁内容(而不仅仅是选择补丁的部分)。 - Pat Notz
简而言之:为了获得更小的代码块,我使用s - Jason Kim
当我按下“s”键时,它只是不断地给我上面的列表。不确定它没有理解“s”的哪个部分。 - Antony D'Andrea
如果我想将两行相邻的内容分成两个部分,s命令无法正常工作。 - shuangwhywhy

12

git gui可以让你提交单个代码行,即使它们被其他修改过的代码行包围,你也不需要将这些代码一并提交。


2
你也可以用 Git Cola 来完成同样的操作。 - Ivan Morgillo

0

随着 Git 2.25(2020 年第一季度)的推出,“git-add--interactive” Perl 脚本转换为 C 的工作正在继续。

因此,块分割功能(使用 's' 键访问的功能)将发生变化。

请查看提交2e40831, 提交54d9d9b, 提交ade246e, 提交d6cf873, 提交9254bdf, 提交bcdd297, 提交b38dd9e, 提交11f2c0d, 提交510aeca, 提交0ecd9d2, 提交5906d5d, 提交47dc4fd, 提交80399ae, 提交7584dd3, 提交12c24cf, 提交25ea47a, 提交e3bd11b, 提交1942ee4, 提交f6aa7ec (2019年12月13日) 由Johannes Schindelin (dscho)提交。
(由Junio C Hamano -- gitster --合并于提交45b96a6, 2019年12月25日)

内置 add -p:实现块分割功能

签名者:Johannes Schindelin

如果这位开发人员的工作流程可以说明什么问题,那么Git交互式add命令中最有用的功能就是它。

注意:再次声明,这不是从Perl代码直接转换成C代码:例如,hunk_splittable()函数基本上完成了所有的分割工作,只是为了找出是否会产生多个块(然后把该结果丢到垃圾堆里)。
在C语言中,我们通过计算产生的补丁块数(而不是实际进行块分割),并将该信息存储在块中,同时在第一次解析差异时进行计算。

另一个偏差:内置的git add -p命令设计时只考虑了单个strbuf持有差异(如果请求了彩色差异,则另一个strbuf持有彩色差异),块基本上只存储指向该strbuf的起始和结束偏移量。
因此,当我们拆分块时,我们现在使用一种特殊模式,其中块标题动态生成,只有其余部分使用这种起始/结束偏移量存储。这样,我们也避免了Perl版本中块标题的频繁格式化/重新解析。


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