在合并到master之前如何压缩提交?

时间:2017-03-14 18:35:47

标签: git merge git-squash

我从master分支出来并在我的新分支机构A工作,我在branchA中做了一些提交,然后现在合并master到branchA以保持更新最新的更改。现在我想在合并到master之前将我的提交压缩到一个提交中,我该怎么办?我知道git merge --squash可以压缩提交。但是,我现在不想合并它,因为我正在等待代码审查批准。使用rebase也不好,因为我将master合并到branchA中,我想知道是否有任何好方法来压缩提交。谢谢!

1 个答案:

答案 0 :(得分:0)

更新:最后添加了关于branch被推送的案例的评论

所以你有

X --- X --- X --- X --- X <--(master)
       \           \
        A --- B --- M1 --- C <--(branch)

听起来好像你做完了

X --- X --- X --- X --- X --- ABC <--(master)

但您尚未准备好将ABC放在master分支上。

我认为ABM1C从未被推过。如果这个假设是假的,我不会用任何方法压制它们。

所以我的第一个想法是,等待代码审查,然后进行壁球合并。如果A ... C注定要被丢弃,那么预先挤压他们会有什么不同?

但如果你因为某种原因不喜欢这样,并且真的想要预先挤压,那么如何实现这一目标:

X --- X --- X --- X --- X <--(master)
                         \ 
                           ABC <--(branch)

有几种方法可以解决这个问题。这是一个:

git checkout master
git checkout -b temp
git merge --squash branch
git branch -f branch
git checkout branch
git branch -d temp

但根据评论中的讨论,现在听起来已推送ABC提交。如果这是真的,那么用于压缩它们的任何技术都有缺点。

在这种情况下,我最好的建议是按原样合并,在合并提交上写一个好的提交消息,并在查看历史记录时使用git log --first-parent。在这种情况下,分支上的单个提交不会在日志输出中显示,并且您将看到表示整个分支的单个提交(合并本身),就像它是一个被压扁的提交一样。

但是如果你不想遵循这个建议,并且真的必须压制这些变化,那么这笔交易就是:任何继续branch工作的人都会遇到问题。你可以说&#34;没有人应该这样做#34;如果你的团队同意没有人会这样做,那么它就会解决问题。但由于branch存在于共享仓库中,所以没有什么能阻止它发生;然后充其量你将不得不处理凌乱的冲突解决方案。

假设您按照上述步骤操作;你真正拥有的是

X --- X --- X --- X --- X <--(master)
       \           \     \ 
        \           \      ABC <--(branch)
         \           \
          A --- B --- M1 --- C <--(origin/branch)

如果您尝试推送branch,则会失败(因为origin/branch无法访问branch)。您可以强制推送,只要您这样做,那么拥有指向branch的本地C引用的任何人都会遇到问题。并不是说他们无法纠正,但它可能会变得麻烦,特别是如果有人&#34;修复&#34;这是错误的方式。

你可以通过永不强迫branch来避免这种情况。您等待有机会将您的branch版本合并到母版,然后推送master并删除您的本地branch

X --- X --- X --- X --- X --- ABC <--(master)
       \           \
        A --- B --- M1 --- C <--(origin/branch)

现在,即使您强制删除远程origin/branch引用,其他开发人员可能仍然具有指向branch的本地C引用。并且由于该历史记录未合并到master(而是ABC被创建以在单个非合并提交中更新master),如果他们合并,他们将遇到麻烦(进一步更改为)branch加入master

使用策略&#34;我们的&#34;您可以通过后续合并获得聪明。或者某些东西向Git显示branchmaster的祖先......但是在那一点上,你可能刚刚在一开始就做了一次正常的合并,因为合并会绘制{ {1}},AB进入C的默认日志历史记录就像普通合并一样(即为了排除它,您可以使用{{} 1}})。

同样,所有这些都可以进行管理;但这是不必要的麻烦,这就是为什么最好的做法是:一旦共享提交,允许它成为历史的一部分。