如何在 GitHub 上进行快进合并?
How to do a fast-forward merge on GitHub?
所以我的一位同事试图使用 GitHub 网络界面中的“通过快进合并”选项来合并一个分支,以保持历史记录不被伪造的合并提交(master
他们合并到的分支,自从要合并的功能分支开始以来没有进展)。
有趣的是,这没有按预期工作:所有提交都有新的提交哈希。
仔细观察,合并选项似乎实际上称为“Rebase and Merge”,它似乎确实相当于 git rebase --force
,更改 Committer 信息(进行合并的人,以及合并发生的时间)。
我花了很长时间才证实我的怀疑确实是这种情况,因为我无法让 cmdline 工具向我显示功能分支上的原始提交与看似相同的提交之间的区别(具有不同的哈希值)在 master 分支上。
(最后,我发现 gitk
显示了提交的 Committer 和 Author ;在 very 端我发现我也可以通过 git log --pretty=raw
)
所以:
- 有没有办法进行“适当的”快进合并(
git rebase
没有 --force
选项)通过 GitHub 的网络界面?
- 如果不是:为什么? (我可以看到问责制的优点;例如,它回答了谁对一段给定的代码以
master
结束负责的问题)
根据 GitHub 的文档和我自己的测试,无法使用相同的提交哈希执行 fast-forward。
The rebase and merge behavior on GitHub deviates slightly from git rebase. Rebase and merge on GitHub will always update the committer information and create new commit SHAs, whereas git rebase outside of GitHub does not change the committer information when the rebase happens on top of an ancestor commit. For more information about git rebase, see the "Git rebase" chapter from the Pro Git book.
https://docs.github.com/en/github/administering-a-repository/about-merge-methods-on-github
看起来 GitHub 不支持这个——这是一个糟糕的事情。
你基本上不能 运行 使用 GitHub UI.
的原子线性提交策略(最好的)
请注意,Bitbucket 确实支持这一点,并且有更多用于设置 PR landing/integration 策略的细粒度选项。即 'Rebase, fast-forward' 选项对 target/mainline 分支进行 --ff-only
更新。它还有一个 'Rebase, merge' 选项,可以让你 运行 对目标进行变基(这样你的提交是线性的)但是使用合并提交进行集成(如果你想跟踪提交都是一个逻辑 unit/PR).
的一部分
这两个选项似乎都优于 GitHub 使用非线性合并提交的有限选项(GitHub 的 'Merge pull request' 选项)或线性变基('Rebase and merge' 选项),它确实实现了线性但会在源分支上创建重复提交,因此如果你想,总是需要在本地手动硬重置保持清洁和同步。
所以...看来是时候更换您的存储库提供商了!
可以通过命令行进行快进合并,然后将其推送到 Github。 Github 拉取请求 CLI 指令确实明确表示要使用 git merge --no-ff
,但它似乎也可以使用快进,它保留 git 提交哈希并关闭打开的拉取请求:
$ git checkout master
$ git merge your-branch # the branch which has an open pull request
$ git push
此时Github会自动检测到分支被合并,关闭pull request。如果您在 Web 浏览器中打开“拉取请求”页面,您将看到它异步地将状态更改为:"X merged commit into master", "Pull request成功合并关闭.
根据其他人写的内容,GitHub 似乎不支持通过他们的网络 UI。我也不知道该怎么做。它适用于命令行,就像其他人提到的那样 (git merge --ff-only ...
),但似乎没有 UI 等价物。
对于提及竞争产品,我深表歉意,Gitea。 Gitea 有一个非常相似的 UI 和 GitHub,并且 UI 有相同的三种合并 PR 的方法。然而,第三个标记为 ("Rebase and merge") 与 GitHub 不同,如果不需要 rebase,它将自动进行快进合并。它只是工作。这就是为什么我不清楚为什么你不能在 GitHub.
上这样做
另一种方法是设置 Fast Forward PR GitHub 操作:
Merge pull request using fast forward only, if possible, moving base
branch (target branch) to head branch (source branch). Comment success
or failure messages on the pull request issue. The goal is to keep
branches equal at the end of the merge.
所以我的一位同事试图使用 GitHub 网络界面中的“通过快进合并”选项来合并一个分支,以保持历史记录不被伪造的合并提交(master
他们合并到的分支,自从要合并的功能分支开始以来没有进展)。
有趣的是,这没有按预期工作:所有提交都有新的提交哈希。
仔细观察,合并选项似乎实际上称为“Rebase and Merge”,它似乎确实相当于 git rebase --force
,更改 Committer 信息(进行合并的人,以及合并发生的时间)。
我花了很长时间才证实我的怀疑确实是这种情况,因为我无法让 cmdline 工具向我显示功能分支上的原始提交与看似相同的提交之间的区别(具有不同的哈希值)在 master 分支上。
(最后,我发现 gitk
显示了提交的 Committer 和 Author ;在 very 端我发现我也可以通过 git log --pretty=raw
)
所以:
- 有没有办法进行“适当的”快进合并(
git rebase
没有选项)通过 GitHub 的网络界面?--force
- 如果不是:为什么? (我可以看到问责制的优点;例如,它回答了谁对一段给定的代码以
master
结束负责的问题)
根据 GitHub 的文档和我自己的测试,无法使用相同的提交哈希执行 fast-forward。
The rebase and merge behavior on GitHub deviates slightly from git rebase. Rebase and merge on GitHub will always update the committer information and create new commit SHAs, whereas git rebase outside of GitHub does not change the committer information when the rebase happens on top of an ancestor commit. For more information about git rebase, see the "Git rebase" chapter from the Pro Git book.
https://docs.github.com/en/github/administering-a-repository/about-merge-methods-on-github
看起来 GitHub 不支持这个——这是一个糟糕的事情。 你基本上不能 运行 使用 GitHub UI.
的原子线性提交策略(最好的)请注意,Bitbucket 确实支持这一点,并且有更多用于设置 PR landing/integration 策略的细粒度选项。即 'Rebase, fast-forward' 选项对 target/mainline 分支进行 --ff-only
更新。它还有一个 'Rebase, merge' 选项,可以让你 运行 对目标进行变基(这样你的提交是线性的)但是使用合并提交进行集成(如果你想跟踪提交都是一个逻辑 unit/PR).
这两个选项似乎都优于 GitHub 使用非线性合并提交的有限选项(GitHub 的 'Merge pull request' 选项)或线性变基('Rebase and merge' 选项),它确实实现了线性但会在源分支上创建重复提交,因此如果你想,总是需要在本地手动硬重置保持清洁和同步。
所以...看来是时候更换您的存储库提供商了!
可以通过命令行进行快进合并,然后将其推送到 Github。 Github 拉取请求 CLI 指令确实明确表示要使用 git merge --no-ff
,但它似乎也可以使用快进,它保留 git 提交哈希并关闭打开的拉取请求:
$ git checkout master
$ git merge your-branch # the branch which has an open pull request
$ git push
此时Github会自动检测到分支被合并,关闭pull request。如果您在 Web 浏览器中打开“拉取请求”页面,您将看到它异步地将状态更改为:"X merged commit into master", "Pull request成功合并关闭.
根据其他人写的内容,GitHub 似乎不支持通过他们的网络 UI。我也不知道该怎么做。它适用于命令行,就像其他人提到的那样 (git merge --ff-only ...
),但似乎没有 UI 等价物。
对于提及竞争产品,我深表歉意,Gitea。 Gitea 有一个非常相似的 UI 和 GitHub,并且 UI 有相同的三种合并 PR 的方法。然而,第三个标记为 ("Rebase and merge") 与 GitHub 不同,如果不需要 rebase,它将自动进行快进合并。它只是工作。这就是为什么我不清楚为什么你不能在 GitHub.
上这样做另一种方法是设置 Fast Forward PR GitHub 操作:
Merge pull request using fast forward only, if possible, moving base branch (target branch) to head branch (source branch). Comment success or failure messages on the pull request issue. The goal is to keep branches equal at the end of the merge.