当我对Git中的文件进行更改时,如何才能只提交部分更改?

例如,如何在文件中更改的30行中只提交15行?


当前回答

这个问题已经问了10年了。我希望这个答案对某人有用。正如这里的答案中所提到的,在GUI不是选项的情况下,AndrejShadura的gitcrecord工具有助于提供一个交互式窗口,我们可以在其中选择要提交的行。

按如下方式设置扩展:

git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord

cd到git repo并按如下方式调用它:

git crecord

这将带来一个交互式界面,可以使用如下所示。按下以下键将执行某些操作:

f       hunk toggle fold (arrow keys can also be used)
space   toggle hunk selection
a       toggle commit or amend
c       confirm and open commit window

显示示例用法的屏幕广播

其他回答

如果你正在使用vim,你可能想尝试一个叫做逃犯的优秀插件。

您可以使用:Gdiff查看文件在工作副本和索引之间的差异,然后使用经典的vim diff命令(如dp)将行或块添加到索引中。将修改保存在索引中,并使用:Gcommit提交,就完成了。

这里有非常好的介绍性放映(特别是第2部分)。

您可以使用:

git add --patch <filename>

或简称:

git add -p <filename>

Git会将你的文件分解成它认为合理的“大块”(文件的一部分)。然后,它将提示您以下问题:

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

以下是每个选项的描述:

你准备好下一个任务不要为下一次提交准备这个大块q退出;不要表演这个大块头或任何剩余的大块头将这个大块和所有后续大块放在文件中不要在文件中放置这个大块或任何后面的大块选择一个帅哥/搜索与给定正则表达式匹配的大块j让这个男人还没决定,看看下一个还没决定的男人J让这个男人犹豫不决,看看下一个男人让这个男人还没决定,看看之前那个还没决定的男人K让这个男人犹豫不决,看看上一个男人我们把现在的大块分成更小的大块e手动编辑当前大块然后,您可以通过用#替换+/-来手动编辑大块(谢谢veksen)? 打印大块帮助

如果文件还不在存储库中,可以先执行gitadd-N<filename>。然后,您可以继续使用gitadd-p<filename>。

之后,您可以使用:

gitdiff—暂存以检查是否暂存了正确的更改git重置-p以取消页面错误添加的大块gitcommit-v在编辑提交消息时查看提交。

注意,这与git格式补丁命令有很大不同,后者的目的是将提交数据解析为.patch文件。

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

如果是在Windows平台上,我认为gitgui是一个很好的工具,可以从未分页的文件中暂存/提交几行代码

1.愚蠢:

从未标记的更改部分选择文件右键单击需要暂存的代码块选择要提交的阶段Hunk

2.逐行:

从未标记的更改部分选择文件选择要暂存的行右键单击并选择要提交的阶段行

3.如果您想暂存除几行之外的完整文件:

从未标记的更改部分选择文件按Ctrl+T(要提交的阶段文件)所选文件现在移动到分段更改部分选择要暂存的行右键单击并选择UnStage Lines进行提交

我相信git add-e myfile是最简单的方法(至少是我的首选),因为它只需打开一个文本编辑器,让您选择要暂存的行和不暂存的行。关于编辑命令:

添加的内容:

添加的内容由以“+”开头的行表示。您可以通过删除添加行来防止暂存任何添加行。

删除的内容:

删除的内容由以“-”开头的行表示。通过将“-”转换为“”(空格),可以防止临时删除它们。

修改内容:

修改后的内容由“-”行(删除旧内容)和“+”行(添加替换内容)表示。您可以通过将“-”行转换为“”并删除“+”来防止暂存修改线请注意,仅修改其中的一半可能会对索引带来混乱的变化。

git-add的所有细节都可以在git-help-add上找到

加上前面的回答,如果您更喜欢使用命令行,输入git add-e myfile可以让您选择逐行选择要提交的内容,因为此命令将打开一个具有不同之处的编辑器,如下所示:

正如你可能知道的那样,以+开头的行是加法,以-开头的行则是删除。因此:

要不进行添加,只需删除该行。要不进行删除,只需用空格替换。

这就是git add-h所说的通过这种方式添加文件(修补文件):

添加的内容添加的内容由以“+”开头的行表示。你可以通过删除添加行来防止暂存任何添加行。删除的内容:删除的内容由以“-”开头的行表示。你可以通过将“-”转换为“”来防止临时删除(空格)。修改内容:修改的内容由“-”行表示(删除旧的内容),后跟“+”行(添加替换内容)。您可以通过将“-”行转换为“”,并删除“+”行。请注意,仅修改这对组合很可能会给指数带来令人困惑的变化。

注意:不要更改文件的内容,这不是一个好地方。只需更改删除或添加行的运算符即可。