此示例如何将更改分为几个提交?

时间:2019-01-24 21:48:23

标签: git

摘自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 foofoo添加到索引中。 (是foo的“第一部分”吗?)

git stash push --keep-index将所有内容存储在工作目录中,并且仅回滚工作目录,而不回滚索引

git stash pop会将存储在其中的所有内容返回到工作目录和索引。

谢谢。

1 个答案:

答案 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?