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

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

技术背景

在使用Git进行版本控制时,有时我们不想将文件的所有更改都提交,而是只想提交其中的部分更改。Git提供了多种方法来实现这一需求。

实现步骤

1. 使用 git add --patch 命令

可以使用以下命令:

1
git add --patch <filename>

或者简写为:

1
git add -p <filename>

Git会将文件拆分为合理的“块”(hunks),然后会提示你:

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

各选项的含义如下:

  • y:将此块暂存以用于下次提交
  • n:不将此块暂存以用于下次提交
  • q:退出;不暂存此块或任何剩余的块
  • a:暂存此块以及文件中后续的所有块
  • d:不暂存此块或文件中后续的任何块
  • g:选择要跳转到的块
  • /:搜索与给定正则表达式匹配的块
  • j:不决定此块,查看下一个未决定的块
  • J:不决定此块,查看下一个块
  • k:不决定此块,查看上一个未决定的块
  • K:不决定此块,查看上一个块
  • s:将当前块拆分为更小的块
  • e:手动编辑当前块
    • 可以通过将 +/- 替换为 # 来手动编辑块
  • ?:打印块帮助信息

如果文件尚未在仓库中,可以先执行 git add -N <filename>,然后再执行 git add -p <filename>

2. 检查暂存更改

使用 git diff --staged 命令检查是否暂存了正确的更改。

3. 取消误暂存的块

使用 git reset -p 命令取消误暂存的块。

4. 提交更改

使用 git commit -v 命令在编辑提交消息时查看提交内容。

其他方法

GUI 工具

  • git-gui:可以通过右键单击想要包含在提交中的块,选择“Stage Hunk For Commit”。如果只想添加块中的某些行,可以选择这些行,右键单击并选择“Stage Lines For Commit”。
  • SourceTree:可以快速轻松地暂存代码的单个块或单个行。
  • VS Code:选择想要暂存的范围,然后使用 Git: Stage Selected Ranges 暂存它们,最后进行提交。
  • IntelliJ IDEA:自 v2018.1 起内置了对部分提交的支持。
  • Git Extensions:在提交窗口中,选择要部分提交的文件,在右窗格中选择要提交的文本,右键单击选择“Stage selected lines”。

命令行工具

  • git add -e:执行 git add -e myfile 会打开一个编辑器显示差异,通过删除以 + 开头的行可以不暂存添加的内容,将以 - 开头的行的 - 替换为空格可以不暂存删除的内容。
  • git-crecord:设置扩展后,在Git仓库中执行 git crecord 会弹出一个交互式界面,可用于选择要提交的行。
  • lazygit:一个不错的命令行GUI工具,具有选择行提交、交互式变基等功能。

编辑器插件

  • vim-fugitive:使用 :Gdiff 查看工作副本和索引之间的文件差异,然后使用 dp 等经典的vim diff命令将行或块添加到索引中,使用 :Gcommit 保存修改并提交。
  • vim-gitgutter:使用 :GitGutterStageHunk 可以在不离开vim编辑器的情况下暂存块。

核心代码

1
2
3
4
5
6
7
8
9
10
11
# 暂存部分更改
git add -p <filename>

# 检查暂存更改
git diff --staged

# 取消误暂存的块
git reset -p

# 提交更改
git commit -v

最佳实践

  • 当有大量更改时,可以先使用 git stash -u 保存当前工作状态,然后使用 git checkout -p stash 逐步选择要提交的更改,完成提交后使用 git stash pop 恢复工作状态。
  • 在使用 git add -e 手动选择要提交的行时,注意不要更改文件的内容,只更改删除或添加行的操作符。

常见问题

  • 新文件使用 git add --patch 报错:对于新文件,需要先使用 git add --intent-to-addgit add -N 将文件添加到索引中,然后再使用 git add -p
  • 使用 git add -p 时不小心误操作:可以使用 git reset -p 取消误暂存的块。

在Git中仅提交文件部分更改
https://119291.xyz/posts/2025-05-09.git-commit-partial-file-changes/
作者
ww
发布于
2025年5月9日
许可协议