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

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


当前回答

您可以使用:

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工具-交互式暂存

其他回答

对于使用Git扩展的用户:

在提交窗口中,选择要部分提交的文件,然后在右窗格中选择要提交的文本,然后右键单击所选内容并从上下文菜单中选择“暂存选定行”。

您可以使用:

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工具-交互式暂存

gitgui在diff视图下提供了此功能。只需右键单击您感兴趣的行,就会看到一个“stage this line to commit”菜单项。

就像jdsumsion的答案一样,你也可以隐藏你当前的工作,但然后使用像meld这样的困难工具从隐藏中提取所选的更改。这样,您甚至可以非常容易地手动编辑大块,这在gitadd-p中有点麻烦:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

如果代码仍然有效,那么使用stash方法可以在提交之前进行测试。

git-cola是一个很棒的GUI,并且内置了这个功能。只需选择要分段的行,然后按S。如果没有选择,则将分段完整的大块。