【问题标题】:Find the age of a git branch查找 git 分支的年龄
【发布时间】:2015-03-22 10:41:14
【问题描述】:

例如,假设我有 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? 或者以某种方式找出哪一个分支起源于另一个? 除了我知道主人的名字是我最年长的事实。

【问题讨论】:

    标签: git git-branch git-merge


    【解决方案1】:

    如果您对创建分支(在您的本地存储库中)感兴趣,并且相关分支是在不久前创建的(少于 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':引用日志选择器,例如,refs/stash@{1}
    • '%gd':缩短的引用日志选择器,例如,stash@{1}
    • '%gn': reflog 身份名称
    • '%gN': reflog 身份名称(尊重 .mailmap,请参阅
    • “%ge”:重新登录身份电子邮件
    • '%gE':reflog 身份电子邮件(尊重 .mailmap,请参阅
    • '%gs': reflog 主题


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

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

    其次,您还需要知道相关分支被分叉的分支(或一组分支);如果分支foo 在提交A 从分支bar 分叉,并且当分支bar 在提交A 从分支A 分叉时,存储库看起来完全相同(本地引用日志信息除外) .

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

    $ 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
    

    【讨论】:

    • 只是为了补充 Jakub 的答案:除了 reflog(严格是本地的)之外,Git 不会记录分支的创建日期。
    【解决方案2】:

    您可以尝试查找偏离 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 }
    

    【讨论】:

    • 对于脚本,请使用git for-each-refgit show-ref 而不是以用户为中心的git branch
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2012-08-29
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多