摘自git stash
的联机帮助页:
测试部分提交
您可以在以下情况下使用git stash push --keep-index 您想根据工作中的更改进行两次或更多次提交 树,并且您要在提交之前测试每个更改:
# ... hack hack hack ... $ git add --patch foo # add just first part to the index $ git stash push --keep-index # save all other changes to the stash $ edit/build/test first part $ git commit -m 'First part' # commit fully tested change $ git stash pop # prepare to work on all other changes # ... repeat above five steps until one commit remains ... $ edit/build/test remaining parts $ git commit foo -m 'Remaining parts'
命令如何仅将第一部分保留在工作目录中,而将其他部分从工作目录中删除?
git add --patch foo
将foo
添加到索引中。 (是foo
的“第一部分”吗?)
git stash push --keep-index
将所有内容存储在工作目录中,并且仅回滚工作目录,而不回滚索引
git stash pop
会将存储在其中的所有内容返回到工作目录和索引。
谢谢。
答案 0 :(得分:2)
与Mohana Rao said一样,git add --patch
并不只是添加文件。它实际上是一个中等大小的Perl脚本:
$ file $(git --exec-path)/git-add--interactive
/usr/local/libexec/git-core/git-add--interactive: Perl script text executable
,它可以通过在当前位于索引中的文件副本上运行git diff
来进行工作,而与现在位于工作树中的同一文件副本上运行。它向您呈现差异,一次提供一个差异。您可以执行很多操作,但是最简单的方法是说“插入此内容”或“跳过此内容”,如果选择“添加”,则Perl脚本eitr会应用该补丁,然后在{{ 1}},从修补的临时文件中复制实际数据。因此,现在文件的索引副本中已经添加了一个diff-hunk,并且如果您退出了交互式添加操作,然后重新开始,您将看不到添加该diff-hunk的选项,因为它不再< em>不同。
一旦您在索引中拥有了喜欢的文件,就可以准备提交了(至少从理论上来说)。现在运行git add
将会提交索引中的内容,而不是工作树中的内容。就目前而言还可以,但是索引中的内容从未经过过测试::它是通过Perl脚本进入索引的。它尚未构建和运行。那么,现在,您将如何构建和运行它?
一种方法是现在git commit
,将提交提取到其他位置,然后运行它。不过,这有点痛苦。但是git commit
已经做到了-就是这样。实际上,git stash
进行两次提交,一个提交用于保存当前索引中的内容,就像常规的git stash
一样,另一个提交用于保存工作树中的内容。现在,就像git commit
一样。 请注意,git commit -a
的许多版本中都有一个令人讨厌的错误。具体来说,它们会进行正确的索引提交,但要取决于工作树中的内容与{{1 }},有时可能会导致错误工作树提交。
由于git stash
提交了索引并保存了工作树,因此很明显Git可以用提交的索引内容来替换工作树内容。完成此操作后,您现在可以运行测试。如果它们通过了,则可以提交并使用HEAD
将其放回原处。
另请参阅How do I properly git stash/pop in pre-commit hooks to get a clean working tree for tests?