GitHub 拉取请求与 Git 命令行合并

Sem*_*mel 7 git merge github pull-request

在处理和关闭拉取请求时,您有三个合并选项 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
Run Code Online (Sandbox Code Playgroud)

和:

git checkout master
git merge --no-ff develop
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

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

tor*_*rek 9

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

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

    git checkout <branch>
    git merge --no-ff -m <message> <commit-hash>
    
    Run Code Online (Sandbox Code Playgroud)

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

    请注意,commit-hash此时您的存储库中必须具有指定的提交对象。GitHub的幕后的操纵手段,它在GitHub上的Git仓库可用,但它是一个下所列refs/pull/的参考,而不是一个分支名称,在该存储库中。

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

    git checkout <branch>
    git merge --squash <commit-hash>
    git commit
    
    Run Code Online (Sandbox Code Playgroud)

    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
    
    Run Code Online (Sandbox Code Playgroud)

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

    如果 rebase 操作确实成功并且您选择使用分离的 HEAD 执行此操作,现在必须保存 rebase 提交的哈希 ID。如果您选择使用某个临时分支名称来执行此操作,则此时不需要任何特殊内容。

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

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