9

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

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

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

提前致谢!

4

2 回答 2

3

这是一种方法:

  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或者你工作的任何分支上运行它。
  • 如果您有多个长期存在的分支,则这种方法不会很好地工作。
于 2016-11-03T19:25:07.193 回答
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

于 2014-12-03T02:13:58.570 回答