我给出了rebase的目的。对于我,这说得通。基本上我有一个我正在研究的功能分支,我准备把它放到主分支中我会做一个rebase来将我的所有提交压缩成一个干净的一个,这样它就可以很容易地集成到master中而不会让所有的混乱历史。正确?
这是我们一直在做的事情。
我看到的问题是定期将master合并到功能分支会导致出现问题,因为现在我的功能签入中混合了一堆主分支签名。
这里的工作流程是什么?以下漫画在哪里发挥作用:
答案 0 :(得分:5)
在分支的生命周期结束时,您应该只与主服务器合并一次。功能/主题分支的想法是它只包含与功能相关的更改;当你反复合并master时,你会失去它。 (你可以阅读Junio Hamano, the git maintainer, says about branches。)
你可以进行“练习”合并,你将丢弃,并使用git-rerere
让Git自动记录你的合并分辨率,以便在你真正准备合并时可以重复使用它们。有关背景和教程,请参阅http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html。这真的很酷,因为它可以让你完成合并的工作,而无需在任何地方明确地提交它,然后当你真正准备创建合并时,“神奇地”恢复工作。因此,在最后,您可以进行一系列较小的,希望更简单的中间“练习”合并,而不是最后一次大的痛苦合并。粗略地说:
# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature
另请参阅http://progit.org/2010/03/08/rerere.html了解其他教程。
您还可以定期在master上重新设置主题分支,然后在最后进行合并。
为了处理您当前所处的情况,使用主题分支(比如名为feature
),该分支具有来自main的一系列合并以及各种正在进行的提交,最简单的方法是要做一个压缩合并以生成一个“合并”的工作树,然后在main上创建一个新的提交(或一系列提交)。例如:
git checkout master
git merge --squash feature
git commit
这将生成一个提交,表示要素头部的树状态,并合并为主。
当然,您也可以定期合并到master
进行此更改,留下feature
的杂乱历史,并在将来更干净地工作。例如,简单地
git checkout master
git merge feature
继续前进。
答案 1 :(得分:3)
如果你要改变(我建议你这样做),那么就不要与大师合并。 rebase工作流基于以下想法:主题分支包含从主要到新要素的路径,而不包含任何其他内容。当主人向前移动时,你对新功能的改变随之移动。
当您最终准备好将更改带入master时,您有两个主要选项:
最后一次重新掌握master,然后进行正常的快进合并,这实际上将你所有分支的提交逐个引入master。这保留了更细粒度的历史记录,但如果中间提交破坏了构建,那么您可能更愿意压缩它们。交互式rebase(-i)可以帮助安排这些提交。
使用merge --squash在master中进行一次包含所有分支更改的提交。
答案 2 :(得分:0)
如果您要对分支进行rebase,只要您想要“合并”更改,就可以进行rebase。在准备好将该分支“合并”为master之前,您不必进行rebase + squash。 / p>
答案 3 :(得分:0)
我相信简短的回答是:
使用git merge --squash
if:
如果您有一个功能分支,并且在工作时从另一个分支进入该分支,例如您切换到功能并定期运行git merge master以在主分支中合并。或者你正在把那个分支拉到或推到别人或像github这样的中央仓库。
使用git rebase
if:
如果您有一个功能分支,您没有推或拉其他人,并且您没有定期合并另一个分支,如上所述