找到git分支的年龄

时间:2015-01-23 11:40:09

标签: git git-branch git-merge

比方说我有 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? 或者以某种方式找到哪一个分支起源于另一个分支? 除了我知道主人是我最老的事实。

2 个答案:

答案 0 :(得分:4)

如果您对创建了分支(在本地存储库中)感兴趣,并且不久前(不到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相关的漂亮格式:

  
      
  • &#39;%gD​​&#39;:reflog选择器,例如refs/stash@{1}
  •   
  • &#39;%gd&#39;:缩短了reflog选择器,例如stash@{1}
  •   
  • &#39;%gn&#39;:reflog identity name
  •   
  • &#39;%gN&#39;:reflog身份名称(尊重.mailmap,见
  •   
  • &#39;%ge&#39;:reflog identity email
  •   
  • &#39;%gE&#39;:reflog身份电子邮件(尊重.mailmap,见
  •   
  • &#39;%gs&#39;:reflog subject
  •   


如果您对其他人创建分支感兴趣,情况会更加困难。

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

其次,您还需要知道有问题的分支被分叉的分支(或一组分支);如果分支foo在分支A的分支bar分叉,并且分支bar从分支A分叉,则存储库看起来完全相同{1}}(本地reflog信息除外)。

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

git show

答案 1 :(得分:1)

你可以尝试找到第一次提交分支偏离master的日期,虽然我不确定它有多可靠。一些事情:

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 }