Как определить, когда была создана ветка Git?

327

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

paxos1977
источник
3
нашел это, что было очень полезно commandlinefu.com/commands/view/2345/…
Брендон-Ван-Хейзен
1
Когда вы задавали этот вопрос, действительно ли вам было интересно узнать дату и время создания ветки, или вам также было интересно узнать, где в вашей истории коммитов ветка была впервые создана, т.е. из?
3
@ Кекс, вопрос довольно понятен. Мне было интересно, когда я создал филиал. Тем не менее, зная, что фиксация будет полезной информацией в общем случае.
paxos1977

Ответы:

151

использование

git show - резюме `git merge-base foo master`

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

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

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

Скриншот

Грег Бэкон
источник
24
Чтобы уточнить ответ, есть два шага к процессу. (1) получить дерево, используя «git merge-base <branch> master», где branch - это интересующая ветка. (2) Используйте treeh в качестве входных данных для git show, чтобы получить дату: "git show --summary <treesh>"
paxos1977
11
Этот ответ, кажется, за исключением того, что ветвь была создана из мастера. Но что, если это не так? Есть ли способ найти первый коммит в ветке с более чем одним дочерним элементом?
Манитра Андриамитондра
20
Это не дата , на которой был филиал создан - это «ветвление» совершить.
Марко
44
Решение будет работать только в том случае, если «ветвь» никогда не была объединена с «главной». Есть ли способ найти самую первую базу слияния для двух ветвей универсально?
Илья Иванов
22
Это показывает базу слияния, а не создание ветви.
Хедли
139

Как указано в комментариях и ответе Джекуба , если ваша ветвь моложе числа дней, установленного в настройке конфигурации 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
Аарон
источник
3
Очень интересно. +1. При условии, конечно, это происходит в течение gc.reflogexpireнескольких дней.
VonC
2
@VonC - ты прав. Значение по умолчанию для gc.reflogexpire составляет 90 дней.
Аарон
1
В заключение! единственный ответ, в котором сам git говорит: "branch: Created from HEAD". Так что эта неуловимая «ветка» Git МОЖЕТ быть отслежена до даты и времени его создания ... Спасибо, +1 награда. Но как насчет этого gc.reflogexpire и как это сделать в удаленных ветках?
Мотти Шнеор
60

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 не будет эффективно работать на удаленных ветвях, только на тех, с которыми вы работали локально.

йо Йо
источник
Хм, я не уверен, насколько полезен этот ответ, мне нужно изучить его позже. Что бы это ни стоило, вы определенно проделали хорошую работу, пытаясь написать что-то всеобъемлющее , а не просто короткий, ленивый частичный ответ, так что это определенно хорошо. Также важно отметить, что вы можете использовать reflog для этого, только если ваша ветка не старше gc.reflogexpireнескольких дней, как указано в этом ответе и этом ответе .
4
Я не хотел дублировать всю полезную информацию о reflogs из других ответов, но рад добавить gc.reflogexpire, если вы считаете, что это полезно. Мой ответ был нацелен на то, чтобы (1) дать больше ясности о том, что такое ветка git и почему ее «история» несколько туманная, (2) поставить полезные команды спереди и по центру, включая (3) показ коммитов на ветке, а не master и (4) поиск рефлога для удаленной ветки. Обратная связь приветствуется.
Йо-й
Спасибо @Cupcake. Как ни странно, у меня изначально были угловые скобки вокруг «ветви», но это исключало все слово из моего предварительного просмотра ответа, поэтому я предположил, что оно было ошибочно обработано как (недействительный) встроенный html.
Йо-й
Этот метод хорошо работал через intellij и BitBucketgit 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запись, которая скажет вам, на какой ветке он основан

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

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

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

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

Якуб Наребски
источник
3
"git reflog show <branch>" работает хорошо, очень явно показывает, когда была создана ветка. Treesh подает в "git show --summary <treesh>"
paxos1977
1
«Git log -g <branch>» был тем, что сработало для меня - много деталей. Нужно быть на ветке, чтобы использовать любой из них.
Лидия
18

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

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

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

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

git log -g

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

Майк Сепловиц
источник
12

Попробуй это

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
Сириш Ярлагадда
источник
3
Возможно, вам понадобится %раньше(refname)
Vor
1
@Vor, я сделал изменение
biniam
Я пролистал это, | cut -c 5- | sort -r |а затем пролистал grep за месяц, предоставив мне список в обратном хронологическом порядке, более или менее.
Нумен
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) из мастера

  • Ветка feature-jira35 создана (оформить заказ -b) из разработки

  • Ветвь feature-jira-sut-46 создана (извлечение -b) из разработки

Де Нгуен
источник
2
но где даты? и вы видите выезд в каждую ветку много раз. Означает ли это, что ПЕРВЫЙ случай, когда каждая ветвь является его созданием?
Мотти Шнеор
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

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

$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.
Chris22
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/
user838900
источник
1

В сочетании с ответом Эндрю Сона ( 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
kivagant
источник
1

Это сделало это для меня: (10 лет спустя)

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

Так как нет хранимой информации о времени создания ветки, то, что это делает, отображает первую фиксацию каждой ветки ( --no-walk), которая включает дату фиксации. Используйте --remotesдля удаленных филиалов или опустите его для локальных филиалов.

Поскольку я делаю по крайней мере один коммит в ветке перед созданием другого, это позволило мне отследить несколько месяцев создания веток (и функции dev-start) для целей документирования.

источник: AnoE на stackexchange

Groo убийца ошибок
источник
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

Jamter
источник