首页 > 解决方案 > GitHub 拉取请求与 Git 命令行合并

问题描述

处理和关闭拉取请求时,您有三个合并选项 Create a merge commitSquash and mergeRebase and merge。我想知道这些选项如何转化为实际的 Git 命令——尤其是关于--no-ff.

合并对话框列出了这两个(第 1 步和第 2 步)示例:

git fetch origin
git checkout -b develop origin/develop
git merge master

和:

git checkout master
git merge --no-ff develop
git push origin master

但我很困惑,因为这些是所有三个选项的相同示例。这不可能。所以我想我只是误解了这里的用户界面。

Git 的命令是什么,并且--no-ff在任何地方都可以使用?

标签: gitgithubmergepull-request

解决方案


处理和关闭拉取请求时,您有三个合并选项Create a merge commitSquash and mergeRebase and merge。我想知道这些选项如何转化为实际的 Git 命令——尤其是关于--no-ff.

  • GitHub“进行合并”按钮对应于:

    git checkout <branch>
    git merge --no-ff -m <message> <commit-hash>
    

    message部分是您必须手动生成的,因为您的本地 Git 不知道拉取请求的详细信息(其编号和任何其他存储库)。该branch部分是您的目标分支:合并完成后您希望合并提交的分支。

    请注意,commit-hash此时您的存储库中必须具有指定的提交对象。GitHub 的幕后操作意味着它GitHub 上的 Git 存储库中可用,但它在该存储库中的refs/pull/引用而不是分支名称下列出。

  • GitHub的“squash and merge”按钮对应于:

    git checkout <branch>
    git merge --squash <commit-hash>
    git commit
    

    git commit因为命令行--squash标志打开了命令行标志,所以需要--no-commit

  • GitHub 的“rebase and merge”按钮大致对应于:

    # maybe: create a branch name (consider using git checkout -b next)
    git checkout <commit-hash-or-branch-name>
    git rebase <branch>
    git checkout <branch>
    git merge --ff-only <hash-or-name>
    # maybe: delete a branch name
    

    这是最复杂的一个:commit-hash-or-name要么是您将提供给其他两个的提交哈希 ID,要么是标识该提交哈希 ID 的分支名称,最好是您在此操作期间刚刚编造的临时名称。然后git rebase操作必须自己成功——否则,GitHub 本身不会为您提供执行 rebase-and-merge 的能力。

    如果变基操作成功并且您选择使用分离的 HEAD 执行此操作您现在必须保存变基提交的哈希 ID。如果您选择使用一些临时分支名称来执行此操作,则此时不需要任何特别的东西。

    现在原始提交链已被 rebase 操作复制,现在git checkout要通过快进更新并运行该git merge --ff-only操作的分支。您在此处提供的名称或哈希 ID 是成功的 rebase 操作生成的,或者作为分离的 HEAD 的尖端,或者更新为临时分支名称。

    如果您使用了临时分支名称,您现在应该删除该临时分支名称。


推荐阅读