是否绝对有必要同时处理多个错误? “一次”是指“同时为多个错误编辑文件”。因为除非您绝对需要,否则我一次只会在您的环境中处理一个错误。这样你就可以使用本地分支和变基,我发现这比管理复杂的存储/阶段要容易得多。
假设 master 在提交 B。现在处理错误 #1。
git checkout -b bug1
现在您在分支 bug1 上。进行一些更改,提交,等待代码审查。这是本地的,因此您不会影响其他任何人,并且从 git diffs 制作补丁应该很容易。
A-B < master
\
C < bug1
现在您正在处理 bug2。使用git checkout master 返回返回以掌握。创建一个新分支,git checkout -b bug2。进行更改、提交、等待代码审查。
D < bug2
/
A-B < master
\
C < bug1
让我们假设其他人在您等待审核时在 master 上提交了 E & F。
D < bug2
/
A-B-E-F < master
\
C < bug1
当您的代码获得批准后,您可以通过以下步骤将其变基为 master:
git checkout bug1
git rebase master
git checkout master
git merge bug1
这将导致以下结果:
D < bug2
/
A-B-E-F-C' < master, bug1
然后你可以推送、删除你的本地 bug1 分支,然后你就可以走了。在您的工作空间中一次出现一个错误,但通过使用本地分支,您的存储库可以处理多个错误。这避免了复杂的舞台/隐藏舞蹈。
在cmets中回答ctote的问题:
好吧,您可以为每个错误返回隐藏,一次只处理一个错误。至少可以为您节省分期问题。但是试过这个,我个人觉得很麻烦。在 git 日志图中,Stash 有点混乱。更重要的是,如果你把事情搞砸了,你就无法恢复。如果你有一个脏的工作目录并且你弹出一个存储,你不能“撤消”那个弹出。搞砸已经存在的提交要困难得多。
所以git rebase -i。
当您将一个分支变基到另一个分支时,您可以交互地进行(-i 标志)。执行此操作时,您可以选择要对每个提交执行的操作。 Pro Git 是一本很棒的书,它也是 HTML 格式的在线书籍,并且有一个很好的关于 rebase 和 squashing 的部分:
http://git-scm.com/book/ch6-4.html
为方便起见,我将逐字窃取他们的示例。假设您有以下提交历史记录,并且您想将 bug1 变基并压缩到 master 上:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
这是您在输入 git rebase -i master bug1 时将看到的内容
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
要将分支的所有提交压缩为单个提交,请将第一个提交保留为“pick”,并将所有后续“pick”条目替换为“squash”或简单的“s”。您也将有机会更改提交消息。
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
所以,是的,squashing 有点痛苦,但我仍然会推荐它而不是大量使用 stash。