因此,我的一位同事试图使用GitHub的"通过快进合并";选项,以保持历史记录不受虚假合并提交的影响(自要合并的功能分支启动以来,它们合并到的master
分支没有进展)。
有趣的是,这并没有像预期的那样起作用:所有提交都得到了新的提交哈希。
仔细观察,似乎合并选项实际上被称为";回扣和合并";它似乎真的做了相当于git rebase --force
的事情,更改Committer信息(包括合并的人和合并发生的时间)。
我花了很长时间才证实我的怀疑,即事实确实如此,因为我无法使用cmdline工具来显示功能分支上的原始提交和主分支上看似相同的提交(使用不同的哈希)之间的差异。(最后,我发现gitk
同时显示提交的提交者和作者;在非常的结尾,我发现我也可以通过git log --pretty=raw
获得这些信息)
因此:
- 有没有办法做一个";适当的";通过GitHub的web界面进行快速合并(
git rebase
而不使用选项)--force
- 如果不是:为什么?(我可以看到责任制的优点;例如,它回答了谁对给定的代码段最终进入
master
负责的问题)
看起来GitHub不支持这一点——这是一件可怕的事情。您基本上无法使用GitHub UI运行原子线性提交策略(最好的策略)。
请注意,Bitbucket确实支持这一点,并且有更多细粒度的选项来设置PR落地/集成策略。即"Rebase,fast forward">选项,该选项对目标/主线分支执行--ff-only
更新。它还有一个"Rebase,merge">选项,允许您在目标上运行Rebase(这样您的提交是线性的),但使用合并提交进行集成(如果您想跟踪提交是否都是一个逻辑单元/PR的一部分)。
这两个选项似乎都优于GitHub有限的选项,即使用非线性合并提交(GitHub的‘merge pull request’选项)或线性重基准(’rebase and merge’选项),后者确实实现了线性,但在源分支上创建了重复提交,因此,如果你想保持干净和同步,总是需要在本地手动硬重置。
所以。。。似乎是时候更换回购提供商了!
可以通过命令行进行快速合并,然后将其推送到Github。Github pull-request CLI指令确实明确表示使用git merge --no-ff
,但它似乎也可以使用快进,它保留了git提交哈希并关闭打开的pull-request:
$ git checkout master
$ git merge your-branch # the branch which has an open pull request
$ git push
此时,Github将自动检测到分支已合并,拉取请求将关闭。如果你有";"拉取请求";页面在您的web浏览器中打开,您将看到它异步地将状态更改为:"X将commit合并到master中">、";Pull请求成功合并并关闭">。
根据GitHub的文档和我自己的测试,不可能使用相同的提交哈希进行快进。
GitHub上的rebase和merge行为与git rebase略有不同。GitHub上的Rebase和merge将始终更新提交者信息并创建新的提交SHA,而GitHub之外的git Rebase在祖先提交之上发生时不会更改提交者信息。有关git-rebase的更多信息,请参阅;Git rebase";Pro Git书中的第章。
https://docs.github.com/en/github/administering-a-repository/about-merge-methods-on-github
另一种选择是设置一个快进PR GitHub操作:
如果可能,仅使用快进合并拉取请求分支(目标分支)到头分支(源分支)。评论成功或者关于拉取请求问题的失败消息。目标是保持分支在合并结束时相等。
根据其他人的描述,GitHub似乎不支持通过他们的web UI实现这一点。我也没想好怎么做。它适用于命令行,就像其他提到的一样(git merge --ff-only ...
),但似乎没有等效的UI。
我很抱歉提到一个竞争产品Gitea。Gitea有一个与GitHub非常相似的UI,并且该UI有相同的三种合并PR的方法。然而,第三种方法,标记为"Rebase and merge",与GitHub不同,如果不需要重新定基,它将自动进行快速合并。它只是起作用。这就是为什么我不清楚为什么你不能在GitHub上做这件事。
GitHub Rebase被破坏了,因为与其他服务提供商(bitbucket、GitLab等)不同,即使不需要,GitHub也会在Rebase上意外重写哈希。
我使用这个解决方法在GitHub上保留签名和线性Git历史记录(如果只使用WebUI,这是不可能的)。
工作流程:
-
向主要发生请求
-
不要与UI回扣!
-
而不是从终端检查主/主和
git merge --ff-only <the pr branch> && git push
-
保留签名,似乎甚至在受保护的分支和自动关闭PR分支上也能工作。