我从 master 分支出来并在我的新分支 branchA 中工作,我在 branchA 中进行了一些提交,然后不时将 master 合并到 branchA 中,以使其与最新更改保持同步。现在我想在合并到 master 之前将我的提交压缩成一个提交,我该怎么办?我知道git merge --squash
可以压缩提交。但是,我现在不想合并它,因为我正在等待代码审查批准。使用 rebase 也不好,因为我将 master 合并到 branchA,我想知道是否有任何好的方法来压缩提交。谢谢!
1 回答
更新:在最后添加了关于branch
已推送案例的评论
所以你有了
X --- X --- X --- X --- X <--(master)
\ \
A --- B --- M1 --- C <--(branch)
听起来,一旦你完成了,你就会喜欢
X --- X --- X --- X --- X --- ABC <--(master)
但你还没有准备好放在ABC
树枝上master
。
我假设 , A
,B
和M1
从未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
,B
和C
commits 已经被推送了。如果这是真的,那么任何压扁它们的技术都有缺点。
在这种情况下,我最好的建议是按原样合并,在合并提交上写一个好的提交消息,并在查看历史记录时使用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 ),如果他们合并(进一步更改)branch
到master
.
branch
您可以使用“我们的”策略或其他东西来展示 Git是...的祖先的后续合并,master
但在那时,您还不如从一开始就进行正常的合并,因为该合并将绘制A
,B
和C
进入默认日志历史记录,master
就像普通合并一样(即,您可以使用排除它--first-parent
)。
同样,所有这些都可以管理;但这是不必要的麻烦,这就是为什么最佳实践是:一旦提交被共享,就让它成为历史的一部分。