在 Git 中,您可以说每个分支都从根提交开始,这确实是真的。但我想这对你不是很有帮助。相反,您可以做的是定义与其他分支相关的“分支的开始”。一种方法是使用
git show-branch branch1 branch2 ... branchN
这将在输出底部显示所有指定分支之间的共同提交(如果实际上存在共同提交)。
这是Linux Kernel Git 文档中的一个示例show-branch
$ git show-branch master fixes mhf
* [master] Add 'git show-branch'.
! [fixes] Introduce "reset type" flag to "git reset"
! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
---
+ [mhf] Allow "+remote:local" refspec to cause --force when fetching.
+ [mhf~1] Use git-octopus when pulling more than one heads.
+ [fixes] Introduce "reset type" flag to "git reset"
+ [mhf~2] "git fetch --force".
+ [mhf~3] Use .git/remote/origin, not .git/branches/origin.
+ [mhf~4] Make "git pull" and "git fetch" default to origin
+ [mhf~5] Infamous 'octopus merge'
+ [mhf~6] Retire git-parse-remote.
+ [mhf~7] Multi-head fetch.
+ [mhf~8] Start adding the $GIT_DIR/remotes/ support.
*++ [master] Add 'git show-branch'.
在该示例中,master
正在与fixes
andmhf
分支进行比较。将此输出视为一个表,每个分支由其自己的列表示,每个提交都有自己的行。包含提交的分支将在该提交的行中的列中显示+
或显示。-
在输出的最底部,您会看到所有 3 个分支共享一个共同的祖先提交,并且它实际上是以下head
提交master
:
*++ [master] Add 'git show-branch'.
这意味着fixes
和mhf
都从master
.
替代解决方案
当然,这只是在 Git 中确定公共基本提交的一种可能方法。其他方法包括git merge-base
找到共同的祖先,git log --all --decorate --graph --oneline
或者gitk --all
可视化分支并查看它们的分歧(尽管如果有很多提交很快就会变得困难)。
来自原始海报的其他问题
至于你有的这些问题:
commitD
是两个分支的成员还是我们可以清楚地决定它是否属于branch-A
or branch-B
?
D
是两个分支的成员,它是它们两个分支的祖先提交。
主管有时想知道,何时启动了一个分支(它通常标志着任务的开始) ......
在 Git 中,您可以重写整个提交树及其分支的历史记录,因此当一个分支“开始”时并不像 TFS 或 SVN 那样一成不变。您可以rebase
分支到 Git 树中的任何时间点,甚至可以将其放在根提交之前!因此,您可以使用它在您想要的树中的任何时间点“启动”任务。
这是一个常见的用例git rebase
,将分支与来自上游分支的最新更改同步,沿提交图及时将它们“向前”推送,就好像您“刚刚开始”在分支上工作一样,即使您'实际上已经研究了一段时间。如果您愿意,您甚至可以沿着提交图及时将分支推回(尽管您可能必须解决很多冲突,具体取决于分支内容......或者您可能不会)。您甚至可以在开发历史的中间插入或删除一个分支(尽管这样做可能会更改许多提交的提交 shas)。重写历史是 Git 的主要功能之一,它使它如此强大和灵活。
这就是为什么提交带有创作日期(最初创作提交的时间)和提交日期(提交最后一次提交到提交树的时间)。您可以将它们视为类似于创建时间日期和上次修改时间日期。
主管有时想知道......某些更改属于哪个分支(为了获得某些更改的目的 - 是否需要工作)。
同样,由于 Git 允许您重写历史记录,您可以(重新)基于您想要的提交图中的几乎任何分支/提交进行一组更改。 git rebase
从字面上看,您可以自由移动整个分支(尽管您可能需要随时解决冲突,具体取决于您将分支移动到的位置以及它包含的内容)。
话虽如此,您可以在 Git 中使用来确定哪些分支或标签包含一组更改的工具之一是--contains
:
# Which branches contains commit X?
git branch --all --contains X
# Which tags contains commit X?
git tag --contains X