在Git中只提交文件部分更改

3555

当我在 Git 中修改一个文件时,如何只提交其中的一部分更改?

例如,如果我在文件中修改了 30 行,我只想提交其中的 15 行,应该怎么办呢?


7
相关链接 https://dev59.com/elsW5IYBdhLWcg3wwZjG:如果您需要将一个块分成更小的块。 - Trevor Boyd Smith
6
总结:就能力而言:git gui = git add -e > git add -i -p;就方便性而言:git gui > git add -i -p > git add -e。因此:当您可以访问X时,请选择git gui。对于简单的东西和当您没有或不想使用X时,请选择git add -i -p。对于复杂的暂存操作而无需X,请选择git add -e - Penghe Geng
如果使用VSCode,请参考https://dev59.com/U3NA5IYBdhLWcg3wH6AW#65649756。 - Wenfang Du
29个回答

3

根据2018年的答案评论

可惜Visual Studio没有这个选项。
大约10年前,替代源代码控制系统Mercurial在Visual Studio内支持了这个功能。自从使用Git以来,我真的很想念它。

现在(2022年8月)已经支持:

Git Line-staging 已发布!

我们很高兴地宣布,在Visual Studio 2022中支持Line-staging。

Line-staging,即交互式暂存,使您可以将更改的行拆分为不同的提交。
Line-staging还可以在提交更改之前用于审查更改。通过将更改的行或代码部分标记为已审核,对其进行暂存并在完成后提交您的已暂存更改。

通过将Visual Studio 2022更新到17.3或更高版本,开始使用Line-staging。

VS 17.03 interactive staging -- https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/08/Line-stagingM.mp4

阅读我们的Line-staging文档,了解更多有关如何使用和自定义此功能的信息。


3
如果您使用的是Windows平台,我认为git gui是一个非常好的工具,可以从未暂存的更改文件中选择并提交几行代码。 1. 按块提交:
  • 未暂存的更改部分选择文件
  • 右键单击需要暂存的代码块
  • 选择提交块以进行提交
2. 按行提交:
  • 未暂存的更改部分选择文件
  • 选择要暂存的行/行
  • 右键单击并选择提交行以进行提交
3. 如果您想暂存整个文件,除了其中几行:
  • 未暂存的更改部分选择文件
  • 按下Ctrl+T(将文件暂存到提交)
  • 所选文件现在移动到已暂存的更改部分
  • 选择要暂存的行/行
  • 右键单击并选择取消暂存行以进行提交

3

我想将lazygit添加到工具列表中。它是一个漂亮的命令行GUI(即使不允许X转发,也可以通过ssh工作)。它具有广泛的功能(例如,选择要提交的行,交互式重置),有用的着色,并且相对简单易用。可以通过多种方式安装(go、conda、软件包管理器等)。目前仍在积极开发/维护。


截至2021年,这是最适合喜欢命令行工具/文本用户界面的人的最佳选择。 - J. B. Rainsberger

2

正如上面的一个回答所示,您可以使用以下命令进行操作:

完整命令: git add --patch filename.txt

简写命令: git add -p filename.txt

... 但是对于已经存在于您的代码库中的文件,建议您直接在提交命令中使用--patch标志(如果您正在使用足够新的git版本): git commit --patch filename.txt

... 或者,再次使用简写命令: git commit -p filename.txt

... 然后使用上述键(y/n等)选择要包含在提交中的行。


1
除了更少的错误空间,与“git add -p filename.txt”相比,这给你带来了什么好处?如果您弄错了部分文件更改,则撤消添加比撤消提交更好。 - CTMacUser
我不知道为什么,但当我说“n”时,该行会被包括...当我在第二个块上说“y”时,它也被包括。 - chovy

2
对于Emacs,还有一个名为的工具(链接)。

1

git-meld-index -- 引用自该网站:

git-meld-index 运行 meld 或任何其他 git difftool(kdiff3、diffuse 等),允许您交互式地将更改暂存到 git index(也称为 git staging area)。

这类似于 git add -p 和 git add --interactive 的功能。在某些情况下,meld 比 git add -p 更易于使用/更快。这是因为 meld 允许您,例如:

  • 查看更多上下文
  • 查看行内差异
  • 手动编辑并查看“实时”差异更新(每次按键后更新)
  • 导航到更改而无需对要跳过的每个更改说“n”

用法

在 git 存储库中运行:

git meld-index

您将看到meld(或您配置的git difftool)弹出以下内容:
左侧:临时目录,其中包含从您的工作树中复制的文件。
右侧:包含索引内容的临时目录。这也包括尚未在索引中但在工作副本中被修改或未跟踪的文件 - 在这种情况下,您将看到来自HEAD的文件内容。
编辑索引(右侧),直到满意。记得在需要保存时保存。
完成后,关闭meld,git-meld-index将更新索引以匹配您刚刚编辑的meld右侧的临时目录的内容。

1

git-cola 是一个很棒的 GUI,而且它还内置了这个功能。只需选择要暂存的行并按下 S 键即可。如果没有进行选择,则整个块都会被暂存。


1
你可以使用Eclipse IDE,每个修改过的本地文件都可以与暂存区进行比较,在这个并排的差异视图中,你可以自由选择从本地复制哪个hunk到暂存区,或者相反地,从暂存区回滚本地更改。
但还有更多:所有图形化git客户端都可以进行hunk staging(git add -p),但我所知道的没有一个可以直接在暂存区进行编辑,因此同一行或同一hunk上的几个更改可以更加精细地选择(甚至编写/删除/更新从未存在于本地的内容),就像“git add -e”在补丁级别上工作,但不会破坏补丁内容。 此外,由于它是在差异视图中的常规文本编辑器中完成的,因此你可以使用语法高亮来帮助,还可以执行文本替换操作(更改所有缩进类型,重命名在许多地方使用的本地变量等),以便在提交实际更改之前单独开始提交某些重新格式化/重构,但不会将所有文件更改嵌入到同一个提交中。

当然,Eclipse更加偏向于Java,但是由于其强大的git暂存编辑器,它也可以用于其他语言。有一个基于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一样直接编辑暂存区。


0

在所有这些工具中,我最喜欢Fork(虽然不是免费的)!

与其他工具相比,它非常流畅和优雅,点击鼠标旁边的按钮即可完成块或行暂存。

另一个选择是GitKraken,有趣但更复杂和强大!


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