查找 git 分支的年龄

Find the age of a git branch

比方说我有 master 已合并到 g1,分支 g1 已合并到 master

git merge master -m "#3 git merge master to g1"

git merge g1 -m "#3 git merge g1 to master"

...
...

git branch -r -v

>

origin/g1            8b535b9 #3 git merge master to g1

origin/master        a335421 A comment

origin/newbranch     626a6d2 branch example

有什么方法可以让我看到分支的创建顺序、分支开始时的时间戳或 SHA? 或者以某种方式找到哪个分支起源于另一个分支? 除了我知道师父是我最年长的名字。

如果您对 创建分支(在您的 local 存储库中)感兴趣,并且该分支未创建很久以前(默认设置不到 90 天前),您可以在其 reflog 中查看创建事件。

$ head -1 .git/logs/refs/heads/<branch_name> 
000000... 4a28f1... J Hacker <joe@example.com> \
    1400885439 +0200    branch: Created from HEAD

此处 SHA-1 标识符被缩短以提高可读性,并且该行显示为断线 - 在实际输出中它是一长行。

这里的时间是 UNIX 时间戳(自纪元以来的秒数)加上数字时区。您可以使用 date 将其转换为人类可读的输出,例如:

$ date --date=@1400885439 --rfc-2822 
Sat, 24 May 2014 00:50:39 +0200
$ TZ=GMT-2 date --date=@1400885439 --rfc-2822 
Sat, 24 May 2014 00:50:39 +0200

不幸的是,从 git 版本 2.2.1 开始,reflog 日期没有漂亮的格式。下面是迄今为止所有与 reflog 相关的漂亮格式:

  • '%gD': reflog selector, e.g., refs/stash@{1}
  • '%gd': shortened reflog selector, e.g., stash@{1}
  • '%gn': reflog identity name
  • '%gN': reflog identity name (respecting .mailmap, see
  • '%ge': reflog identity email
  • '%gE': reflog identity email (respecting .mailmap, see
  • '%gs': reflog subject


如果您对 其他人 创建分支感兴趣,情况要困难得多。

首先,您只能找到分支 分支出来的提交及其提交日期;该分支可以稍后创建。正如@Jubobs 在评论中所写,Git 不记录分支的创建日期,除了 reflog(严格来说是本地的)。

其次,您还需要知道相关分支被分叉出的分支(或一组分支);如果分支 foo 在提交 A 时从分支 bar 分叉,而分支 bar 在提交 A 从分支 foo(本地 reflog 信息除外)。

假设有问题的分支是从集成分支之一派生的主题分支:maintmasternext,我们可以使用 git merge-base --all 来查找共同祖先,然后 git show 使用适当的格式来查找提交日期,如下面的 所示。例如:

$ echo maint master next |
while read -d ' ' branch; do 
    git merge-base --all $branch <branch_name>;
done | sort | uniq |
xargs git show -s --format=format:%ci

您可以尝试查找偏离主分支的分支的首次提交日期,尽管我不确定它的可靠性如何。沿线的东西:

git branch | { while read branch; do merge_base=$(git merge-base --all $branch master); date_branched=$(git show -s --format=format:%ci $merge_base); echo "$branch: $merge_base @ $date_branched"; done }