如何确定Git分支的创build时间?

有没有办法确定Git分支的创build时间? 我在我的回购中有一个分支,我不记得创build它,并认为可能看到创build时间戳会慢跑我的记忆。

使用

  git show --summary`git merge-base foo master` 

如果你想在上下文中看到它,然后使用

  gitk --all --select-commit =`git merge-base foo master` 

截图

正如在评论和Jackub的回答中所提到的 ,只要你的分支比configuration设置gc.reflogexpire (默认是90天)中设置的天数更年轻,那么你可以利用你的reflog来找出当分支引用是第一次创build。

请注意, git reflog可以占用大部分的git log标志。 进一步注意HEAD@{0}风格的select器是有效的时间概念,事实上,它是以datestring的forms处理的(以黑色方式)。 这意味着你可以使用标志--date=local并得到这样的输出:

  $ git reflog --date = local
 763008c HEAD @ {Fri Aug 20 10:09:18 2010}:拉:快进
 f6cec0a HEAD @ {星期二Aug 10 09:37:55 2010}:拉:快进
 e9e70bc HEAD @ {Thu Feb 4 02:51:10 2010}:拉:快进
 836f48c HEAD @ {Thu Jan 21 14:08:14 2010}:checkout:从主人到主人
 836f48c HEAD @ {Thu Jan 21 14:08:10 2010}:拉:快进
 24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}:结帐:从74fca6a42863ffacaf7ba6f1936a9f228950f657 
 74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}:checkout:从master到v2.6.31
 24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}:拉:快进
 964fe08 HEAD @ {Mon Oct 26 15:29:29 2009}:结帐:从4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
 4a6908a HEAD @ {Mon Oct 26 14:52:12 2009}:checkout:从master到v2.6.28

使用--date=relative也可能有用:

  $ git reflog --date = relative
 763008c HEAD @ {4 weeks ago}:拉:快进
 f6cec0a HEAD @ {6 weeks ago}:pull:快进
 e9e70bc HEAD @ {8个月前}:拉:快进
 836f48c HEAD @ {8 months ago}:checkout:从主人移到主人
 836f48c HEAD @ {8 months ago}:拉:快进
 24bc734 HEAD @ {8 months ago}:checkout:从74fca6a42863ffacaf7ba6f1936a9f228950f657移到master
 74fca6a HEAD @ {8 months ago}:结账:从主人移动到v2.6.31
 24bc734 HEAD @ {8个月前}:拉:快进
 964fe08 HEAD @ {11 months ago}:checkout:从4a6908a3a050aacc9c3a2f36b276b46c0629ad91移到master
 4a6908a HEAD @ {11 months ago}:checkout:从master移到v2.6.28

最后一个注意:– --all标志(这实际上是git-reflog理解的git-log标志)将在refs/ (而不是简单的HEAD )中显示所有已知ref的reflog,这将清楚地显示分支事件:

  git reflog --date = local --all
 860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}:commit:Second。
 17695bc refs / heads / example_branch @ {Mon Sep 20 00:31:06 2010}:branch:Created from HEAD

首先,如果你的分支是在gc.reflogexpire天(默认90天,也就是3个月左右)内创build的,你可以使用git log -g <branch>或者git reflog show <branch>来查找reflog中的第一个条目,创build事件,看起来像下面(对于git log -g ):

 Reflog: <branch>@{<nn>} (CR Eator <creator@example.com>) Reflog message: branch: Created from <some other branch> 

你会得到谁创build了一个分支,之前有多less操作,以及从哪个分支(可能只是“从头创build”,这没有多大帮助)。

MikeSep在回答中这样说 。


其次,如果你有比gc.reflogexpire更长的分支,而且你运行了git gc (或者它自动运行),那么你将不得不从它的创build分支中find共同的祖先。 看看configuration文件,也许有branch.<branchname>.merge条目,它会告诉你这个分支是基于什么。

例如,如果您知道有问题的分支是从主分支(从主分支分支)创build的,则可以使用以下命令查看共同的祖先:

 git show $(git merge-base <branch> master) 

您也可以尝试git show-branch <branch> master作为替代。

这是gbacon在回应中所说的 。

Pro Git§3.1 Git分支 – 分支是什么对于git分支究竟是什么有一个很好的解释

Git中的一个分支只是一个轻量级的指向[a]提交的可移动指针。

由于分支只是一个轻量级指针,git没有明确的历史或创builddate的概念。 “但是请继续,”我听到你说,“当然git知道我的分支的历史! 那么,有点。

如果您运行以下任一项:

 git log <branch> --not master gitk <branch> --not master 

你会看到什么看起来像“你的分支的历史”,但实际上是从“分支”可访问的提交列表,无法从主站访问。 这给了你想要的信息,但是当且仅当你从未将“分支”合并回主,并且从创build它以来从未将主合并到“分支”。 如果你合并了,那么这个差异的历史就会崩溃。

幸运的是,reflog通常包含你想要的信息,正如其他各种答案中所解释的那样。 用这个:

 git reflog --date=local <branch> 

以显示分支的历史。 这个列表中的最后一个条目(可能)是您创build分支的点。

如果分支已经被删除,那么'分支'不再是一个有效的git标识符,但你可以用它来代替,它可以find你想要的:

 git reflog --date=local | grep <branch> 

或者在Windows cmd shell中:

 git reflog --date=local | find "<branch>" 

请注意,reflog不能在远程分支上有效地工作,只有你在本地工作的分支。

我不确定它的git命令,但我想你可以在reflog中find它们。

 .git/logs/refs/heads/<yourbranch> 

我的文件似乎有一个unix时间戳在他们。

更新:打印日志时似乎有一个选项可以使用reflog历史logging,而不是提交历史logging:

 git log -g 

你也可以关注这个日志,回到你创build分支的时候。 git log显示了提交的date,但不是在reflog中进行了操作的date。 除了在上面的path中查找实际的reflog外,我还没有find。

使用:

 git reflog 

在当前文件夹中显示您的存储库的所有生命周期。 首先出现的分支名称(从下到上)是创build的源。

 855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46 855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development 855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46 535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35 855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46 855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development 535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css 855a3ce HEAD@{7}: checkout: moving from development to feature-jira35 855a3ce HEAD@{8}: checkout: moving from master to development 

这意味着:

  • 分支开发创build(签出-b)从主

  • 分支function-jira35从开发中创build(checkout -b)

  • 分支function-jira-sut-46从开发中创build(checkout -b)

这是我find这个线程之前想出来的东西。

 git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1 git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:' 

尝试这个

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'