2010-12-02 95 views
3

我想要rebase的目的。对于我,这说得通。基本上,我有一个功能分支,我正在处理,并且已准备好将其放入主分支中,我将进行重新分配以将所有提交操作压缩到一个干净的分支中,以便它可以轻松集成到主分区中,而不会混乱历史。对?如何管理git中的合并和重新绑定?

以下是我们一直在做的事情。

  1. 创建一个特性分支
  2. 添加了一堆提交的为我们所建立的功能
  3. 主分支定期合并到功能分支(为了避免痛苦的合并的道路)
  4. 当一切完成后,合并特性分支成主

我看到的问题是,定期合并主到功能分支基础重建的时候,因为我现在有一堆马斯特会导致问题r分支checkins混入我的特色签入。

什么是正确的工作流程?在哪里以下commads开始发挥作用:

  • git的变基-i头^#
  • git的重订主
  • 混帐合并主
  • 混帐rerere
  • 的git的复位 - 硬头^

回答

5

在分支的生命周期结束时,您应该只合并一次/从主人。特征/主题分支的想法是它只包含与特征相关的更改;当你重复在主人合并时,你会失去这一点。 (你可以阅读什么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另一个教程。

您还可以定期重新绑定主分支上的主题分支,然后在最后进行合并。

为了处理一个像你目前所在的情况,与一个主要分支(称为feature),有一系列合并主要与各种正在进行的提交混合,最简单的方法是做压缩合并产生一个“合并”工作树,然后创建一个新的提交(或一系列提交)到main。例如:

git checkout master 
git merge --squash feature 
git commit 

这将产生一个单一提交表示所述树中的特征的头部的状态下,合并到主站。

当然,您也可以对此更改定期合并为master,留下当前feature的混乱历史,并且在将来更加干净地工作。例如,只需要

git checkout master 
git merge feature 

然后继续。

+0

现在我更加困惑。我从来没有听说过git-rerere。我阅读手册页,它有道理,但我失去了如何工作。所以重新绑定不仅可以压缩提交,还可以将原始分支向前移动?我很困惑。我应该在这里采用什么样的实际流程?尤其对于长时间运行的分支 – Micah 2010-12-02 16:59:06

0

如果你打算重建分支,只要你想“合并”更改就可以重新绑定。你不需要重新绑定+压扁,直到你准备好“合并”为止在分支到主人。

+0

所描述的,可以有很多工作没有rerere – 2010-12-02 20:35:29

+0

@adymitruk:那么,你所要做的就是启用rerere,然后。 – mipadi 2010-12-02 20:40:22

3

如果你打算重设(我建议你这样做),那么永远不要和主人合并。基础工作流程基于这样的想法,即主题分支包含从主要到新功能的路径,而不包含其他任何内容。随着主人向前迈进,那么您的更改将会随着新功能一起移动。

当你终于准备把变成师傅,你有两个主要选择:

  1. 对衍合高手最后一次,然后做基本上把所有正常的快进合并你的分支一个接一个地进入主控。这保留了更细粒度的历史,但是如果中间提交破坏了构建,那么您可能更喜欢压缩它们。交互式rebase(-i)可以帮助安排这些提交。

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

0

我认为简单的答案是:

使用git merge --squash如果:

,如果你有一个特性分支,并正在从另一个分支揪成,你的工作分支,比如你切换定期运行git merge master以在主分支中合并。或者你正在把这个分支拉到别人或者像github这样的中央仓库。

使用git rebase如果:

,如果你有一个特性分支,你不推或拉别人,你不合并其他分支到定期,上述