如何确定何时创建Git分支?

pax*_*977 297 git branch git-branch

有没有办法确定何时创建Git分支?我的回购中有一个分支,我不记得创建它,并认为可能看到创建时间戳会慢慢记忆.

Gre*_*con 142

使用

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

如果您更愿意在上下文中看到它,那么请使用

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

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

截图

  • 只有当'branch'从未合并回'master'时,该解决方案才有效.有没有办法找到普遍的两个分支的第一个合并基础? (42认同)
  • 为了澄清答案,该过程有两个步骤.(1)使用"git merge-base <branch> master"获取treesh,其中branch是感兴趣的分支.(2)使用treesh作为git show的输入来获取日期:"git show --summary <treesh>" (24认同)
  • 这显示了合并基础,而不是分支创建. (18认同)
  • 这不是分支_created_的日期 - 这是"分支"提交. (16认同)
  • 这个答案似乎除了分支是从master创建的.但是,如果不是这样呢?有没有办法找到有超过1个孩子的分支的第一次提交? (11认同)
  • @ceretullis,我对“treesh”一词很陌生。这是 _tree_ 和 _hash_ 的混搭吗? (2认同)
  • 这个答案假设了很多事情,这可能不是真的(包括分支名称`master`)并且没有回答问题 (2认同)

Aar*_*ron 121

正如在评论Jackub的回答所说,只要您的分支比配置设置中设置的天数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}: pull : Fast-forward
f6cec0a HEAD@{Tue Aug 10 09:37:55 2010}: pull : Fast-forward
e9e70bc HEAD@{Thu Feb 4 02:51:10 2010}: pull : Fast forward
836f48c HEAD@{Thu Jan 21 14:08:14 2010}: checkout: moving from master to master
836f48c HEAD@{Thu Jan 21 14:08:10 2010}: pull : Fast forward
24bc734 HEAD@{Wed Jan 20 12:05:45 2010}: checkout: moving from 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD@{Wed Jan 20 11:55:43 2010}: checkout: moving from master to v2.6.31
24bc734 HEAD@{Wed Jan 20 11:44:42 2010}: pull : Fast forward
964fe08 HEAD@{Mon Oct 26 15:29:29 2009}: checkout: moving from 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a HEAD@{Mon Oct 26 14:52:12 2009}: checkout: moving from master to v2.6.28

它有时也可能有用--date=relative:

$ git reflog --date=relative
763008c HEAD@{4 weeks ago}: pull : Fast-forward
f6cec0a HEAD@{6 weeks ago}: pull : Fast-forward
e9e70bc HEAD@{8 months ago}: pull : Fast forward
836f48c HEAD@{8 months ago}: checkout: moving from master to master
836f48c HEAD@{8 months ago}: pull : Fast forward
24bc734 HEAD@{8 months ago}: checkout: moving from 74fca6a42863ffacaf7ba6f1936a9f228950f657 to master
74fca6a HEAD@{8 months ago}: checkout: moving from master to v2.6.31
24bc734 HEAD@{8 months ago}: pull : Fast forward
964fe08 HEAD@{11 months ago}: checkout: moving from 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 to master
4a6908a HEAD@{11 months ago}: checkout: moving from master to v2.6.28

最后一个注意事项:--all标志(实际上是git-reflog理解的git-log标志)将显示所有已知引用的reflog refs/(而不是简单地HEAD),它将清楚地显示分支事件:

git reflog --date=local --all
860e4e4 refs/heads/master@{Sun Sep 19 23:00:30 2010}: commit: Second.
17695bc refs/heads/example_branch@{Mon Sep 20 00:31:06 2010}: branch: Created from HEAD

  • 很有意思.+1.当然,这是在`gc.reflogexpire`天内进行的. (3认同)
  • 需要注意的是,“reflog”仅与 _local_ 存储库的历史相关,因此当分支在其他地方创建并_pulled_ 时它不会有任何帮助。在这种情况下,你只能知道你何时拉动分支。 (3认同)
  • @VonC - 对不对.gc.reflogexpire的默认值为90天. (2认同)

yoy*_*oyo 50

ProGit§3.1Git分支 - 什么分支有一个很好的解释git分支的真正含义

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

由于分支只是一个轻量级指针,因此git没有关于其历史或创建日期的明确概念."但请坚持下去,"我听到你说,"当然,git知道我的分支历史!" 好吧,有点.

