在我看到的混合合并和重新绑定中的主要问题是,当你做一个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
这种方法的好处在于,你可以有这样的分支没有人际交往的开销相对安全地共享信息。在合并两个分支时解决冲突通常比在另一个分支上重放一个分支时更容易。
P.S.希望你们在考虑转向Gerrit时知道你在做什么。 –
我希望我对此有发言权,这是一家重要的国际公司,我们从上面获得了这一要求。到目前为止,我们一直在使用Atlassian Stash,但我们需要稍微严格的代码审查规则。在某些情况下,Gerrit可能是一种矫枉过正的情况,那是你的建议? – Ira
根据我的经验,Gerrit倾向于成为一种失能而非启用工具。 –