查找 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 信息除外)。
假设有问题的分支是从集成分支之一派生的主题分支:maint
、master
或 next
,我们可以使用 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 }
比方说我有
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 信息除外)。
假设有问题的分支是从集成分支之一派生的主题分支:maint
、master
或 next
,我们可以使用 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 }