【问题标题】:How to list `git` branches not merged to given branches?如何列出未合并到给定分支的`git`分支?
【发布时间】:2020-10-20 12:10:55
【问题描述】:

我。 e.类似于git branch --remotes --no-merged origin/master origin/prod origin/dev - 但它列出了所有未合并到这些给定分支中的所有分支(列出未合并到任何给定分支中的分支)

【问题讨论】:

  • all branches that are not merged into none of these listed branches. 没有合并到none?你的意思是“没有合并到任何”?
  • @Kent 不确定如何用英语正确表达。可能你是对的。
  • @Kent 我刚刚按照您的建议编辑了问题,但现在我不确定它是否正确。在这种情况下,您确定您的英语知识吗? (这里我的英语水平不够)。 imo,“未合并到任何”似乎“未合并到 A 未合并到 B”,而“未合并到无”我的意思是“未合并到 A 未合并到 B"。你怎么看?
  • @Kent fyi,我刚刚在 English.stackexchange 上问过:english.stackexchange.com/questions/539307/…

标签: linux bash git


【解决方案1】:

我猜这个问题已经问过了

How can I know if a branch has been already merged into master?

如果你想聚合分支, 只是:

git branch --no-merged origin/master > file
git branch --no-merged origin/xxx >> file
git branch --no-merged origin/yyy >> file

并计算出现 3 次的那个...

【讨论】:

  • 该问题询问是否将分支合并到单个分支(master),此问题是关于是否合并到多个分支中的任何一个
  • 您建议的解决方案将过滤掉合并到 all 给定分支的分支。问题是关于如何过滤掉合并到 any 中的分支
【解决方案2】:

如果你需要做一次:

git branch --no-merged branch1; git branch --no-merged branch2|awk 'a[$0]++==2'

你应该计算你写了多少个分支命令,并调整awk行中的2

如果你必须经常做这个操作,你可以编写一个小的 shell 循环来接受分支名称,并在 awk 中使用动态“2”来做同样的事情。

【讨论】:

  • 这是一个使用awk 的非常有趣的解决方案,但您能解释一下最后一个a[$0]++==2 参数是如何工作的吗?看起来它假设计算重复次数并过滤重复次数少于2 次的分支,但不确定,这个参数在这里看起来很神奇:)
  • @whyer a[$0] 是一个哈希表(awk 关联数组),键是分支名称,值是一个 int。你是对的,对于相同的分支名称,我们使用a[] 来记录它在输出中出现的次数。当我们打印输出时,我们将出现(a[] 的值)== 2
  • 谢谢。 imo,值得附加到答案!很好的解释
【解决方案3】:

解决方案

我最终得到了类似于以下的解决方案:

git branch --remotes --no-merged origin/master | \
grep --fixed-strings --invert-match --file=<( \
    echo prod branch2 branch3 branchN | \
    tr ' ' '\n' | \
    xargs --replace \
    git branch --remotes --merged origin/{} \
)

说明

以下是上述命令的不同部分的作用及其输出的解释:

$ echo prod branch2 branch3 branchN
prod branch2 branch3 branchN

- 简单地输出由空格分隔的给定分支的名称。

$ echo prod branch2 branch3 branchN | \
>     tr ' ' '\n'
prod
branch2
branch3
branchN

- 输出相同,但每个分支都换行。

echo prod branch2 branch3 branchN | \
>     tr ' ' '\n' | \
>     xargs --replace \
>     git branch --remotes --merged origin/{}

- 将为每个列出的分支调用git branch 命令,如下所示:

git branch --remotes --merged origin/prod;
git branch --remotes --merged origin/branch2;
git branch --remotes --merged origin/branch3;
git branch --remotes --merged origin/branchN;

- 也就是说,它将列出所有合并到给定分支中的远程分支(由新行分隔),例如:

  origin/some-branch-merged-into-prod
  origin/branch2A-merged-into-branch2
  origin/branch2B-merged-into-branch2
  origin/some-other-branch-merged-into-branchN
git branch --remotes --no-merged origin/master

- 这将列出所有合并到 origin/master 的分支,例如:

  origin/some-branch-not-merged-into-any-given-branch
  origin/branch2A-merged-into-branch2
  origin/some-other-branch-merged-into-branchN

最后,整个命令将从未合并到@987654332的分支列表中排除合并echo命令中给出的任何分支中的分支列表@ - 从而为我们提供未合并到任何给定分支的分支列表,例如:

  origin/some-branch-not-merged-into-any-given-branch

【讨论】:

  • hth - 我希望我的问答对某人有所帮助
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多