有没有办法确定Git 分支的创建时间?我的仓库中有一个分支,我不记得创建它,我想也许看到创建时间戳会唤起我的记忆。
15 回答
正如评论和Jackub 的回答中所指出的,只要您的分支比配置设置中设置的天数(默认为 90 天)年轻,那么您可以利用您的 reflog 找出分支引用的时间首次创建。gc.reflogexpire
请注意,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 的 reflogs 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 创建
采用
git show --summary `git merge-base foo master`
如果您希望使用 gitk 在上下文中查看它,请使用
gitk --all --select-commit=`git merge-base foo master`
(其中 foo 是您要查找的分支的名称。)
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
几天内创建的(默认为 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 创建”,这没有多大帮助)。
其次,如果您的分支时间超过gc.reflogexpire
并且您已经运行git gc
(或者它是自动运行的),您将必须找到与创建它的分支的共同祖先。看一下配置文件,也许有branch.<branchname>.merge
条目,它会告诉你这个是基于哪个分支的。
例如,如果您知道有问题的分支是从 master 分支(从 master 分支分支)创建的,则可以使用以下命令查看共同祖先:
git show $(git merge-base <branch> master)
您也可以尝试git show-branch <branch> master
, 作为替代方案。
这就是gbacon 在他的回应中所说的。
我还不确定它的 git 命令,但我认为你可以在 reflogs 中找到它们。
.git/logs/refs/heads/<yourbranch>
我的文件中似乎有一个 unix 时间戳。
更新:打印日志时似乎可以选择使用 reflog 历史记录而不是提交历史记录:
git log -g
您也可以关注此日志,回到您创建分支的时间。git log
但是,显示的是提交日期,而不是您执行在 reflog 中输入的操作的日期。除了查看上面路径中的实际引用日志外,我还没有发现。
试试这个
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
采用:
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)
这为我做到了:(10年后)
git log [--remotes] --no-walk --decorate
由于没有存储有关分支创建时间的信息,因此它的作用是显示每个分支的第一次提交 ( --no-walk
),其中包括提交的日期。用于--remotes
远程分支,或省略本地分支。
由于我在创建另一个分支之前至少在一个分支中进行了一次提交,因此这允许我追溯几个月的分支创建(以及功能开发启动)以用于文档目的。
资料来源:stackexchange上的AnoE
此命令显示分支的创建dev
日期main
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
这是我在找到这个帖子之前想出的。
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:'
我找到了最好的方法:我总是检查通过这种方式创建的最新分支
git for-each-ref --sort=-committerdate refs/heads/
结合 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
如果您想获取所有分支的详细信息
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
句法:
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