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

Making sure Git knows that deleting local branch is safe after PR is merged

我在 GitHub 上提出了合并 my-feature-branchmaster 的拉取请求。回购所有者向我的分支添加了一个提交,合并到 master,并使用 GitHub 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 不会丢失任何内容,因为它可以从合并我的 PR 创建的 master 提交中访问。

通常 Git 非常擅长判断某事是否安全。我可以做得更好并避免 not fully merged 消息吗?

查看您的功能分支,然后重试 git pull

(git checkout my-feature-branch, 然后 git pull)

然后,再次checkout到master,看看分支是否合并:

git checkout master, git branch --merged

一旦两个分支都更新了,您应该可以使用 git branch -d my-feature-branch 删除您的分支;看来您可能只从远程更新了 master 。

正如我在评论中提到的,分支是远程合并还是本地合并并不重要; 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

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


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

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

由于您的分支已经合并到 master,因此在变基期间应跳过大部分/所有提交。无论出于何种原因,剩下的任何内容都将是尚未合并到 master 中的内容。

接下来,检查输出:

git log my-feature-branch..master

看看发生了什么。

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