获取所有分支的date,散列和分支名称

以下命令列出了所有本地分支的最后提交散列和分支名称:

git show-ref --heads 

输出:

 <hash> <branch-1> <hash> <branch-2> ... <hash> <branch-n> 

不过,我也想看看每个分支的date。 以下命令仅显示date和散列,但不显示仅在当前分支上的最后一次提交的分支名称:

 git log -1 --format="%ci %H" 

输出:

 <date> <hash> 

我怎样才能得到两者结合的结果?

 <date> <hash> <branch-1> <date> <hash> <branch-2> ... <date> <hash> <branch-n> 

我正在使用Windows 10而没有花哨的命令环境,只是基本的命令提示符。

我能够稍微适应这个伟大的GitHub帖子来获得以下内容:

 $ for branch in `git branch | grep -v HEAD`;do echo -e `git show --format="%ci %cr %H" $branch | head -n 1` \\t$branch; done | sort -r 

输出:

 2017-03-07 11:38:38 +0800 2 hours ago 87ed1306a1c06576043cd398097a1dc0ec456632 branch1 2017-03-07 02:50:06 +0000 3 hours ago 577fe106a9eb5763cbfd5bce87cfa9448ef52ca8 master 2017-03-07 02:50:06 +0000 3 hours ago 577fe106a9eb5763cbfd5bce87cfa9448ef52ca8 branch2 2017-03-03 17:07:05 +0800 4 days ago 419a23b246ad932c9659b70fded4b1362e92d884 branch3 

没有“分支的日期”这样的事情。 或者,也许有太多的东西。 你将需要选择一个。

具体来说,分支名称只是一些特定的提交名称,名称具有一些特殊的属性(你可以git checkout该名称以获得“在分支上”,一旦在分支上,你可以git commit做一个新的提交并更新名称到哈希ID条目)。

承诺自己有日期。 更准确地说,他们有两个时间戳,一个是作者,一个是提交者。 由于诸如masterdevelop这样的分支名称命名了一个特定的提交,因此您可以检索这些提交时间戳中的任一个,并将其用作日期。 但是如果我们将分支标签移动到另一个不同的提交,这个日期将会改变,也许会倒退。 如果两个不同的分支名称指向相同的提交,则两者必须具有相同的提交时间戳。

分支 – 实际上,几乎所有的 Git引用:分支名称,标签名称,特殊名称(如stash ,甚至是HEAD本身 – 也都有reflogs ,每个reflog条目记录何时和为什么改变引用:

 8dbdf33 HEAD@{11}: reset: moving to HEAD^ 70ac787 HEAD@{12}: cherry-pick: change default python path for FreeBSD 8dbdf33 HEAD@{13}: checkout: moving from diff-merge-base to stash-exp 

这也是:

 8dbdf33 HEAD@{6 weeks ago}: reset: moving to HEAD^ 70ac787 HEAD@{6 weeks ago}: cherry-pick: change default python path for FreeBSD 8dbdf33 HEAD@{6 weeks ago}: checkout: moving from diff-merge-base to stash-exp 

这些reflog条目最终会过期,通常在30到90天之后(取决于reflog条目指定的提交或其他对象是否可以从引用的当前值到达 ),但是在那之前,一些reflog条目可能有资格作为“分支的日期”。

Tim Biegeleisen的答案为您提供了每个分支名称指向的提交者的时间戳。 在PRETTY FORMATS部分下的git log文件包括,例如:

%ci :提交者日期,类似ISO 8601的格式

对于一个强大的脚本,我建议替换:

 for branch in `git branch | grep -v HEAD` 

有:

 for branch in $(git for-each-ref --format='%(refname:short)' refs/heads) 

尽管(或者类似的东西 – 例如,更多的工作可以直接在for-each-ref完成)。