git:当前分支和分支创建之间的差异

gue*_*tli 9 git

想象一下:

git-diff-三点

我三天前创建了分支“B”。这是我目前正在处理的分支。现在我想知道分支创建后发生了什么变化 ( X)。

这给了我 B 和 X 之间的差异(如图片中的虚线):

git diff A...
Run Code Online (Sandbox Code Playgroud)

上面的命令很方便,因为它很短而且我不需要记住“X”。

但是:我超级懒。我不想记住我当前的分支是从哪个分支创建的。

我怎样才能避免记住/输入A

我正在寻找一种不需要我这边输入的方法。它应该列出自上次创建分支以来的所有更改。

mat*_*att 11

嗯,@{-1} 可能是 A。但话又说回来,也可能不是。它只是意味着“我以前所在的分支”。同样,通过查看git reflog可能会告诉您,您可以推断出创建当前分支时所处的位置。

但是当前分支本身并没有告诉你任何这些。这里真正的问题是你对“分支”的理解与 Git 不同。“因为分支被创建”这句话可能会误导你。

你似乎认为 B 是“从 X 到 B 结束的所有东西”。不是。B 只是一次提交:图中标记为 B 的提交。从那之后向后的所有其他内容——B 之前的提交,以及之前的提交,X,以及X 之前的提交,以及之前的提交,一直向后到根提交——具有完全相同的状态。它们是可从 B 访问的提交,仅此而已。

所以在 Git 心目中 X 并没有什么特别之处。认为它很特别,因为它是 A 和 B“相遇”的地方。但是要区分这个事实,您必须知道 BA的名称。您看到的是一个依赖于 A 的拓扑;如果你想让 Git 帮助你,你必须将你看到的内容传达给 Git。

一旦你愿意谈论A和B,那么细,你可以要求git diff ...Agit diff A...找出哪些改变,因为十,或者你可以谈论git merge-base A B找到X.但只有一个人可以区分,这里的关键是A .

  • @guettli 不。“分支”只是提交的标签,仅此而已。您可以删除分支 *B*,然后将相同的标签 *B* 附加到同一个提交。你现在认为分支 *B* 是什么时候诞生的? (2认同)
  • 你是对的,除了“你必须知道 B 和 A 的名字”。人们可以检查“没什么特别的”提交在提交树中的位置,以找到最接近的祖先提交,它也是另一个提交的祖先提交。换句话说,您不必知道“A”的名称,但知道找到“A”的算法,正确反映“A”的含义。据我所知,@VonC 的答案就是这样。 (2认同)

Von*_*onC 5

但是:我超级懒。我不想记住我当前的分支是从哪个分支创建的。

然后你需要在一个名为 的可执行文件中编写它的脚本,git-diffca然后可以将其称为git diffca(ca 表示“共同祖先”)

在该脚本中,您需要决定要在所有候选分支中选择什么标准:

     c--c--c     (C)
    /
a--Y--X--a--a    (A)
       \
        b--b--b  (B, HEAD)
     
Run Code Online (Sandbox Code Playgroud)

你想看什么:从Y(分支C和之间的共同祖先B)变化?或来自XA和之间B

我会查看所有分支,git merge-base <aBranch> B为每个分支进行计算,并获取最近的提交(X在架构的情况下)

然后脚本将显示git diff A...(因为git merge-base A B产生了与 B 的最新共同祖先)