如何在git中管理合并和重新定位?

时间:2010-12-02 16:35:28

标签: git merge rebase

我给出了rebase的目的。对于我,这说得通。基本上我有一个我正在研究的功能分支,我准备把它放到主分支中我会做一个rebase来将我的所有提交压缩成一个干净的一个,这样它就可以很容易地集成到master中而不会让所有的混乱历史。正确?

这是我们一直在做的事情。

  1. 创建功能分支
  2. 在构建功能时添加一堆提交
  3. 定期将主分支合并到功能分支中(以避免在路上发生痛苦的合并)
  4. 完成所有操作后,将功能分支合并为主
  5. 我看到的问题是定期将master合并到功能分支会导致出现问题,因为现在我的功能签入中混合了一堆主分支签名。

    这里的工作流程是什么?以下漫画在哪里发挥作用:

    • git rebase -i Head ^#
    • git rebase master
    • git merge master
    • GIT-rerere
    • git reset --hard HEAD ^

4 个答案:

答案 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时,您有两个主要选项:

  1. 最后一次重新掌握master,然后进行正常的快进合并,这实际上将你所有分支的提交逐个引入master。这保留了更细粒度的历史记录,但如果中间提交破坏了构建,那么您可能更愿意压缩它们。交互式rebase(-i)可以帮助安排这些提交。

  2. 使用merge --squash在master中进行一次包含所有分支更改的提交。

答案 2 :(得分:0)

如果您要对分支进行rebase,只要您想要“合并”更改,就可以进行rebase。在准备好将该分支“合并”为master之前,您不必进行rebase + squash。 / p>

答案 3 :(得分:0)

我相信简短的回答是:

使用git merge --squash if:

如果您有一个功能分支,并且在工作时从另一个分支进入该分支,例如您切换到功能并定期运行git merge master以在主分支中合并。或者你正在把那个分支拉到或推到别人或像github这样的中央仓库。

使用git rebase if:

如果您有一个功能分支,您没有推或拉其他人,并且您没有定期合并另一个分支,如上所述