Git:将Stage转换为Commit,什么是正确的工作流程?

21

我刚刚创建了一大段代码,我想将其分成几个不同的提交。
所以我可以逐个地暂存相关部分,提交,暂存,提交……直到所有更改都被提交。

缺少的部分是我如何测试是否正确拆分了提交。
比如说,那些在暂存区域中的部分至少能编译通过吗?

为了做到这一点,我必须以某种方式使我的工作树与索引(暂存区)同步,同时又不会丢失待提交的更改。

什么是正确的方法?
什么是最快的方法?

更新:
如何使用Magit实现?

2个回答

16

你可以用以下方式实现:

$ git branch task1 # first set of commit to do

当您缓慢向索引中添加某些内容时,中间分支可以记录一些中间提交,这可能会很有用。

然后尝试一个交互式会话以添加您想要的内容:

$ git add -i

添加任何时间都可以检查您添加的内容:

$ git stash --keep-index

如果编译通过,请使用git commit提交您当前的工作。如果task1尚未完成,请使用git stash pop恢复完整的工作树并重复上述步骤。一旦task1完成,您可以删除所有'task1'提交记录, 然后将所有工作合并到主分支中:
$ git checkout master
$ git merge task1
$ git branch -D task1 # no need for that intermediate branch

如果您想保留一些重要的"task1"提交历史,您可以在将"master"合并到"task1"(快进)之前,先将"task1"重新基于"master"进行变基。
最后,如果您的存储仍然包含一些正在进行中的工作,请为"task2"重复整个过程。

3
"git stash --keep-index" 就是我需要的。 - Łukasz Lew
“--keep-index” 对我来说也是新的。谢谢并点赞。 - Noufal Ibrahim
@VonC:非常好的解释。这(以及git-rebase -i)是我真正喜欢使用Git的事情之一,我经常这样做。它使您能够精心制作提交,以便它们有意义并且仅包含相关更改。 - Dan Moulding
通常情况下,你需要使用 git add -p 而不是 git add -i - Erik Kaplun

0

这是我使用的 magit 方式:

  • 使用 magit 的“u”或“s”对 hunk/文件/区域进行暂存或取消暂存以创建第一个提交的索引(也可以使用 git gui)。一旦您的索引准备好提交:
  • 使用“c”提交,编写提交消息,Ctrl-C Ctrl-C 进行提交。
  • 使用“z”后跟 << Enter>> 进行暂存,这将暂存所有更改。要获取您的更改,请在正确的 stash 条目上使用“A”。

编写测试以检查您的提交是否良好。如果需要进行任何更改,请在提交消息屏幕中提交之前按 Ctrl-C Ctrl-A 以重复操作。这将修改(完善)您最后一次提交,而不是创建新的提交。

请注意,如果您后来发现某些代码应该修改在您之前完成的提交之前,您应该将代码单独提交(带有临时摘要),然后通过“L”访问日志屏幕将它们合并到正确的提交中,然后将指针指向您想要压缩的两个提交之前,并按“E”启动“git rebase -i”会话。 重新排序提交,以便临时摘要成为目标提交的“修复”。退出缓冲区,TADA。一切都完成了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接