stash部分文件 - git部分提交




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

git-cola是一个很棒的GUI,内置了这个功能。 只需选择要分段的线条并按下S. 如果没有选择,则完成整个大块。

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

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


vim-gitgutter插件可以在不离开vim编辑器的情况下使用

:GitGutterStageHunk

除此之外,它还提供了其他很酷的功能,如某些现代IDE中的diff标志列

如果只有部分hunk应该上演fugitive

:Gdiff

允许视觉范围选择:'<,'>diffput:'<,'>diffget:'<,'>diffget /恢复单个线条的变化。


Intellij IDEA (我猜这个系列的所有其他产品)自v2018.1以来内置了对部分提交的支持


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


使用TortoiseGit:

右键单击该文件并使用Context Menu → Restore after commit 。 这将按原样创建文件的副本。 然后,您可以编辑文件,例如在TortoiseGitMerge中,并撤消您不想提交的所有更改。 保存这些更改后,您可以提交该文件。


值得注意的是,对于新文件使用git add --patch ,您需要首先使用git add --intent-to-add将文件添加到索引:

git add -N file
git add -p file

如果你正在使用vim,你可能想尝试一个名为fugitive的优秀插件。

您可以使用:Gdiff在工作副本和索引之间查看文件的差异,然后使用经典的vim diff命令(如dp向索引添加行或数据。 将修改保存在索引中并使用:Gcommit提交:Gcommit ,您就完成了。

非常好的介绍性截屏(参见第2部分 )。


如果您使用emacs,请查看Magit ,它为emacs提供了一个git界面。 它支持很好地分阶段 (文件的一部分)。


对于Atom用户, github包中包含git gui风格的交互式分段。 有关快捷方式,请参阅包的documentation

使用Atom允许使用具有深色背景的主题(默认情况下, git gui具有白色背景)。




就像jdsumsion的回答一样,你也可以隐藏你当前的工作,但是然后使用像meld这样的difftool从存储中提取选定的更改。 这样你甚至可以手动编辑帅哥,这在git add -p有点痛苦:

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

使用stash方法可以在提交代码之前测试代码是否仍然有效。


我强烈建议使用Atlassian的SourceTree 。 (这是免费的。)这使得这个微不足道。 您可以快速轻松地分发各个代码或各行代码。


我相信git add -e myfile是最简单的方法(至少我的偏好),因为它只是打开一个文本编辑器,让你选择你想要分段的那一行和你不选择哪一行。 关于编辑命令:

添加内容:

添加的内容由以“+”开头的行表示。 您可以通过删除它们来阻止暂存任何添加行。

删除内容:

删除的内容由以“ - ”开头的行表示。 您可以通过将“ - ”转换为“”(空格)来阻止转移它们。

修改内容:

修改后的内容由“ - ”行(删除旧内容)后跟“+”行(添加替换内容)表示。 您可以通过将“ - ”行转换为“”并删除“+”行来阻止暂存修改。 请注意,仅修改对中的一半可能会对索引引入令人困惑的更改。

关于git add每个细节都可以在git --help add


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

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

以下是每个选项的说明:

  • y为下一次提交暂存这个大块头
  • n不要为下次提交暂存此块
  • 退出 不要把这个大块头或任何剩下的帅哥分开
  • 这个大块头和后来所有人都在文件中的一个阶段
  • 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-Staginghttps://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging





git-commit