10

How does the git branch -r --no-merged work?

Does it check to see if all commits in one branch already exist in the original parent branch?

And what about cherry picks? Is it smart enough to say that a commit from 1 branch has already been cherry picked back into the original parent branch?

And if a branch has already been merged and new commits have been added will it pick that branch up as not being merged?

4

1 回答 1

11

好吧,@Hasturkun 的评论说实话,但你有 3 个问题:

1.它是否检查一个分支中的所有提交是否已经存在于原始父分支中?

不要试图重复@Hasturkun 引用说:“仅列出无法从指定提交获得提示的分支”。

在这种特定情况下,将提交的 git 树视为管/地下图。您只能从一个节点/站向后移动到另一个节点/站。

master    : - - - -0 
                    \   
branchA   :          E - - - - F - - - - G

如果master您运行git branch --no-merge并使用手册页定义?你branchA能从master的 HEAD 到达 G(的尖端),提交 0 吗?不,您不能,因此branchA将被列为非合并分支。

如果你从(commit G)git branch --no-merge的 HEAD运行呢?branchAmaster是一个非合并的分支?不,它被认为是一个合并的分支,理解为什么之前给出的例子是微不足道的。

这个例子怎么样?

master    : - - - -0
                    \   
branchA   :          E - - - - F - - - - G - - - Z
                               \                /
branchB   :                     Y - - - W - - -

在所有 3 个分支中运行 git branch --no-merged 的​​输出:

master
  branchA
  branchB
branchA (nothing)
branchB (nothing)

2. 樱桃采摘呢?说来自 1 个分支的提交已经被樱桃挑选回原始父分支是否足够聪明?

Cherry-picks 创建了一个完全不同的 commitId,所以我只在真正需要时才使用它们。由于它创建了一个完全不同的提交,因此树会有所不同:

看一下我刚刚做的这个实验,把master和branchA认为是一样的:

经验1)使用merge

(master)$ touch empty && git add . && git commit -am "File Added"
(master)$ checkout branchA
(branchA)$ git branch --no-merged
  master
(branchA)$ git merge master
(branchA)$ git branch --no-merged
  // outputs nothing

经验2)使用cherry-pick

(master)$ touch empty && git add . && git commit -am "File Added"
(master)$ checkout branchA
(branchA)$ git branch --no-merged
  master
(branchA)$ git cheery-pick <commitID from above>
(branchA)$ git branch --no-merged
  master

3. 如果一个分支已经被合并并添加了新的提交,它会选择那个没有被合并的分支吗?

是的,因为以上所述。

于 2013-10-16T17:14:41.307 回答