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


327

有没有办法确定何时创建Git分支?我在存储库中有一个分支,并且我不记得创建它了,并认为也许看到创建时间戳会拖慢我的记忆。


3
发现这一点,是非常有益的commandlinefu.com/commands/view/2345/...
布兰顿-范- Heyzen

1
当你问这个问题,是你,真的只是兴趣获得创建分支的日期和时间,还是你还想知道哪里在你的提交历史分支首次创建,即,提交您的分公司第一分支从?

3
@Cupcake,问题很清楚。创建分支时,我很感兴趣。也就是说,在一般情况下,了解提交将是方便的信息。
paxos1977

Answers:


151

采用

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

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

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

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

屏幕截图


24
为了阐明答案,该过程分为两个步骤。(1)使用“ git merge-base <branch> master”获得treesh,其中branch是感兴趣的分支。(2)使用treesh作为git show的输入来获取日期:“ git show --summary <treesh>”
paxos1977

11
这个答案似乎只是分支是从master创建的。但是,如果不是这样怎么办?有没有办法找到分支中有多个孩子的第一次提交?
Manitra Andriamitondra 2011年

20
这不是分支创建的日期-这是“分支”提交。
Marco

44
仅当“分支”从未合并回“主”时,该解决方案才有效。有没有办法找到两个分支的第一个合并基础?
Ilya Ivanov

22
这显示的是合并基础,而不是分支创建。
赫德利2014年

139

正如评论Jackub的答案指出的那样,只要您的分支比配置设置中设置的天数年轻gc.reflogexpire(默认为90天),那么您就可以利用您的reflog来查找何时创建分支引用。首先创建。

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

$ git reflog --date =本地
763008c HEAD @ {Fri Aug 20 10:09:18 2010}:拉:快进
f6cec0a HEAD @ {2010年8月10日星期二09:37:55}:pull:快进
e9e70bc HEAD @ {Thu Feb 4 02:51:10 2010}:拉:快进
836f48c HEAD @ {2010年1月21日星期四,14:08:14}:结帐:从主人转移到主人
836f48c HEAD @ {Thu Jan 21 14:08:10 2010}:拉动:快进
24bc734 HEAD @ {2010年1月20日星期三12:05:45}:结帐:从74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD @ {2010年1月20日星期三11:55:43}:结帐:从主服务器移至v2.6.31
24bc734 HEAD @ {2010年1月20日星期三11:44:42}:拉动:快进
964fe08 HEAD @ {2009年10月26日星期一15:29:29}:结帐:从4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a HEAD @ {2009年10月26日星期一14:52:12}:结帐:从主服务器移至v2.6.28

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

$ git reflog --date =相对
763008c HEAD @ {4周前}:pull:快进
f6cec0a HEAD @ {6周前}:pull:快进
e9e70bc HEAD @ {8个月前}:拉:快进
836f48c HEAD @ {8个月前}:结帐:从一个主人转移到另一个主人
836f48c HEAD @ {8个月前}:拉动:快进
24bc734 HEAD @ {8个月前}:结帐:从74fca6a42863ffacaf7ba6f1936a9f228950f657移至母版
74fca6a HEAD @ {8个月前}:结帐:从主服务器迁移到v2.6.31
24bc734 HEAD @ {8个月前}:拉动:快进
964fe08 HEAD @ {11个月前}:结帐:从4a6908a3a050aacc9c3a2f36b276b46c0629ad91移至母版
4a6908a HEAD @ {11个月前}:结帐:从主服务器移至v2.6.28

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

git reflog --date =本地--all
860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}:提交:第二。
17695bc refs / heads / example_branch @ {2010年9月20日星期一00:31:06}:分支:从HEAD创建

3
很有意思。+1。当然,这需要在gc.reflogexpire几天之内完成。
VonC

2
@VonC-正确。gc.reflogexpire的默认值为90天。
亚伦2010年

1
最后!git本身说的唯一答案:“ branch:从HEAD创建”。因此,可以将git难以捉摸的“分支”事物追溯到其创建日期和时间...谢谢,+ 1奖。但是那gc.reflogexpire呢,以及如何在远程分支上做到这一点呢?
Motti Shneor'2

60

Pro Git§3.1 Git分支-什么是分支对git分支的真正含义有很好的解释

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

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

如果您运行以下任何一项:

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

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

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

git reflog --date=local <branch>

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

如果分支已被删除,则“ branch”不再是有效的git标识符,但是您可以改用它,它可以找到所需的内容:

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

或在Windows cmd shell中:

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

请注意,reflog在远程分支上将无法有效工作,只有您在本地工作过的分支才能有效。


嗯,我不确定这个答案有多有用,我需要稍后再研究。但是,就其价值而言,您肯定会努力写出全面的内容,而不仅仅是简短而懒惰的部分答案,因此绝对不错。另外,请务必注意,只要您的分支不超过gc.reflogexpire几天,就只能使用reflog ,如本答案本答案所指出。

4
我不想从其他答案中复制有关reflog的所有好的信息,但是如果您认为有用,很高兴添加gc.reflogexpire。我的回答是要(1)更清楚git分支是什么以及为什么它的“历史”有些模糊,(2)将有用的命令放在前面和中央,包括(3)显示在分支上的提交而不是master和(4)为删除的分支重新编译引用日志。欢迎反馈。
yoyo 2014年

谢谢@Cupcake。有趣的是,我最初在“分支”周围有尖括号,但这将整个单词从我的答案预览中删除,因此我认为它被错误地视为(无效)内联html。
2014年

此方法通过intellij和BitBucket效果很好git reflog --date=local <branch>
天气

41

首先,如果您的分支是在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在回答中所说的


其次,如果分支的存在时间超过了您的分支gc.reflogexpire并且已经运行git gc(或它已经自动运行),则必须与创建该分支的分支找到共同的祖先。看一下配置文件,也许有branch.<branchname>.merge条目,它会告诉您该文件基于哪个分支。

例如,如果您知道所讨论的分支是在master分支之外创建的(从master分支分支),则可以使用以下命令查看公共祖先:

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

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

gbacon在回应中就是这样说的


3
“ git reflog show <branch>”效果很好,非常明确地显示了创建分支的时间。Treesh进入“ git show --summary <treesh>”
paxos1977

1
'git log -g <branch>'是对我有用的那个-很多细节。需要在分支上才能使用其中任何一个。
莉迪亚(Lidia)

18

我现在还不确定git命令,但是我认为您可以在reflogs中找到它们。

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

我的文件似乎在其中包含unix时间戳。

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

git log -g

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


12

尝试这个

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

3
您可能需要%之前(refname)
2015年

1
@Vor我进行了更改
Biniam '16

我用管道输送了这个| cut -c 5- | sort -r |月,然后用管道输送了grep,这给了我一个按时间顺序排列的列表,或多或少。
Noumenon

2
@Noumenon:for-each-ref可以为您排序,方法是添加例如--sort='-committerdate'(按时间顺序排列,请在committerdate之前注意“-”)。
皮特

9

采用:

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

那意味着:

  • 从主创建分支开发(签出-b)

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

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


2
但是日期在哪里?您会看到多次结帐到每个分支。这是否意味着每个分支都是第一次创建?
Motti Shneor '17

4

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

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

3

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

$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中所述
VonC

@Sazzad Hissain Khan这是为我们工作的,因为我们想为一些非技术人员提供“友好的备忘单提示”,这些人对Git的某些复杂性有些迷失。
克里斯

2

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

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

2

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

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


1

为我做到了:(10年后)

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

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

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

来源:Stackexchange上的AnoE


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.