2015-11-03 100 views
2

我们的R & D与两个中央回购站合作,最初由非常顽固的智能人开始,一个与rebase合作,另一个与gitflow和merge合作。尽管我在使用合并时非常舒服,并且我发现大多数github项目都使用这种模式,但随着我们转向更有组织的Gerrit代码审查系统,许多开发人员正在向我们从其他团队回购。将团队从Git Merge切换到Rebase

所以现在是这样的:我被man页面警告过,永远不要混合重新绑定和合并,现在我必须切换整个团队。我想知道如何做到这一点,没有太多的风险,我们的代码的稳定性。人们总是有一个开放的功能分支或两个,并在开发过程中可能会从开发多次合并。这样的功能分支是否可以切换到重新绑定,或者是否应该在所有功能分支先合并并且没有分支存在并且自叉的历史合并到他们的历史记录之后才开始截止日期?我如何规划这个平稳过渡?

回答

1

在我看到的混合合并和重新绑定中的主要问题是,当你做一个rebase时,它会将历史“线性化”,而这对于合并提交并不能很好地工作。但线性化本身实际上具有其自身的优点,因为历史变得更简单并且更容易推理。

最简单的策略是确实避免合并。在此之前,人们会早些说git merge X而不是git rebase X

这并没有那么糟糕,除非在本地分支中有多个提交,并且其中一个提交了rebase时的合并冲突。进一步提交到同一个地点可能会一次又一次地产生相同的合并冲突。在这种情况下,解决方法可能是中止重新分配git rebase --abort并重新排列本地提交git rebase --interactive或压缩本地提交(git reset $(git merge-base HEAD X))。之后重复rebase。

在进行rebase之前应特别注意共享分支机构。重订那些在人力同步将是必需的,许多人可能会倾向于避免不惜一切,见下图:

另一种方法是接受合并从上游开发过程中和合并后/让拉之前做壁球请求,例如:

git checkout -b Work 
#work...commit...commit.. 
git merge X 
#work...commit...commit.. 
git merge X 
git reset X && git add . && git commit -m 'All my work squashed' 
#alternatively the last part might be like this: 
git checkout X && git merge --squash Work 

这种方法的好处在于,你可以有这样的分支没有人际交往的开销相对安全地共享信息。在合并两个分支时解决冲突通常比在另一个分支上重放一个分支时更容易。

+0

P.S.希望你们在考虑转向Gerrit时知道你在做什么。 –

+0

我希望我对此有发言权,这是一家重要的国际公司,我们从上面获得了这一要求。到目前为止,我们一直在使用Atlassian Stash,但我们需要稍微严格的代码审查规则。在某些情况下,Gerrit可能是一种矫枉过正的情况,那是你的建议? – Ira

+0

根据我的经验,Gerrit倾向于成为一种失能而非启用工具。 –

1

我认为你需要理解并使用merge和rebase来使用git(特别是在gerrit中)。

一些例子...

你会当你提升你的功能分支到一个新的远程主合并。这提供了最小的提升工作,并且很容易遵循例如gitk的功能开发历史。

git fetch 
git checkout origin/my_feature 
git merge origin/master 
git commit 
git push origin HEAD:refs/for/my_feature 

当你准备送你将合并提交(与因为没有合并提交被允许在master--squash选项)。

git fetch 
git checkout origin/master 
git merge --squash origin/my_feature 
git commit 
git push origin HEAD:refs/for/master 

当交付承诺你会失败,重订无论出于何种原因集成和你需要更新它推向一个新的远程主。

git fetch 
git fetch <gerrit link> 
git checkout FETCH_HEAD 
git rebase origin/master 
git push origin HEAD:refs/for/master