将团队从Git Merge切换到Rebase

时间:2015-11-03 09:52:33

标签: git workflow git-merge git-rebase

我们的R& D与两个中央回购合作,最初由非常顽固的聪明人开始,一个使用rebase,另一个使用gitflow和合并。虽然我很习惯使用合并,但我发现大多数github项目都使用这种模式,因为我们正在转向更有条理的Gerrit代码审查系统,并且很多开发人员都会转向我们,因此我们必须遵守“rebase”。来自其他团队的回购。

所以这就是:我被手册警告永远不要混合变形和合并,现在我必须切换整个团队。我想知道如何在不对代码的稳定性造成太大风险的情况下做到这一点。人们总是有一个或两个开放的功能分支,并且在开发期间可能多次从dev合并。是这样的功能分支可以切换到变基,或者截止日是否应该在所有功能分支首先合并并且没有分支存在于其历史记录中的合并之后才进行变换?我如何将此计划为平稳过渡?

2 个答案:

答案 0 :(得分:1)

混合合并和rebase的主要问题是,当你做一个rebase时,它会线性化"历史,这对合并提交不起作用。但是线性化本身实际上有其优点,因为历史变得更简单,更容易推理。

最简单的策略是避免合并。当一个人早先说git merge Xgit rebase X时。

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

进行折扣时的特别注意应支付给共享分支机构。在重新定位时需要人工同步,许多人宁愿完全避免它,见下文:

另一种方法是在开发过程中从上游接受合并,并在合并/制作拉取请求之前执行压缩,例如:

 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

这种方法的优点是,您可以相对安全地共享此类分支,而无需人工通信的开销。合并两个分支时比在另一个分支上重放一个分支时更容易解决冲突。

答案 1 :(得分: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

您准备交付提交时会合并(--squash选项,因为master}中不允许合并提交。

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