【问题标题】:Checking if a Git branch has been merged into master when SQUASHED?在 SQUASHED 时检查 Git 分支是否已合并到 master 中?
【发布时间】:2015-01-31 08:35:35
【问题描述】:

我想自动清理远程分支。我希望能够检查一个分支是否已经合并到 master 中。最初,我的计划是使用 git merge-base 来查看最后一次常见的提交。

但是,事实证明,当我们将所有分支合并到 master 时,我们会压缩它们。由于这会创建一个新的提交哈希,我无法找到 master 和我的分支之间的共同提交。

如果我们在合并时将它们全部压缩,我该如何确定分支是否已合并?

提前致谢!

【问题讨论】:

  • 不完全可靠,但 git log --grep="merge $BRANCH" 或其他东西可能会起作用,如果您在进行壁球合并时将分支名称放在提交消息中。
  • 不幸的是,当我们进行壁球合并时,我们并不总是将分支的名称放在提交消息中。
  • 通过挤压你有什么收获吗?你总是可以先通过 rebase 压缩,然后进行正常的合并。
  • 不幸的是,这只是既定的工作流程。
  • 有 2 种内置方式可以使用 Git 跟踪历史记录 - 一种是通过可达性,另一种是通过 patch-id。不幸的是,您的工作流程破坏了您使用其中任何一种技术的能力。

标签: git github merge branch squash


【解决方案1】:

您可以进行实验性合并并检查它是否引入了任何更改,如下所示:

git checkout -b foo-merge-test-branch master
git merge --squash foo
if [ -n "$(git status --porcelain)" ]; then 
  echo "foo has not been merged";
else 
  echo "foo is already merged";
fi
git reset --hard && git checkout master && git branch -d foo-merge-test-branch

这只有在原始 git merge --squash foo 中更改的文件都没有在 master 上看到进一步的冲突更改时才有效。

【讨论】:

    【解决方案2】:

    这是一种方法:

    1. 使用 GitHub API 获取所有合并拉取请求的 HEAD SHA。
    2. 将这些 SHA 与本地分支进行匹配。

    如果本地分支的 HEAD 对应于已合并 PR 的 HEAD,那么您可以安全地删除它。无论 PR 是如何合并的(完全合并、快进、压缩和合并),这都会起作用。

    我在delete-squashed-branches 脚本中实现了这种方法。用法如下:

    (master) $ git branch
      delete-merged-prs
      fixup
      unmerged-branch
    * master
    
    (master) $ delete-squashed-branches
    Finding local branches which were merged onto origin/master via GitHub...
    warning: deleting branch 'delete-merged-prs' that has been merged to
         'refs/remotes/origin/delete-merged-prs', but not yet merged to HEAD.
    Deleted branch delete-merged-prs (was 325a42b).
    warning: deleting branch 'fixup' that has been merged to
         'refs/remotes/origin/fixup', but not yet merged to HEAD.
    Deleted branch fixup (was e54f54b).
    
    (master) $ git branch
      unmerged-branch
    * master
    

    (可以忽略警告,因为分支是通过 Squash & Merge 合并到 master 上的。)

    注意事项:

    • 您需要pip install pygithub 才能使用该脚本。
    • 它将查找合并到origin/(current branch) 的本地分支。因此,您需要在 masterdevelop 或您工作的任何分支上运行它。
    • 如果您有多个长期存在的分支,则此方法不会很好地工作。

    【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2021-05-02
    • 2020-08-01
    • 2013-01-14
    • 2021-12-14
    • 1970-01-01
    • 2016-04-30
    • 2020-07-16
    相关资源
    最近更新 更多