Как определить, когда была создана ветка Git? - PullRequest
270 голосов
/ 13 февраля 2010

Есть ли способ определить , когда была создана ветка Git? У меня есть филиал в моем репо, и я не помню, как создавал его, и подумал, что, возможно, просмотр временной метки сотрясет память.

Ответы [ 9 ]

127 голосов
/ 13 февраля 2010

Используйте

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

Если вы предпочитаете видеть это в контексте, используя gitk, тогда используйте

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

(где foo - название ветви, которую вы ищете.)

Screenshot

114 голосов
/ 20 сентября 2010

Как указано в комментариях и в Ответ Джекуба , если ваша ветвь моложе числа дней, установленного в настройке конфигурации gc.reflogexpire (по умолчанию 90 дней), затем вы можете использовать свой журнал ссылок, чтобы узнать, когда ссылка на ветку была впервые создана.

Обратите внимание, что 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-log, понятным для git-reflog) покажет reflogs для всех известных ссылок в 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
46 голосов
/ 24 июля 2014

Pro Git & sect; 3.1. Ветвь Git - что такое ветвь имеет хорошее объяснение того, что на самом деле представляет собой ветка git

Ветвь в Git - это просто легкий подвижный указатель на [a] commit.

Поскольку ветвь является просто легким указателем, 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:

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

Обратите внимание, что reflog не будет эффективно работать в удаленных филиалах, только в тех, над которыми вы работали локально.

38 голосов
/ 13 февраля 2010

Во-первых, если ваша ветка была создана в течение 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, которая скажет вам, на какой ветке она основана.

Если вы знаете, что рассматриваемая ветка была создана, например, из главной ветви (ветвление из главной ветви), вы можете использовать следующую команду, чтобы увидеть общего предка:

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

Вы также можете попробовать git show-branch <branch> master, в качестве альтернативы.

Это то, что Гбэкон сказал в своем ответе .

16 голосов
/ 13 февраля 2010

Я не уверен в команде git для этого, но я думаю, что вы можете найти их в reflogs.

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

Похоже, в моих файлах есть метка времени Unix.

Обновление: Возможно, при печати журналов существует возможность использовать историю рефлогов вместо истории фиксации:

git log -g

Вы также можете следить за этим журналом, когда вы создали ветку. git log показывает дату коммита, но не дату, когда вы сделали действие, которое сделало запись в reflog. Я еще не нашел этого, за исключением того, что посмотрел фактический reflog по указанному выше пути.

8 голосов
/ 03 сентября 2015

Попробуйте это

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
8 голосов
/ 29 января 2015

Используйте:

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 isсоздано (извлечено -b) из разработки

3 голосов
/ 10 января 2013

Это то, что я придумал, прежде чем нашел эту тему.

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:'
2 голосов
/ 06 марта 2019

Эта команда показывает дату создания ветки dev из main

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