branch 什么时候从 master 分支出来的?

When was branch forked off from master?

几天前,我在终端中从 master 分支了当前分支。从那以后,我做了一些提交,但是当我输入 git log 时,我看到了以前的提交,我在当前分支上所做的,以及其他人在 master 上所做的。只能假设,在其他人的提交和我的提交之间的某个地方,我会(在 master 分支上)输入

git checkout -b newbranch

是否有 git 命令可以告诉您 newbranch 从 master 分叉时的确切时间戳?

当您创建新分支 newbranch 时,git 在此处写入一个文件(包含它指向的提交的 SHA-1):.git/refs/heads/newbranch。也许检查它的创建时间戳?

(当然,这只是在分支起源的本地回购上的解决方案,而不是来自另一个回购。)

不是真的。那不是 git 曲目。事实上,它甚至没有跟踪 newbranch 是专门分支 "from master" 的事实。 (顺便说一句,我建议不要使用 "fork" 来指代分支之间的关系,因为 "fork" 对于 git repos 和一般的 OSS 项目有特定的含义。)

正如 RomainValeri 所建议的那样,在特定情况下,您可能能够查看与分支相关联的元数据的文件系统时间戳;但这些并不能保证有任何意义。有时他们提到的文件不存在,或者在与分支创建无关的时间创建。即使它 确实 存在并且 确实 反映了正确的时间戳,也没有多大意义;因为 "creating a branch" 只意味着创建了一个新的 ref。这并不意味着它已被(或曾经被)检出,或说明哪些 ref 将包含新提交。

可视化现在情况的最简单方法是获取显示分支和其他引用位置的提交图。你可以使用类似 git log --graph --all --full-history 的东西。 (--full-history 选项可能是不必要的,但因为关键是我们不能完全确定发生了什么,所以这将提供最真实的画面。)或者您可能会发现 GUI 使其更易于阅读;当我需要查看 "big picture".

时,我经常使用 gitk --all --full-history

请记住,默认情况下肯定会显示创建分支之前的提交。也就是说,如果你有

A -- B -- C <--(master)
      \
       D <--(newbranch)

那么 D 的日志默认包括 ABD,因为这是代码的完整历史记录,因为它存在于 newbranch。如果您看到 C,则表明您根本不在 newbranch(并且上图不是您 真正 所拥有的那种情况)。

其余部分可能是切线,但以防万一...

默认包含 AB 的原因是,同样,git 不会 know/care 哪个分支是从哪个分支创建的,或者诸如此类的事情。在上图中,newbranch 可能是原始分支,而 master 可能是从 B 分支出来的;到 git,这与 newbranchmasterB 分支相同。或者 D 可以在分离的 HEAD 状态下创建,而 newbranch 可以在事后创建以保留 D。或者可能会发生很多其他事情。

如果你想看到 只是 newbranch 上添加的提交,你可以说类似 git log master..newbranch 的内容(告诉日志排除任何提交是 master 历史的一部分)。