如果功能分支重新定位到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-feature
和my-feature
的操作?
*如果我足够自律,我会一直记得在删除远程分支后立即删除我的本地分支,但有时我会忘记。
答案 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
)。如果有人将其捆绑到脚本中可能会很好。