如果您运行以下任一项:

git log <branch> --not master
gitk <branch> --not master
Run Code Online (Sandbox Code Playgroud)

您将看到看起来像"您的分支的历史记录"的内容,但实际上是一个从"分支"可以从主服务器无法访问的提交列表.这为您提供了所需的信息,但是当且仅当您从未将'branch'合并回master时,并且在创建它之后从未将master合并到'branch'中.如果您合并,则此差异历史将崩溃.

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

git reflog --date=local <branch>
Run Code Online (Sandbox Code Playgroud)

显示分支的历史.此列表中的最后一个条目(可能)是您创建分支的点.

如果分支已被删除,那么'branch'不再是有效的git标识符,但您可以使用它,它可以找到您想要的内容:

git reflog --date=local | grep <branch>
Run Code Online (Sandbox Code Playgroud)

或者在Windows cmd shell中:

git reflog --date=local | find "<branch>"
Run Code Online (Sandbox Code Playgroud)

请注意,reflog不能在远程分支上有效工作,只能在本地工作.

  • 我不想从其他答案中复制有关reflogs的所有好信息,但是如果您认为它有用,我很乐意添加gc.reflogexpire.我的回答是为了(1)更清楚地说明git分支是什么以及为什么它的"历史"有点模糊,(2)将有用的命令放在前面和中心,包括(3)显示分支上的提交而不是master和(4)为删除的分支grep-reflog.欢迎反馈. (4认同)

Jak*_*ski 39

首先,如果您的分支是在gc.reflogexpire几天内创建的(默认90天,即大约3个月),您可以使用git log -g <branch>git reflog show <branch>查找reflog中的第一个条目,这将是创建事件,看起来如下(for git log -g):

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

你会得到谁创建了一个分支,前几个操作,以及从哪个分支(好吧,它可能只是"从HEAD创建",这没有多大帮助).

这就是MikeSep在他的回答中所说的.


其次,如果你的分支持续时间超过gc.reflogexpire并且你已经运行git gc(或者它已经自动运行),你必须找到它所创建的分支的共同祖先.看看配置文件,也许有branch.<branchname>.merge条目,它会告诉你这个分支是基于什么分支.

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

git show $(git merge-base <branch> master)
Run Code Online (Sandbox Code Playgroud)

您也可以尝试git show-branch <branch> master,作为替代方案.

这就是gbacon在回答中所说的.

  • "git reflog show <branch>"运行良好,非常明确地显示分支何时创建.Treesh加入"git show --summary <treesh>" (3认同)

Mik*_*itz 18

我还不确定它的git命令,但我认为你可以在reflog中找到它们.

.git/logs/refs/heads/<yourbranch>
Run Code Online (Sandbox Code Playgroud)

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

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

git log -g
Run Code Online (Sandbox Code Playgroud)

您也可以按照此日志,返回创建分支时的状态.git log但是,显示提交的日期,而不是您在reflog中创建条目的操作的日期.我还没有发现,除了查看上面路径中的实际reflog.


Sir*_*dda 11

试试这个

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
Run Code Online (Sandbox Code Playgroud)

  • 你可能在`(refname)`之前需要`%` (3认同)
  • @Noumenon:for-each-ref可以通过添加例如`--sort =' - committerdate'来为你排序(注意反向时间顺序的committerdate之前的' - '). (2认同)

Jam*_*ter 9

句法: 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


小智 8

使用:

git reflog
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着:

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

  • 从开发创建分支功能-jira35(checkout -b)

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

  • 但是日期在哪里?您会看到多次结帐到每个分支。这是否意味着每个分支都是第一次创建? (2认同)

Saz*_*han 6

此命令显示分支的创建日期devmain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Run Code Online (Sandbox Code Playgroud)


And*_*ohn 5

这是我在找到这个线程之前想到的。

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


小智 5

为我做到了:(10 年后)

git log [--remotes] --no-walk --decorate
Run Code Online (Sandbox Code Playgroud)

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

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

来源:stackexchange上的AnoE

  • @JqueryToAddNumbers 对我来说也是如此。它显示了*最后*提交,而不是*第一次*。 (2认同)

RCv*_*ram 5

如何通过 Github GUI 知道

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

  1. 转到见解选项卡。
  2. 选择边栏中的网络选项卡。

您可以看到如下所示的分支创建 在此处输入图片说明