3

我要做的是确保我可以安全地删除本地分支。

我在这里找到了这个问题的一些很好的答案:

我如何在 git 中知道一个分支是否已经合并到 master 中?

所以我们有源分支和目标分支。源分支是可能已经完全合并到目标分支的分支。

上述链接中答案的问题在于,如果目标分支在与源分支合并后有新的提交,则答案似乎不起作用。

我有这个运行良好的脚本,但它似乎只有在所有分支共享相同的提示或其他情况下才有效。不过,该脚本在理论上是有效的,因为您只是想查看本地分支的尖端是否作为提交包含在远程分支历史的某个地方,所以应该不难弄清楚。

#!/usr/bin/env bash


green='\033[1;32m'
red='\e[31m'
no_color='\033[0m'


branch="${1:-HEAD}"

branch_name=`git rev-parse --abbrev-ref $branch`;

git fetch origin dev;
git fetch origin master;


merge_base="$(git merge-base $branch origin/dev)"
merge_source_current_commit="$(git rev-parse $branch)"


if [ "$merge_base" != "$merge_source_current_commit" ]; then
    echo -e "${red}Branch with name '$branch_name' is not completely merged with origin/dev.${no_color}";
    exit 1;
else
    echo -e "${green}Branch with name '$branch_name' is merged with origin/dev, now checking against origin/master${no_color}";
fi

merge_base="$(git merge-base $branch origin/master)"

if [ "$merge_base" != "$merge_source_current_commit" ]; then
    echo -e "${red}Branch with name '$branch_name' is not completely merged with orign/master.${no_color}";
    exit 1;
fi


echo -e "${green}branch with name '$branch_name' is completely merged with origin/dev and origin/master.${no_color}"

echo "To delete this branch run: git branch -d '$branch_name'"

有谁知道如果目标分支在与源分支合并后获得新的提交,为什么它不起作用?

4

1 回答 1

5

有一种更简单的方法来测试“本地分支的提示是否作为提交包含在远程分支的历史记录中”,方法是使用:

if [ git merge-base --is-ancestor source destination ] ...

但是我不能说它会更好,因为我无法重现您原来的问题。

于 2018-12-19T14:05:10.217 回答