2014-12-02 105 views
5

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

但是,事实证明,我们在我们将它们合并到主设备中时压缩了所有分支。由于这会创建一个新的提交散列,因此我无法在主分支和我的分支之间找到常见提交。

如何在合并时确定分支是否合并?

在此先感谢!

+0

不完全可靠,但'git log --grep =“merge $ BRANCH”'或者其他的东西可能会起作用,如果您在执行壁球合并时将分支名称放入提交消息中。 – 2014-12-03 02:23:29

+0

不幸的是,当我们进行壁球合并时,我们并不总是在提交消息中放置分支的名称。 – emilyxxie 2014-12-03 22:40:53

+0

你正在通过挤压获得什么?你总是可以通过rebase先压缩然后进行正常的合并。 – 2014-12-03 23:04:06

回答

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进一步冲突的更改这只会工作然后。

1

这里有一个办法:

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

如果本地分支的HEAD与已合并的PR的HEAD相对应,则可以安全地将其删除。无论公关如何合并(完全合并,快速前进,壁球和合并),这都将起作用。

我在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 

(因为枝干通过壁球&合并合并到主的警告,可以忽略不计)

注意事项:

  • 你需要pip install pygithub使用脚本。
  • 它会查找合并到origin/(current branch)的本地分行。所以你需要在masterdevelop或其他任何分支上运行它。
  • 如果您有多个长期分支机构,则此方法无法很好地工作。
相关问题