0

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

4

1 回答 1

2

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

所以你有了

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

听起来,一旦你完成了,你就会喜欢

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

但你还没有准备好放在ABC树枝上master

我假设 , A,BM1从未C被推过。如果这个假设是错误的,我不会用任何方法压制它们。

所以我的第一个想法是,等待代码审查,然后进行壁球合并。如果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

但是根据评论中的讨论,现在听起来A,BCcommits 已经被推送了。如果这是真的,那么任何压扁它们的技术都有缺点。

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

但是,如果您不想听从该建议,并且真的必须压制更改,那么问题就来了:任何继续工作的人branch都会遇到问题。你可以说“没有人应该这样做”,如果你的团队同意没有人会这样做,那么它就会成功。但是由于branch存在于共享存储库中,因此没有什么可以阻止它的发生;然后充其量你将不得不处理混乱的冲突解决方案。

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

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

如果您尝试推送branch它将失败(因为origin/branch无法从 访问branch)。你可以强制推送,一旦你这样做了,任何有本地branch参考的人C都会开始遇到问题。并不是说它们不能被纠正,但它可能会变得很麻烦,尤其是如果有人以错误的方式“修复”它。

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

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

现在,即使您强制删除远程origin/branch引用,其他开发人员可能将本地branch引用指向C. 而且由于该历史没有合并到master(而是ABC创建以在单个非合并提交中更新 master ),如果他们合并(进一步更改)branchmaster.

branch您可以使用“我们的”策略或其他东西来展示 Git是...的祖先的后续合并,master但在那时,您还不如从一开始就进行正常的合并,因为该合并将绘制A,BC进入默认日志历史记录,master就像普通合并一样(即,您可以使用排除它--first-parent)。

同样,所有这些可以管理;但这是不必要的麻烦,这就是为什么最佳实践是:一旦提交被共享,就让它成为历史的一部分。

于 2017-03-14T18:47:54.983 回答