如何避免在GitHub / BitBucket上进行合并提交地狱


100

我们在回购中最终有很多这样的提交:

Merge branch 'master' of bitbucket.org:user/repo

每当开发人员将他/她的本地fork同步到顶级仓库时,就会发生这种情况。

无论如何,有没有避免此合并提交地狱使所有回购日志混乱的问题?以某种方式发起请求时,可以避免它们吗?

我知道如果仅在本地VM中完成此操作,就可以执行git rebase,GitHub / BitBucket UI中是否有任何等效项?

你们是如何做到的?

Answers:


135

在合并之前重新设置功能分支

如果要避免合并提交,则需要确保所有提交都是快速进行的。为此,请确保在合并之前像这样将功能分支清楚地重新建立到开发的基础上:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase也有很多标志,包括与-i标志的交互式重定基准,但是如果您要使事情尽可能简单并希望在合并时保留所有分支历史记录,则可能不需要。

使用--ff-only标志

除了重新设置基准外,使用--ff-only标志还将确保仅允许快速提交。如果它是合并提交,则不会进行提交。git-merge(1)手册页显示:

--ff仅

拒绝合并并以非零状态退出,除非当前的HEAD已经是最新的,或者可以将合并解析为快进。


1
这是一个很好的答案。我尽量使用rebase。我不知道--ff-only标志。太酷了!
Leo Correa

3
感谢您提供基础和仅--ff的建议。但是,正如我的问题中所述,如何在GitHub / BitBucket的UI中执行此操作?
Niklas9年

3
@Niklas我很确定您将需要使用CLI来完成所需的操作。GitHub并未展示Git的全部功能;只是其功能的子集以及一些图形和社交网络的增值。祝好运!
托德·雅各布斯

3
此过程要注意的一件事是,在将主题分支(功能/ foo)合并回master之前,最好git pull origin master(如果使用远程),以确保master分支是最新的。如果找到更新,请确保在将母版合并回母版之前,再次将母版重新建立到主题分支上。
chikamichi

19
@CodeGnome不要称其为对CLI的“重新排序” ...实际上,您应该警告有关对UI的“重新排序”!
Droogans 2014年

9

这里已经提到“重新设置”的“ Todd A. Jacobs”是这个概念。这只是一种更详细的处理方式。

假设您在master分支上

$ git branch
  * master

您要进行修复,因此创建一个从母版分支出来的“ fixbranch”

$ git checkout -b fixbranch

也许您会在该分支上工作几天,并进行了几次提交。

您想将提交推送到中央主存储区的那一天!结帐母版,并从中央母版存储库获取最新更改

$ git checkout master
$ git pull origin master

将修补程序分支与主服务器重新建立基础,以保持干净的历史记录,并解决本地存储库本身中的任何冲突。

$ git checkout fixbranch
$ git rebase master

现在,fixbranch已与中央master一起更新,让我将fixbranch合并到master分支中

 $ git checkout master
 $ git merge fixbranch

我受够了!让我把本地主人推向中央主人

$ git push origin master

https://git-scm.com/book/zh/v2/Git-Branching-Rebasing


我很欣赏这个答案。
lasec0203
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.