Есть ли способ определить, когда была создана ветка Git? У меня есть филиал в моем репо, и я не помню, как его создавал, и подумал, что, возможно, просмотр временной метки сотрясет мою память.
Есть ли способ определить, когда была создана ветка Git? У меня есть филиал в моем репо, и я не помню, как его создавал, и подумал, что, возможно, просмотр временной метки сотрясет мою память.
Ответы:
использование
git show - резюме `git merge-base foo master`
Если вы хотите увидеть это в контексте, используя gitk, то используйте
gitk --all --select-commit = `git merge-base foo master`
(где foo - название ветви, которую вы ищете.)
Как указано в комментариях и ответе Джекуба , если ваша ветвь моложе числа дней, установленного в настройке конфигурации gc.reflogexpire
(по умолчанию 90 дней), вы можете использовать свой журнал регистрации, чтобы узнать, когда ссылка на ветку была впервые создан.
Обратите внимание, что git reflog
может принимать большинство git log
флагов. Также отметим, что HEAD@{0}
селекторы стиля - это, по сути, понятия времени и, фактически, они обрабатываются (взломанным способом) как строки даты. Это означает, что вы можете использовать флаг --date=local
и получать вывод следующим образом:
$ git reflog --date = local 763008c HEAD @ {Пт, 20 августа 10:09:18 2010}: pull: Перемотка вперед f6cec0a HEAD @ {вт 10 авг 09:37:55 2010}: pull: перемотка вперед e9e70bc HEAD @ {Четверг, 4 февраля 02:51:10 2010}: pull: Перемотка вперед 836f48c HEAD @ {Чт 21 января 14:08:14 2010}: оформить заказ: переход от мастера к мастеру 836f48c HEAD @ {Чт 21 января 14:08:10 2010}: pull: Перемотка вперед 24bc734 HEAD @ {ср 20 января 12:05:45 2010}: оформление заказа: переезд с 74fca6a42863ffacaf7ba6f1936a9f228950f657 74fca6a HEAD @ {Ср 20 Янв 11:55:43 2010}: оформление заказа: переход от мастера к v2.6.31 24bc734 HEAD @ {Ср 20 Янв 11:44:42 2010}: pull: Быстрая перемотка вперед 964fe08 HEAD @ {Понедельник, 26 октября 15:29:29 2009}: оформление заказа: переезд с 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 4a6908a HEAD @ {Понедельник, 26 октября 14:52:12 2009}: оформление заказа: переход от мастера к v2.6.28
Иногда может быть полезно использовать --date=relative
:
$ git reflog --date = относительный 763008c HEAD @ {4 недели назад}: pull: перемотка вперед f6cec0a HEAD @ {6 недель назад}: pull: перемотка вперед e9e70bc HEAD @ {8 месяцев назад}: pull: ускоренная перемотка вперед 836f48c HEAD @ {8 месяцев назад}: оформление заказа: переход от мастера к мастеру 836f48c HEAD @ {8 месяцев назад}: pull: ускоренная перемотка вперед 24bc734 HEAD @ {8 месяцев назад}: оформление заказа: переход от 74fca6a42863ffacaf7ba6f1936a9f228950f657 к мастеру 74fca6a HEAD @ {8 месяцев назад}: оформление заказа: переход от мастера к v2.6.31 24bc734 HEAD @ {8 месяцев назад}: pull: ускоренная перемотка вперед 964fe08 HEAD @ {11 месяцев назад}: оформление заказа: переход от 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 к мастеру 4a6908a HEAD @ {11 месяцев назад}: оформление заказа: переход от мастера к v2.6.28
Последнее замечание: --all
флаг (который на самом деле является флагом git-log, понятным для git-reflog) покажет reflogs для всех известных ссылок в refs/
(а не просто HEAD
), которые ясно покажут вам события ветвления:
git reflog --date = local --all 860e4e4 refs /heads / master @ {Вс 19 сентября 23:00:30 2010}: commit: Second. 17695bc refs / heads / example_branch @ {Пн 20 сен. 00:31:06 2010}: branch: Создано из HEAD
gc.reflogexpire
нескольких дней.
Pro Git § 3.1 Git ветвление - что такое ветвь, имеет хорошее объяснение того, что на самом деле представляет собой git ветвь
Ветвь в Git - это просто легкий подвижный указатель на [a] commit.
Поскольку ветвь является просто легким указателем, git не имеет явного представления о своей истории или дате создания. «Но держись, - слышу ты, говоришь, - конечно, мерзавец знает историю моей ветки!» Ну вроде.
Если вы выполните одно из следующих действий:
git log <branch> --not master
gitk <branch> --not master
вы увидите то, что выглядит как «история вашей ветви», но на самом деле это список коммитов, доступных из «ветви», которые недоступны из master. Это дает вам информацию, которую вы хотите, но тогда и только тогда, когда вы никогда не сливали «ветку» обратно в мастер и никогда не объединяли мастер в «ветку» с момента ее создания. Если вы уже объединены, то эта история разногласий разрушится.
К счастью, рефлог часто содержит информацию, которую вы хотите, как объяснено в различных других ответах здесь. Использовать это:
git reflog --date=local <branch>
показать историю отрасли. Последняя запись в этом списке (вероятно) - это точка, в которой вы создали ветку.
Если ветвь была удалена, то ветвь больше не является допустимым идентификатором git, но вы можете использовать это вместо этого, что может найти то, что вы хотите:
git reflog --date=local | grep <branch>
Или в оболочке Windows cmd:
git reflog --date=local | find "<branch>"
Обратите внимание, что reflog не будет эффективно работать на удаленных ветвях, только на тех, с которыми вы работали локально.
gc.reflogexpire
нескольких дней, как указано в этом ответе и этом ответе .
git reflog --date=local <branch>
Во-первых, если ваша ветка была создана в течение 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
, как альтернативу.
Вот что сказал Гбэкон в своем ответе .
Я не уверен в команде git для этого, но я думаю, что вы можете найти их в reflogs.
.git/logs/refs/heads/<yourbranch>
У моих файлов есть метка времени Unix.
Обновление: при печати журналов появляется возможность использовать историю рефлогов вместо истории фиксации:
git log -g
Вы также можете следить за этим журналом, когда вы создали ветку. git log
показывает дату фиксации, а не дату, когда вы сделали действие, которое сделало запись в reflog. Я еще не нашел этого, за исключением того, что посмотрел фактический рефлог в пути выше.
Попробуй это
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
%
раньше(refname)
| cut -c 5- | sort -r |
а затем пролистал grep за месяц, предоставив мне список в обратном хронологическом порядке, более или менее.
--sort='-committerdate'
(обратите внимание на '-' перед committerdate для обратного хронологического порядка).
Использование:
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) из мастера
Ветка feature-jira35 создана (оформить заказ -b) из разработки
Ветвь feature-jira-sut-46 создана (извлечение -b) из разработки
Эта команда показывает дату создания ветки dev
отmain
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Если вы хотите получить детали для всех филиалов
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 for-each-ref --sort=-committerdate refs/heads/
В сочетании с ответом Эндрю Сона ( 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
Это сделало это для меня: (10 лет спустя)
git log [--remotes] --no-walk --decorate
Так как нет хранимой информации о времени создания ветки, то, что это делает, отображает первую фиксацию каждой ветки ( --no-walk
), которая включает дату фиксации. Используйте --remotes
для удаленных филиалов или опустите его для локальных филиалов.
Поскольку я делаю по крайней мере один коммит в ветке перед созданием другого, это позволило мне отследить несколько месяцев создания веток (и функции dev-start) для целей документирования.
источник: AnoE на stackexchange