显示自父分支分支以来的提交?

Show commits since branching from parent branch?

问题

有没有一种方法可以列出在当前分支上完成的所有提交,因为它是从其父分支中分支出来的?

例子

假设我在 master 分支上并提交了 AB,然后分支到新的 feature-branch 并提交了 CD:有没有办法只列出 CD

Git 不记得父分支或分支开始的位置,但您可能记得:

Let's say I'm on my master ... then [create] feature-branch and made commits C and D: is there a way to list only C and D?

如果您使用 b1..b2 语法,git log 命令将显示在某些选定的 范围 中的提交,它是 b2 --not b1。在这里你想要:

git log feature-branch --not master

或:

git log master..feature-branch

或:

git log master..HEAD

或:

git log master..

内部工作方式是 Git 将暂时“将某些提交涂成红色”(表示停止),将其他提交涂成“绿色”(表示开始)。 “绿色油漆”以您想要的提交开始:例如 HEADfeature-branch。然后它从提交到父提交“向后”泛滥。

“红色油漆”以您要拒绝的提交开始:master,或在本例中为 B。然后它从提交到父提交“向后”泛滥。

红色“覆盖”绿色,或者等价地,我们先做红色并且不重新绘制提交。所以鉴于我们有:

A <-B   <-- master
     \
      C <-D   <-- feature-branch (HEAD)

此“将 BA 涂成红色”和“将 CD 涂成绿色”,因此您将看到列出的提交是 D,然后是 C(由于 git log graph-walk 顺序,因此顺序如此)。

master.. 语法是 master..HEAD 的缩写:任何时候你在双点语法的一侧留下一个名字,它意味着 HEAD.

如果我们向 master 添加更多提交(然后返回到 feature-branch):

A <-B <-E <-F <-G <-H  <-- master
     \
      C <-D   <-- feature-branch (HEAD)

“红漆”现在从 H 开始,一直到 B,所以它仍然有效。

注意:这种双点语法适用于许多 Git 命令,通常表示相同的意思。但是,对于 git diff,它不是:git diff master..feature-branch 只是意味着 找到 master 指向的提交 找到提交 feature-branch 指向 ——在本例中将是 BD,或者稍后,HD——以及 diff那两个承诺。也就是说,git diff X..Ygit diff X Y 完全相同。

(还有一个三点语法,它对大多数Git命令有一个含义,对git diff有不同和特殊的含义。所以git diff总体上有点奇怪.)

根据您所说的,您应该使用 cherry,这里是更深入了解它的文档:https://git-scm.com/docs/git-cherry

应显示您要查找的内容的命令:

git cherry -v <parent_branch> <targeted_branch>
# Given your example: git cherry -v master feature-branch

解释:

这将显示 中包含的所有提交,尤其是 中不包含的所有提交。此外,如果省略最后一个参数,则将比较当前分支。 (有关详细信息,请参阅上面的文档)。