当我对Git中的文件进行更改时,如何才能只提交部分更改?
例如,如何在文件中更改的30行中只提交15行?
当我对Git中的文件进行更改时,如何才能只提交部分更改?
例如,如何在文件中更改的30行中只提交15行?
当前回答
就像jdsumsion的答案一样,你也可以隐藏你当前的工作,但然后使用像meld这样的困难工具从隐藏中提取所选的更改。这样,您甚至可以非常容易地手动编辑大块,这在gitadd-p中有点麻烦:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
如果代码仍然有效,那么使用stash方法可以在提交之前进行测试。
其他回答
gitgui在diff视图下提供了此功能。只需右键单击您感兴趣的行,就会看到一个“stage this line to commit”菜单项。
从2018年答案的评论来看:
很遗憾,Visual Studio没有此选项。大约10年前,替代源代码控制系统Mercurial在Visual Studio中支持此功能。自从我使用Git以来,我真的很怀念它。
现在(2022年8月)支持:
Git Line登台发布!我们很高兴地宣布在Visual Studio 2022中发布Line登台支持。行分段,也称为交互式分段,使您能够在不同的提交中拆分更改的代码行。在提交更改之前,还可以使用行分段来检查更改。将更改后的代码行或代码段标记为通过分段进行审查,并在完成后提交分段的更改。通过将Visual Studio 2022更新到17.3版或更高版本,开始使用Line staging。阅读我们的Line登台文档,了解有关如何使用和自定义此功能的更多信息。
对于Atom用户,包github包括gitgui风格的交互式登台。有关快捷方式,请参阅软件包的文档。
使用Atom可以处理具有深色背景的主题(默认情况下,gitgui具有白色背景)。
您可以使用EclipseIDE,每个修改的本地文件都可以与暂存区域进行比较,在这个并排的diff视图中,您可以自由选择从本地复制到暂存区域的大块,或者相反,从暂存区域回滚本地更改。
但还有更多:),所有图形化的git客户端都会做大块分段(gitadd-p),但我知道没有人能做到这一点:直接在分段区域进行编辑,这样就可以更精细地拾取同一行或同一大块上的多个更改(甚至可以写入/删除/更新本地从未存在的内容),就像“gitadd-e”在补丁级别工作,但没有破坏补丁内容的风险。此外,由于它在diff视图中使用了常规文本编辑器,因此您可以使用语法颜色来帮助您,并且可以执行文本替换操作(更改所有缩进类型、重命名在许多地方使用的本地变量等),以便在提交“真正”更改之前开始单独提交一些重新格式化/重构,但不需要在同一提交中嵌入所有文件更改。
当然,Eclipse更面向Java,但由于其强大的gitstaging编辑器,它也可以用于其他语言。有一个基于Eclipse的免费产品,只关注git操作,名为GitEye:https://www.collab.net/downloads/giteye但使用基本的Eclipse发行版似乎维护得不太好,比如:https://www.eclipse.org/downloads/packages/release/2020-12/r/eclipse-ide-java-developers
编辑:由于IntelliJ 2020.3允许使用真正的git索引,因此现在可以像Eclipse一样直接编辑暂存区域
vim-gitgolf插件可以在不离开vim编辑器的情况下使用
:GitGutterStageHunk
除此之外,它还提供了其他很酷的功能,如一些现代IDE中的差异符号列
如果只有一部分人被安排逃亡
:Gdiff
允许视觉范围选择,然后:“<,”>diffput或:“<”>diffget暂存/还原单个行更改。