查找git分支的年龄

duw*_*uwo 6 git git-merge 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
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ski 6

如果你有兴趣的时候,你所创建的分支(在你的本地库),和有问题的分支产生不是很久以前(不到90天前使用默认设置),你可以看看它引用日志的创建活动。

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

为了简化可读性,此处缩短了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
Run Code Online (Sandbox Code Playgroud)

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

  • '%gD':reflog选择器,例如 refs/stash@{1}
  • '%gd':缩短的引用日志选择器,例如 stash@{1}
  • '%gn':引用日志标识名称
  • '%gN':引用日志标识名称(使用.mailmap,请参阅
  • '%ge':reflog身份电子邮件
  • '%gE':reflog身份电子邮件(尊重.mailmap,请参阅
  • '%gs':reflog主题


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

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

其次,您还需要知道分支(或一组分支),该分支是分支的。如果分支库看起来完全一样foo在提交分叉A的分支bar,当分支bar在提交分叉A的分支foo(与本地引用日志信息除外)。

假设所讨论的分支是从一个集成分支maintmaster或分支出来的主题分支next,我们可以使用它git merge-base --all来找到共同祖先,然后git show以适当的格式来找到提交日期,如下面的Mykola Gurov回答。例如:

$ 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
Run Code Online (Sandbox Code Playgroud)