在这种情况下,git 如何知道在变基时只选择分支的尖端?

How does git know only choose the tip of a branch when rebasing in this scenario?

我从一段看起来像这样的历史开始:

O--O(A)
 \
  \--O(B)--O(C)

首先,我将分支 B 重新设置为 A:

O--O(A)--O(B)
 \
  \--O--O(C)

然后我将 C 重新设置为 B,这就是历史的样子:

O--O(A)--O(B)--O(C)

我原以为 CC~1 会变基到 B 上,变基告诉我有冲突。但是,只有 C 的提示被重新设置为 B.

Git 怎么只知道变基 C 的尖端? Git 是否知道变基的 BC 的父级?

简而言之,你最后一个问题的答案是肯定的。 Git 跟踪更改。如果它在合并或变基中发现相同的更改,它不会 git 阻碍。

Git rebase 只是接受你想要 rebase 的提交(在你的情况下 CC~)并尝试将它们应用到新的基础上(在你的情况下 B).应用 C~ Git 后,发现没有进行任何更改,因为提交已经作为新的 B 存在,因此丢弃该提交,因为它已经存在。如果您早些时候挑选了一些中间提交,然后将您挑选的分支重新设置为您挑选的分支,情况也是如此。