如何避免GitHub/BitBucket上的合并提交地狱

4dc9hkyq  于 2023-03-21  发布在  Git
关注(0)|答案(3)|浏览(156)

在我们的repo中,我们最终得到了很多这样的提交:

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

每当开发人员将他/她的本地fork同步到顶级repo时,就会发生这种情况。
有没有办法避免这种合并提交的地狱把所有的repo日志弄得一团糟?在启动pull请求时,能以某种方式避免它们吗?
我知道如果只在我的本地虚拟机中完成,我可以做git rebase,在GitHub/BitBucket UI中是否有任何等效功能?
你们是怎么做到的?

xxb16uws

xxb16uws1#

合并前重基特征分支

如果你想避免合并提交,你需要确保所有的提交都是快进的。你可以通过确保你的特性分支在合并之前干净地重新定基到你的开发线上来做到这一点,就像这样:

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标志的交互式rebase,但如果你想保持尽可能简单,并希望在合并时保留所有分支历史,你可能不需要它。

使用--ff-only标志

除了换基之外,--ff-only标志的使用将确保只允许快进提交。如果提交是合并提交,则不会进行提交。git-merge(1)手册页说:
--仅限ff
拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者合并可以作为快进解决。

vxf3dgd4

vxf3dgd42#

“托德A. Jacobs”已经提到“rebase”是这里的概念,这只是一种更详细的做事方式。
假设您位于master分支上

$ git branch
  * master

您希望进行修复,因此创建一个从master分支出来的“fixbranch”

$ git checkout -b fixbranch

也许你已经在这个分支上工作了几天,并提交了几次。
您想将提交推送到中央主存储库的那一天! checkout master并从中央主存储库获取最新更改

$ git checkout master
$ git pull origin master

使用master重定fixbranch的基,以获得干净的历史记录,并解决本地存储库本身中的冲突(如果有的话)。

$ git checkout fixbranch
$ git rebase master

现在fixbranch是最新的与中央主,让我合并fixbranch到主分支

$ git checkout master
 $ git merge fixbranch

我完成了!让我把本地master推到中央master

$ git push origin master

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

tvmytwxo

tvmytwxo3#

有可能:

  • branch 2合并到HEAD(又名:当前分支)
  • 而不交织/破坏提交历史(也称为:将 * 合并到 * 上而不是 * 合并到 * 中)
  • 而不创建一个 * 合并提交 *
  • 不改变(特别是不重定基)branch 2
  • 而不对[HEAD]工作树(又名: checkout 另一个分支),这将需要你清理(或手动隐藏)你的工作树和/或索引(又名:临时区域)变化。

下面是它的做法:

from="branch2" // You only have to change this line
to=HEAD
first_shared_commit="$(
  git merge-base "$to" "$from"
)"
list_of_commits_exclusively_in_from="$(
  git log --format=%H "$first_shared_commit".."$from"
)"

git cherry-pick "$list_of_commits_exclusively_in_from"

我为此创建了一个别名。我称之为git merge-quiet。您可以使用以下一行代码在.git/config中创建此别名:

git config --global --add alias.merge-quiet '!f(){ to=HEAD; from="$1"; git cherry-pick $(git log --format=%H $(git merge-base "$to" "$from").."$from"); }; f'

我相信这是最好的解决方案,因为它不需要创建一个[临时]branch 2-rebased分支来避免改变现有的branch 2。它通过在内存中 * 创建分支 *(实际上是组成分支的提交列表)来实现。
欢迎您的反馈!️️🌈🧘🏽🕉️️

相关问题