我从master分支出来并在我的新分支机构A工作,我在branchA中做了一些提交,然后现在合并master到branchA以保持更新最新的更改。现在我想在合并到master之前将我的提交压缩到一个提交中,我该怎么办?我知道git merge --squash
可以压缩提交。但是,我现在不想合并它,因为我正在等待代码审查批准。使用rebase也不好,因为我将master合并到branchA中,我想知道是否有任何好方法来压缩提交。谢谢!
答案 0 :(得分:0)
更新:最后添加了关于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
提交。如果这是真的,那么用于压缩它们的任何技术都有缺点。
在这种情况下,我最好的建议是按原样合并,在合并提交上写一个好的提交消息,并在查看历史记录时使用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显示branch
是master
的祖先......但是在那一点上,你可能刚刚在一开始就做了一次正常的合并,因为合并会绘制{ {1}},A
和B
进入C
的默认日志历史记录就像普通合并一样(即为了排除它,您可以使用{{} 1}})。
同样,所有这些都可以进行管理;但这是不必要的麻烦,这就是为什么最好的做法是:一旦共享提交,允许它成为历史的一部分。