在将功能分支重新定位到另一个分支后,是否可以安全地删除功能分支?

时间:2017-08-30 14:35:00

标签: git github version-control git-rebase

如果功能分支重新定位到origin / master而不是合并,我如何安全地删除功能分支的本地副本。我知道我可以git branch -D,但我想避免盲目地这样做,让git告诉我哪些分支可以安全删除。

例如:我有功能分支my-feature,我将其推送至origin/my-feature,制作公关,并origin/my-feature重新定位到origin/master,然后删除。仍然保留了本地my-feature。*有没有办法检测到origin/master中有效包含的更改?

git diff origin/master...my-feature不起作用,因为origin/master的共同祖先没有改变。检查git diff origin/master..my-feature是否为空是有效的,但仅在重新定位后立即生效。如果任何其他变化在我的基础上得到重新定位,这将显示这些变化。

有没有办法删除已删除远程版本的本地分支? (但本地分支从未拥有远程版本)。或者,如果我避免删除origin/my-feature,我是否可以在本地执行安全删除origin/my-featuremy-feature的操作?

*如果我足够自律,我会一直记得在删除远程分支后立即删除我的本地分支,但有时我会忘记。

2 个答案:

答案 0 :(得分:1)

git cherry很完美,从来不知道。我创建了一个别名来清理已合并到upstream/master的所有分支:

branch-cleanup = "!f(){ for b in $(git for-each-ref refs/heads --format=\"%(refname:short)\"); do if [[ ! $(git cherry -v upstream/master $b | grep \"^+\") ]]; then git branch -D $b; fi; done };f"

更可读:

for b in $(git for-each-ref refs/heads --format="%(refname:short)"); do  # Go through each branch
  # git cherry prefixes each commit with "+" if it's not included and "-" if it is, so check if there are no "+" lines:
  if [[ ! $(git cherry upstream/master $b | grep "^+") ]]; then
    git branch -D $b
  fi
done

答案 1 :(得分:0)

让我先插入一些背景资料。我相信你在谈论当有人使用" rebase并合并时会发生什么? GitHub上的clicky按钮。这会将提交复制到添加到目标分支顶端的一组新提交中:

...--o--o--*--o   <-- master
            \
             A--B--C   <-- pullrequested

变为:

...--o--o--*--o--A'--B'--C'   <-- master
            \
             A--B--C   <-- pullrequested

这意味着git branch --merged没有帮助:它将测试提交C是否是提交C'的祖先,而C不是{{1}的祖先}}

(令人讨厌的是,GitHub&#39; rebase and merge&#34; clicky按钮似乎将提交重新复制到新的哈希ID,即使在不需要它的情况下也是如此。这可能是为了使作者和提交者分开,对于拉请求,其中一个人无法直接访问原始存储库。无论如何,结果是你的请求分支的提示,如C',不是一个尖端的祖先。目标分支,例如C。)

  

检查master是否为空可行,但仅在重新定位后立即生效。

不仅如此,如果没有额外提交,差异通常也是空的,即,如果整体图形如下:

git diff origin/master..my-feature

作为Andrew C comments,您可以使用...--o--o--*--A'--B'--C' <-- master \ A--B--C <-- pullrequested 查看是否已复制所有提交(此处为git cherry)。如果有人将其捆绑到脚本中可能会很好。