检查一个被压缩的Git分支是否已经合并到主分支?

10

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

然而,现在我们将所有分支压缩成一个提交再合并到主分支中。由于这会创建一个新的提交哈希值,因此我无法找到主分支和我的分支之间的公共提交。

如果我们在合并时压缩了所有分支,我该如何确定一个分支是否已经被合并了呢?

提前感谢!


1
不是非常可靠,但 git log --grep="merge $BRANCH" 或类似的命令可能会起作用,如果在进行压缩合并时将分支名称放入提交消息中。 - Andrew C
很不幸,当我们进行压缩合并时,我们并不总是在提交消息中放置分支的名称。 - Emily Xie
通过压缩,你能得到什么好处吗?你可以先通过rebase进行压缩,然后再进行正常合并。 - Andrew C
这只是已经建立的工作流程,不幸的是。 - Emily Xie
1
有两种内置的方法可以使用Git跟踪历史记录 - 一种是通过可达性,另一种是通过补丁ID。不幸的是,您的工作流程破坏了您使用这些技术的能力。 - Andrew C
2个回答

3
这里是一种方法:
  1. 使用GitHub API获取所有已合并拉取请求的HEAD SHA。
  2. 将这些SHA与本地分支进行匹配。
如果本地分支的HEAD对应于已合并的PR,则可以安全地删除它。无论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合并到主分支上的。

注意事项:

  • 您需要安装pip install pygithub才能使用此脚本。
  • 它将查找已合并到origin/(当前分支)的本地分支。因此,您需要在masterdevelop或您所使用的任何分支上运行它。
  • 如果您有多个长期存在的分支,则此方法效果不佳。

老实说,从长远来看,这是唯一的好解决方案。在繁忙的代码库上压缩合并会整天产生合并冲突。 - Erik Aronesty
我做了一些修改,使得可以使用git:// URI和私有仓库,并支持--force删除。https://gist.github.com/earonesty/4986c7009cfc289323a5fc2516320797 - Erik Aronesty

2
您可以进行实验性合并,检查是否引入了任何更改,可以按照以下方式操作:
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 上看到了进一步的冲突更改时,才能使用此方法。


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