确保 Git 知道合并 PR 后删除本地分支是安全的
Making sure Git knows that deleting local branch is safe after PR is merged
我在 GitHub 上提出了合并 my-feature-branch
到 master
的拉取请求。回购所有者向我的分支添加了一个提交,合并到 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根据需要挑选提交。
我在 GitHub 上提出了合并 my-feature-branch
到 master
的拉取请求。回购所有者向我的分支添加了一个提交,合并到 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根据需要挑选提交。