【问题标题】:How to determine when a Git branch was created?如何确定 Git 分支的创建时间?
【发布时间】:2011-01-16 08:37:09
【问题描述】:

有没有办法确定何时创建了 Git 分支?我的仓库中有一个分支,我不记得创建它,我想也许看到创建时间戳会唤起我的记忆。

【问题讨论】:

  • 当你问这个问题时,你真的只是想知道分支的创建日期和时间,还是你也想知道你的提交历史中的 where分支是第一次创建的,即你的分支首先是从哪个提交分支出来的?
  • @Cupcake,问题很清楚。当我创建分支时,我很感兴趣。也就是说,在一般情况下,知道提交将是方便的信息。

标签: git branch git-branch


【解决方案1】:

如何通过 Github GUI 了解

我展示了所有的答案,没有人用 UI 给出答案。如果有人想查看何时通过 Github UI 创建分支。

  1. 转到“洞察”选项卡。
  2. 选择边栏中的“网络”选项卡。

您可以看到如下所示的分支创建

【讨论】:

    【解决方案2】:

    语法: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

    示例: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

    结果: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

    【讨论】:

      【解决方案3】:

      为我做到了:(10 年后)

      git log [--remotes] --no-walk --decorate
      

      由于没有存储有关分支创建时间的信息,因此它的作用是显示每个分支的第一次提交 (--no-walk),其中包括提交的日期。远程分支使用--remotes,本地分支省略。

      由于我在创建另一个分支之前至少在一个分支中进行了一次提交,这允许我追溯几个月的分支创建(和功能开发启动)以用于文档目的。

      source: AnoE 在 stackexchange 上

      【讨论】:

      • @JqueryToAddNumbers 对我来说也是如此。它显示了 last 提交而不是 first.
      • 确实列出了每个分支,但是显示了每个分支的最后一次提交
      【解决方案4】:

      我找到了最好的方法: 我总是检查通过这种方式创建的最新分支

      git for-each-ref --sort=-committerdate refs/heads/
      

      【讨论】:

        【解决方案5】:

        作为pointed out in the commentsJackub's answer,只要你的分支比配置设置gc.reflogexpire中设置的天数(默认为90天),那么你可以利用你的reflog找出首次创建分支引用的时间。

        请注意,git reflog 可以采用大多数 git log 标志。进一步注意HEAD@{0} 样式选择器实际上是时间的概念,事实上,被处理(以一种被黑客入侵的方式)作为日期字符串。这意味着您可以使用标志 --date=local 并获得如下输出:

        $ git reflog --date=local
        763008c HEAD@{Fri Aug 20 10:09:18 2010}:拉:快进
        f6cec0a HEAD@{Tue Aug 10 09:37:55 2010}:拉:快进
        e9e70bc HEAD@{Thu Feb 4 02:51:10 2010}:拉:快进
        836f48c HEAD@{Thu Jan 21 14:08:14 2010}:结帐:从大师转移到大师
        836f48c HEAD@{Thu Jan 21 14:08:10 2010}:拉:快进
        24bc734 HEAD@{Wed Jan 20 12:05:45 2010}:结帐:从 74fca6a42863ffacaf7ba6f1936a9f228950f657 移动
        74fca6a HEAD@{Wed Jan 20 2010 11:55:43 2010}:结帐:从 master 移动到 v2.6.31
        24bc734 HEAD@{Wed Jan 20 11:44:42 2010}:拉:快进
        964fe08 HEAD@{Mon Oct 26 15:29:29 2009}:结帐:从 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 移动
        4a6908a HEAD@{Mon Oct 26 14:52:12 2009}:结帐:从 master 移动到 v2.6.28
        

        有时也可以使用--date=relative

        $ git reflog --date=relative
        763008c HEAD@{4 周前}:拉:快进
        f6cec0a HEAD@{6 周前}:拉:快进
        e9e70bc HEAD@{8 个月前}: pull : 快进
        836f48c HEAD@{8 个月前}:结帐:从大师转移到大师
        836f48c HEAD@{8 个月前}:拉:快进
        24bc734 HEAD@{8 个月前}:结帐:从 74fca6a42863ffacaf7ba6f1936a9f228950f657 移动到 master
        74fca6a HEAD@{8 个月前}:结帐:从 master 迁移到 v2.6.31
        24bc734 HEAD@{8 个月前}:拉:快进
        964fe08 HEAD@{11 个月前}:结帐:从 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 移动到 master
        4a6908a HEAD@{11 个月前}:结帐:从 master 迁移到 v2.6.28
        

        最后一点:--all 标志(实际上是 git-reflog 理解的 git-log 标志)将显示refs/(而不是简单的HEAD)中所有已知参考的参考日志,这将清楚地向您展示分支事件:

        git reflog --date=local --all
        860e4e4 refs/heads/master@{Sun Sep 19 23:00:30 2010}:提交:第二。
        17695bc refs/heads/example_branch@{Mon Sep 20 00:31:06 2010}:分支:从 HEAD 创建
        

        【讨论】:

        • 非常有趣。 +1。当然,前提是这发生在gc.reflogexpire 天内。
        • @VonC — 没错。 gc.reflogexpire 的默认值为 90 天。
        • 请务必注意,reflog 仅与 本地 存储库的历史相关,因此当分支在其他地方创建并拉出时它不会有帮助>。那样的话,你只能在拉树枝的时候才知道。
        • 最佳答案!应该在上面
        【解决方案6】:

        如果您想获取所有分支的详细信息

        for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done
        

        【讨论】:

          【解决方案7】:

          结合 Andrew Sohn (https://stackoverflow.com/a/14265207/1929406) 的回答

          branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
          echo $branchcreated
          

          【讨论】:

            【解决方案8】:

            使用

            git show --summary `git merge-base foo master`

            如果您希望使用 gitk 在上下文中查看它,请使用

            gitk --all --select-commit=`git merge-base foo master`

            (其中 foo 是您要查找的分支的名称。)

            【讨论】:

            • 为了澄清答案,该过程分为两个步骤。 (1) 使用“git merge-base master”获取treesh,其中分支是感兴趣的分支。 (2) 使用 treesh 作为 git show 的输入来获取日期:"git show --summary "
            • 这个答案似乎除了分支是从master创建的。但如果不是这样呢?有没有办法找到具有超过 1 个孩子的分支的第一次提交?
            • 这不是分支创建的日期——这是“分支”提交。
            • 只有在 'branch' 从未合并回 'master' 的情况下,该解决方案才有效。有没有办法普遍找到两个分支的第一个合并基础?
            • 这是显示合并基础,而不是分支创建。
            【解决方案9】:

            此命令显示从main 到分支dev 的创建日期

            $git reflog show --date=iso dev
            $7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
            

            【讨论】:

            • "分支的创建日期"...如果少于 90 天。如果它的创建时间超过 90 天,则该信息将被清除。如上所述stackoverflow.com/a/3748722/6309.
            • @Sazzad Hissain Khan 这个对我们有用,因为我们想为一些对 Git 的一些复杂性感到迷茫的非技术人员提供“友好的备忘单提示”。
            【解决方案10】:

            试试这个

              git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
            

            【讨论】:

            • 你可能在(refname)之前需要%
            • @Vor 我做了更改
            • 我通过| cut -c 5- | sort -r | 传递了这个,然后通过 grep 传递了这个月,给了我一个按时间倒序排列的列表,或多或少。
            • @Noumenon: for-each-ref 可以为您排序,通过添加例如--sort='-committerdate'(请注意提交日期前的“-”以按时间倒序排列)。
            【解决方案11】:

            用途:

            git reflog
            

            在当前文件夹中显示存储库的所有生命周期。 首先出现的分支名称(从下到上)是创建的源。

            855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
            855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
            855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
            535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
            855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
            855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
            535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
            855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
            855a3ce HEAD@{8}: checkout: moving from master to development
            

            意思是:

            • 从master创建分支开发(checkout -b)

            • 从开发中创建分支 feature-jira35 (checkout -b)

            • 从开发中创建分支 feature-jira-sut-46 (checkout -b)

            【讨论】:

            • 但是日期在哪里?而且您会多次看到每个分支的签出。这是否意味着每个分支只有第一次出现是它的创建?
            【解决方案12】:

            Pro Git § 3.1 Git Branching - What a Branch Is 很好地解释了 git 分支的真正含义

            Git 中的分支只是指向 [a] 提交的轻量级可移动指针。

            由于分支只是一个轻量级指针,git 没有明确的历史或创建日期概念。 “但是等等,”我听到你说,“git当然知道我的分支历史!”嗯,有点。

            如果您运行以下任一操作:

            git log <branch> --not master
            gitk <branch> --not master
            

            你会看到看起来像“你的分支的历史”,但实际上是一个从“分支”可访问的提交列表,而这些提交是无法从 master 访问的。这将为您提供所需的信息,但当且仅当您从未将“分支”合并回主控,并且自创建以来从未将主控合并到“分支”。如果你已经合并了,那么这段差异的历史将会崩溃。

            幸运的是,reflog 通常包含您想要的信息,如此处的各种其他答案中所述。使用这个:

            git reflog --date=local <branch>
            

            显示分支的历史。此列表中的最后一项(可能)是您创建分支的点。

            如果分支已被删除,则“分支”不再是有效的 git 标识符,但您可以改用它,它可能会找到您想要的:

            git reflog --date=local | grep <branch>
            

            或者在 Windows cmd shell 中:

            git reflog --date=local | find "<branch>"
            

            请注意,reflog 不会在远程分支上有效地工作,只能在您在本地工作过的分支上有效。

            【讨论】:

            • 嗯,我不确定这个答案有多大用处,我需要稍后再研究它。不过,就其价值而言,您确实在努力编写全面的东西方面做得很好,而不仅仅是一个简短的、懒惰的部分答案,所以这绝对是好的。此外,请务必注意,只要您的分支不早于 gc.reflogexpire 天,您就只能为此使用 reflog,正如 this answerthis answer 中所指出的那样。
            • 我不想从其他答案中复制所有关于 reflogs 的好信息,但如果您认为它有用,很高兴添加 gc.reflogexpire。我的回答旨在(1)更清楚地说明 git 分支是什么以及为什么它的“历史”有些模糊,(2)将有用的命令放在前面和中心,包括(3)显示分支上的提交而不是 master 和(4) 对已删除分支的 reflog 进行 grep-ing。欢迎反馈。
            • 谢谢@Cupcake。有趣的是,我最初在“分支”周围有尖括号,但这将整个单词从我的答案预览中剥离出来,所以我认为它被错误地视为(无效)内联 html。
            • 此方法通过 intellij 和 BitBucket git reflog --date=local &lt;branch&gt; 运行良好
            【解决方案13】:

            这是我在找到这个帖子之前想出的。

            git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
            git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'
            

            【讨论】:

              【解决方案14】:

              首先,如果您的分支是在gc.reflogexpire 天(默认90 天,即大约3 个月)内创建的,您可以使用git log -g &lt;branch&gt;git reflog show &lt;branch&gt; 在reflog 中找到第一个条目,这将是创建事件,并且看起来像下面(git log -g):

              Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
              Reflog message: branch: Created from <some other branch>
              

              你会知道谁创建了一个分支,之前有多少操作,以及来自哪个分支(嗯,它可能只是“从 HEAD 创建”,这没有多大帮助)。

              这就是MikeSep said in his answer


              其次,如果您的分支时间超过 gc.reflogexpire 并且您已经运行了 git gc(或者它是自动运行的),您将必须找到与创建它的分支的共同祖先。查看配置文件,可能有branch.&lt;branchname&gt;.merge 条目,它会告诉你这是基于哪个分支。

              如果您知道相关分支是从 master 分支创建的(从 master 分支分支),例如,您可以使用以下命令查看共同祖先:

              git show $(git merge-base <branch> master)
              

              您也可以尝试git show-branch &lt;branch&gt; master,作为替代方案。

              这就是gbacon said in his response

              【讨论】:

              • "git reflog show " 效果很好,非常明确地显示了分支的创建时间。 Treesh 输入“git show --summary
              • 'git log -g ' 对我有用 - 有很多细节。需要在分支上才能使用其中任何一个。
              【解决方案15】:

              我还不确定它的 git 命令,但我想你可以在 reflogs 中找到它们。

              .git/logs/refs/heads/<yourbranch>
              

              我的文件中似乎有一个 unix 时间戳。

              更新: 打印日志时似乎可以选择使用 reflog 历史记录而不是提交历史记录:

              git log -g
              

              您也可以关注此日志,回到您创建分支的时间。 git log 显示的是提交的日期,而不是您在 reflog 中进行条目的操作的日期。除了查看上面路径中的实际引用日志外,我还没有发现。

              【讨论】:

                猜你喜欢
                • 2021-09-16
                • 2018-12-13
                • 1970-01-01
                • 2018-09-27
                • 2016-01-11
                • 1970-01-01
                • 2015-04-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多