有什么方法可以在将功能分支重新建立到另一个分支后安全地删除它吗?

Ale*_*lec 5 git version-control github git-rebase

当功能分支重新基于 origin/master 而不是合并时,如何安全地删除它的本地副本。我知道我可以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

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

Ale*_*lec 4

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"
Run Code Online (Sandbox Code Playgroud)

更易读一点:

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
Run Code Online (Sandbox Code Playgroud)