协慌网

登录 贡献 社区

在 Git 中只提交文件的一部分

当我在 Git 中更改文件时,如何只提交一些更改?

例如,我怎样才能在文件中更改的 30 行中只提交 15 行?

答案

你可以使用git add --patch <filename> (或简称-p ),git 将开始将你的文件分解为它认为合理的 “帅哥”(文件的一部分)。然后它会提示您这个问题:

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

以下是每个选项的说明:

  • y为下一次提交暂存这个大块头
  • n不要为下次提交暂存此块
  • Q退出; 不要把这个大块头或任何剩下的帅哥分开
  • 这个大块头和后来所有人都在文件中的一个阶段
  • d不要在文件中放置这个大块或任何后来的帅哥
  • g选择一个大块去
  • /搜索与给定正则表达式匹配的块
  • j离开这个大块未定,看下一个未定的大块头
  • J离开这个大块未定,看下一个大块头
  • k离开这个大块未定,看到先前未定的大块头
  • K离开这个大块未定,看到前一个大块头
  • 分裂当前大块成更小的厚片
  • e手动编辑当前的大块头
  • 打印厚片帮助

如果文件尚未存储在存储库中,则可以先执行git add -N <filename> 。之后你可以继续使用git add -p <filename>

之后,您可以使用:
git diff --staged以检查您是否进行了正确的更改
git reset -p to unstage 错误地添加了帅哥
git commit -v在编辑提交消息时查看您的提交。

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

参考未来: https//git-scm.com/book/en/v2/Git-Tools-Interactive-Staging

你可以使用git add --interactivegit add -p < <em>file</em> > ,然后使用git commit而不是 git commit -a ); 请参阅git-add联机帮助页中的交互模式 ,或者只需按照说明操作。

Modern Git 还有git commit --interactive (和git commit --patch ,它是交互式提交中 patch 选项的快捷方式)。

如果您更喜欢从 GUI 进行,可以使用git-gui 。您只需标记要包含在提交中的块。我个人觉得比使用git add -i更容易。其他 git GUI,如 QGit 或 GitX,也可能具有此功能。

git gui在 diff 视图下提供此功能。只需右键单击您感兴趣的行,您就会看到 “暂存此行提交” 菜单项。