如何在GitHub上进行快进合并?

如何在GitHub上进行快进合并?,github,git-merge,fast-forward,Github,Git Merge,Fast Forward,因此,我的一位同事尝试在web界面中使用GitHub的“通过快进合并”选项合并分支,以保持历史记录不受虚假合并提交的影响(他们合并到的主分支自待合并功能分支启动以来一直没有进展) 有趣的是,这并没有像预期的那样起作用:所有的提交都有新的提交散列 仔细观察,似乎合并选项实际上被称为“Rebase和merge”,它实际上似乎做了与git Rebase--force相当的事情,更改了提交者信息(包括进行合并的人和合并发生的时间) 我花了相当长的时间来证实我的怀疑,事实确实如此,因为我无法使用cmdli

因此,我的一位同事尝试在web界面中使用GitHub的“通过快进合并”选项合并分支,以保持历史记录不受虚假合并提交的影响(他们合并到的
分支自待合并功能分支启动以来一直没有进展)

有趣的是,这并没有像预期的那样起作用:所有的提交都有新的提交散列

仔细观察,似乎合并选项实际上被称为“Rebase和merge”,它实际上似乎做了与git Rebase--force相当的事情,更改了提交者信息(包括进行合并的人和合并发生的时间)

我花了相当长的时间来证实我的怀疑,事实确实如此,因为我无法使用cmdline工具向我展示功能分支上的原始提交与主分支上看似相同的提交(使用不同的哈希)之间的差异。 (最后,我发现
gitk
同时显示提交者和提交者;最后我发现我还可以通过
git-log--pretty=raw
获取此信息)

因此:

  • 有没有办法通过GitHub的web界面进行“正确”的快进合并(
    git rebase
    ,而不使用
    --force
    选项)
  • 如果没有:为什么?(我可以看到责任制的优点;例如,它回答了一个问题,即给定的代码最后出现在
    master
    )中,由谁负责)

根据GitHub的文档和我自己的测试,不可能使用相同的提交哈希进行快进

GitHub上的rebase和merge行为与git rebase略有不同。GitHub上的Rebase和merge将始终更新提交者信息并创建新的提交SHA,而GitHub之外的git Rebase在祖先提交之上发生时不会更改提交者信息。有关git rebase的更多信息,请参阅ProGit书籍中的“git rebase”一章


看起来GitHub不支持这一点,这是一件可怕的事情。 基本上,您无法使用Github UI运行原子的线性提交策略(最好的)

请注意,Bitbucket确实支持这一点,并且有更多细粒度选项用于设置PR登录/集成策略。也就是说,'Rebase,fast forward'选项只对目标/主线分支进行
--ff
更新。它还有一个'Rebase,merge'选项,允许您在目标上运行一个Rebase(即:使您的提交是线性的),但使用合并提交进行集成(如果您希望跟踪提交都是一个逻辑单元/PR的一部分)


这两个选项似乎都优于Github的有限选项,即使用非线性合并提交(Github的'merge pull request'选项)或线性重新基('rebase and merge'选项),后者确实实现了线性,但在源分支上创建了重复提交,因此,如果你想保持事物的整洁和同步,总是需要手动硬复位


所以。。。看来是时候换一家回购提供商了

可以通过命令行进行快进合并,然后将其推送到Github。Github pull request CLI指令确实明确指出要使用
git merge--no ff
,但它似乎也可以使用快进,这将保留git提交哈希并关闭打开的pull请求:

$ git checkout master
$ git merge your-branch # the branch which has an open pull request
$ git push

此时,Github将自动检测到分支已合并,拉请求将关闭。如果您在web浏览器中打开了“pull request”页面,您将看到它异步地将状态更改为:“X merged commit to master”,“pull request已成功合并并关闭”。

“因此,如果您希望保持事物干净和同步,则始终需要在本地手动硬重置”好的,我刚刚理解这个问题。这太可怕了!嗯,我明确地问如何“通过GitHub的web界面”实现这一点。(为了完整性起见,您提到github明确承认此类合并是件好事)事实上,当主分支受到保护时,这甚至是不可能的。因此,必须手动执行这些步骤不仅仅是一件麻烦事,有时这些步骤甚至是不可能的。@m-d我也担心分支保护会阻止我使用这个答案中的建议。然而,经过一些实验,我发现分支保护可以与此共存。@bain我很高兴您提供了完整的答案。它让我尝试了这个CLI方法,我原本以为它会被我的分支保护阻止。但它与分支保护共存!我的保护设置是:
要求在合并前通过状态检查
要求分支在合并前更新
,以及
包括管理员
。。。但是,只要我正在推送的提交是状态检查确实已经通过的PR的一部分,我就可以直接推送到受保护的分支。这对我来说是个好消息。