任何方式安全地删除一个功能分支后重新绑定到另一个?

任何方式安全地删除一个功能分支后重新绑定到另一个?

问题描述:

我怎样才能安全地删除我的本地特性分支的副本时,它的重订到原点/主,而不是合并。我知道我可以git branch -D,但我想避免盲目地做,让git告诉我哪些分支可以安全移除。任何方式安全地删除一个功能分支后重新绑定到另一个?

例如: - 我有特性分支my-feature,我把它推到origin/my-feature,做PR,并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

使用git樱桃:

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" 

一点点其可读性 –

git cherry是完美的,从来不知道这一点。我做了一个别名,清理已合并到upstream/master所有分支:在这种情况下

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 

让我先插入位的背景信息。我相信你在谈论当有人使用GitHub上的“rebase和merge”clicky按钮时会发生什么。这将复制的提交(S)到一组新的犯下添加到目标分支的末端:

...--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不是C'的祖先。 (令人烦恼的是,GitHub的“rebase and merge”clicky按钮似乎将提交重新复制到新的哈希ID,即使在不应该有必要的情况下也可以这样做,这可能会使作者和提交者分离,其中一个没有直接访问原始存储库,无论如何,结果是您的推拉请求分支的提示(例如C)不是目标分支的提示的祖先,例如master。)

检查git diff origin/master..my-feature是否为空作品,但仅在重新绑定后立即生效。

不仅如此,但DIFF一般只如果没有额外的提交,即,如果整体图形看起来就像空:

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

由于Andrew C comments,你可以使用git cherry,看看所有提交(在这里,A-B-C)被复制。如果有人将这个脚本捆绑到一个脚本中可能会很好。