如何避免GitHub/BitBucket上的merge-commit地狱

Nik*_*as9 88 git github bitbucket

在我们的回购中,我们最终会收到很多这样的提交:

Merge branch 'master' of bitbucket.org:user/repo
Run Code Online (Sandbox Code Playgroud)

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

无论如何要避免这种合并提交地狱混乱所有的回购日志?在以某种方式启动拉取请求时可以避免它们吗?

我知道如果仅在我的本地VM中完成,我可以执行git rebase,GitHub/BitBucket UI中是否有任何等价物?

你们是怎么做到的?

Tod*_*obs 122

合并之前的Rebase功能分支

如果要避免合并提交,则需要确保所有提交都是快进的.这样做是为了确保您的功能分支在合并之前干净地重新定位到您的开发线上,如下所示:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo
Run Code Online (Sandbox Code Playgroud)

Rebase还有很多标志,包括带有-i标志的交互式变基,但是如果你保持尽可能简单并想要在合并时保留所有分支历史记录,则可能不需要.

使用--ff-only标志

除了变基,使用该--ff-only标志将确保只允许快进提交.如果它将是合并提交,则不会进行提交.git-merge(1)手册页说:

--ff只

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

  • @CodeGnome不称它为"诉诸"CLI ...实际上你应该警告"诉诸"UI! (16认同)
  • 感谢rebase和--ff-only建议.但是,如我的问题所述,我如何在GitHub/BitBucket的UI中执行此操作? (3认同)
  • @Niklas我很确定你需要求助于CLI来做你想做的事.GitHub没有暴露Git的全部功能; 只是其功能的一部分,加上一些图形和社交网络增值.祝好运! (3认同)
  • 这个过程需要注意的一点是,在将主题分支(feature/foo)合并回master之前,你最好git pull origin master(如果使用远程),以确保master分支是最新的.如果找到更新,请务必再次将master重新绑定到主题分支,然后再将其合并回master. (3认同)

Kon*_*aka 12

“Todd A. Jacobs”已经提到“rebase”是这里的概念。这只是一种更详细的做事方式。

假设你在 master 分支上

$ git branch
  * master
Run Code Online (Sandbox Code Playgroud)

你想要修复,所以创建一个从 master 分支的“fixbranch”

$ git checkout -b fixbranch
Run Code Online (Sandbox Code Playgroud)

也许你会在这个分支上工作几天并有几次提交。

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

$ git checkout master
$ git pull origin master
Run Code Online (Sandbox Code Playgroud)

使用 master 重新定位您的 fixbranch 以拥有干净的历史记录并解决本地存储库本身中的冲突(如果有)。

$ git checkout fixbranch
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

现在 fixbranch 已更新到中央主分支,让我将 fixbranch 合并到主分支

 $ git checkout master
 $ git merge fixbranch
Run Code Online (Sandbox Code Playgroud)

我受够了!让我把本地master推到中央master

$ git push origin master
Run Code Online (Sandbox Code Playgroud)

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