确保Git知道合并PR后删除本地分支是安全的

时间:2016-10-11 22:47:00

标签: git git-merge

我做了一个拉取请求,将my-feature-branch合并到GitHub上的master。 repo所有者向我的分支添加了一个提交,合并到master,并使用Gi​​tHub GUI删除my-feature-branch。我使用git pull master进行了更新,使用git pull --prune删除了跟踪分支。但是当我尝试使用git branch --delete my-feature-branch删除本地功能分支时,我得到error: The branch 'my-feature-branch' is not fully merged.

我有点理解为什么Git这么说; my-feature-branch从未在我的本地仓库中合并到master(它只在远程仓库中完成)。我当然可以用git branch -D my-feature-branch忽略此消息。

但在这种情况下,很明显,删除本地仓库中的my-feature-branch不会丢失任何内容,因为它可以通过合并我创建的master提交来访问PR。

通常Git非常善于确定某些事情是否安全。我可以做得更好并避免not fully merged消息吗?

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,分支是远程合并还是本地合并无关紧要;这对Git来说都是一样的。这就是您描述的情况的正常历史记录:

*--*--*--*--*--*--*---C [master]
    \                /
     *--*--*--*--A--B
                 |
         [my-feature-branch]

其中A是您在my-feature-branch的本地版本上的最后一次提交。 B是repo所有者提交的,C是合并提交。

当你在master并且git branch --delete my-feature-branch时,所有Git都会检查提交A是否是提交C的祖先。您可以使用以下方法模拟此检查:

git merge-base --is-ancestor my-feature-branch master

(此命令将返回0表示成功,1表示失败。)

我(还)不知道为什么这项检查失败了,但我有一个解决方法,应该揭示原因。做:

git checkout my-feature-branch
git branch my-feature-bak # add backup of original feature branch, if desired
git rebase master

由于您的分支已经合并到master,因此在rebase期间应该跳过大部分/全部提交。无论出于何种原因,任何遗留下来的东西都会被合并到master中。

接下来,检查输出:

git log my-feature-branch..master

看看发生了什么。

如果您希望将任何剩余的提交包含在回购中,那么您可以根据需要创建新的分支和/或挑选提交。

答案 1 :(得分:-1)

查看您的功能分支,然后再次尝试git pull

git checkout my-feature-branch,然后是git pull

然后,再次结帐并查看分支是否合并:

git checkout mastergit branch --merged

一旦两个分支都更新,您应该能够用git branch -d my-feature-branch删除您的分支;看来你可能只是从遥控器更新了主人。