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

时间:2010-02-12 22:02:39

标签: git branch git-branch

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

15 个答案:

答案 0 :(得分:127)

使用

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

如果您更愿意使用gitk在上下文中查看,请使用

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

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

Screenshot

答案 1 :(得分:114)

ponted 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}: 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标志)将显示refs/中所有已知引用的reflog(而不仅仅是{{} 1}})将清楚地显示分支事件:

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

答案 2 :(得分:44)

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

  

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

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

如果您运行以下任一项:

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

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

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

git reflog --date=local <branch>

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

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

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

或者在Windows cmd shell中:

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

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

答案 3 :(得分:38)

首先,如果您的分支是在gc.reflogexpire天内创建的(默认90天,即大约3个月),您可以使用git log -g <branch>git reflog show <branch>查找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.<branchname>.merge条目,它可以告诉你这个分支是基于什么分支。

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

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

您也可以尝试使用git show-branch <branch> master作为替代方案。

这就是gbacon said in his response

答案 4 :(得分:16)

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

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

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

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

git log -g

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

答案 5 :(得分:8)

试试这个

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

答案 6 :(得分:7)

使用:

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

这意味着:

  • 从主人

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

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

答案 7 :(得分:3)

在我找到这个帖子之前,我想出了这个。

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:'

答案 8 :(得分:2)

此命令显示了dev中分支main的创建日期

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

答案 9 :(得分:2)

是为我完成的:(10年后)

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

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

由于我在创建另一个分支之前至少在一个分支中进行过一次提交,因此我可以追溯几个月的分支创建(和功能dev-start)以用于记录。

source: AnoE on stackexchange

答案 10 :(得分:2)

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

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

你可以看到如下图的分支创建 enter image description here

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

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

IAppModel

答案 13 :(得分:0)

结合安德鲁·索恩(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

答案 14 :(得分:0)

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