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

12

当处理和关闭拉取请求时,你有三个合并选项:创建合并提交压缩并合并变基并合并。我想知道这些选项如何转化为实际的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 在任何地方被使用吗?

1个回答

15
在处理并关闭拉取请求时,您有三个合并选项: 创建合并提交合并和压缩变基合并。我想知道这些选项如何转换为实际的 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的“压缩并合并”按钮对应于:

  • 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 自身将不会提供重新定位和合并的功能。

    如果重新定位操作成功,而且您选择使用分离的 HEAD 进行该操作,那么您现在必须保存重新定位提交的哈希 ID。如果您选择使用某个临时分支名称进行操作,则此时不需要任何特殊操作。

    现在,由于重新定位操作已经复制了原始提交链,所以您现在应该git checkout 要更新的分支,并运行 git merge --ff-only 操作。您提供的名称或哈希 ID 是成功的重新定位操作产生的作为分离 HEAD 顶端的 ID,或者更新为临时分支名称的ID。

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


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接