Як визначити, коли була створена гілка Git?


327

Чи є спосіб визначити, коли була створена гілка Git? У мене є відділення мого репо, і я не пам’ятаю, щоб його створити, і думав, що, можливо, бачення часової позначки про створення моє оскарження пам’яті.


3
виявив це дуже корисним commandlinefu.com/commands/view/2345/…
Брендон-Ван-Хейзен

1
Коли ви задавали це запитання, чи дійсно ви просто зацікавлені отримати дату та час створення філії, чи вам також було цікаво дізнатися, де в історії вашої фіксації гілка вперше була створена, тобто, яку комісію ваша філія вперше розгалужувала? з?

3
@Cupcake, питання досить чітке. Мене цікавило, коли я створював філію. Це говорить про те, що знання загального зобов’язання буде корисною інформацією в загальному випадку.
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", де гілка - це галузь, що цікавить. (2) Використовуйте treeh як вхід у git show, щоб отримати дату: "git show --summary <treesh>"
paxos1977

11
Ця відповідь здається винятком лише того, що галузь створена від головного. Але що робити, якщо це не так? Чи є спосіб знайти перший комітет відділення, який має більше 1 дитини?
Манітра Андріамітондра

20
Це не дата , на якій була філія створений - це «розгалуження» зробити.
Марко

44
Рішення спрацює лише в тому випадку, якщо "гілка" ніколи не була об'єднана назад до "master". Чи є спосіб знайти першу базу злиття для двох гілок універсально?
Ілля Іванов

22
Це показує базу злиття, а не створення філій.
Хедлі

139

Як зазначалося в коментарях та відповіді Джакуба , якщо ваша філія молодша за кількість днів, встановлених у налаштуваннях конфігурації gc.reflogexpire(за замовчуванням - 90 днів), ви можете використовувати свій рефлог, щоб дізнатися, коли посилання на гілку було вперше створено.

Зверніть увагу, що git reflogможе взяти більшість git logпрапорів. Далі зауважимо, що HEAD@{0}селектори стилів фактично є поняттям часу і насправді обробляються (зломленим чином) як рядки дати. Це означає, що ви можете використовувати прапор --date=localі отримувати вихід таким чином:

$ git reflog --date = локальний
763008c HEAD @ {Fri 20 серпня 10:09:18 2010}: тягнути: Перемотка вперед
f6cec0a HEAD @ {вт. 10 серпня 09:37:55 2010}: тягнути: Швидкий вперед
e9e70bc HEAD @ {Чт 4 лютого 02:51:10 2010}: тягнути: Швидкий вперед
836f48c HEAD @ {Чт 21 січня 14:08:14 2010}: замовлення: перехід від майстра до майстра
836f48c HEAD @ {Чт 21 січня 14:08:10 2010}: тягнути: Швидкий вперед
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}: тягнути: Швидкий вперед
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 тижні тому}: тягнути: Перемотка вперед
f6cec0a HEAD @ {6 тижнів тому}: тягнути: Швидкий вперед
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-log, зрозумілий git-reflog), покаже рефлоги для всіх відомих рефлексив у refs/(замість просто, HEAD), що чітко покаже вам події філії:

git reflog --date = локальний - всі
860e4e4 refs / heads / master @ {Вс 19 вересня 23:00:30 2010}: фіксація: Друга.
17695bc refs / heads / example_branch @ {Пн 20 вересня 00:31:06 2010}: гілка: Створено з HEAD

3
Дуже цікаво. +1. За умови, звичайно, це відбувається протягом gc.reflogexpireднів.
VonC

2
@VonC - ти прав. Значення за замовчуванням для gc.reflogexpire - 90 днів.
Аарон

1
Нарешті! єдина відповідь, в якій сам git говорить: "гілка: Створено з HEAD". Так що ця невловима річ git МОЖНА бути відстежена до дати та часу її створення ... Дякую, +1 нагорода. Але як щодо тієї речі gc.reflogexpire, і як це зробити на віддалених гілках?
Motti Shneor

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>

показати історію філії. Останній запис у цьому списку - це (ймовірно) точка, в якій ви створили філію.

Якщо гілку видалено, то "гілка" більше не є дійсним ідентифікатором git, але ви можете використовувати це замість цього, який може знайти те, що ви хочете:

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

Або в оболонці cmd Windows:

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

Зауважте, що рефлог не буде ефективно працювати на віддалених гілках, лише ті, над якими ви працювали локально.


Хм, я не впевнений, наскільки корисна ця відповідь, мені потрібно буде її вивчити пізніше. Що варто, хоча ви, безумовно, зробили хорошу роботу, намагаючись написати щось вичерпне , а не просто коротку, ледачу часткову відповідь, тож це безумовно добре. Також важливо зауважити, що ви можете використовувати рефлог для цього лише до тих пір, поки ваша філія не буде старшою за gc.reflogexpireкілька днів, як зазначено в цій відповіді та цій відповіді .

4
Я не хотів дублювати всю хорошу інформацію про відмови з інших відповідей, але радий додати gc.reflogexpire, якщо ви вважаєте, що це корисно. Моя відповідь мала на меті (1) надати більш чітку інформацію про те, що таке гілка гіта, і чому її "історія" дещо туманна, (2) розмістити корисні команди спереду та в центрі, включаючи (3) показ комітів на гілці, а не майстер і (4) схвалення рефлогу для видаленої гілки. Зворотній зв'язок Ласкаво просимо.
yoyo

Дякуємо @Cupcake Як не дивно, спочатку у мене були кутові дужки навколо "гілки", але це знімало все слово з попереднього попереднього перегляду відповіді, тому я припускав, що його помилково трактували як (недійсний) вбудований html.
yoyo

Цей метод добре працював за допомогою Intellij та BitBucketgit reflog --date=local <branch>
isaac weathers

41

По-перше, якщо ваша філія була створена протягом декількох gc.reflogexpireднів (90 днів за замовчуванням, тобто близько 3 місяців), ви можете використовувати git log -g <branch>або git reflog show <branch>знайти перший запис у рефлозі, який би був подією створення, і виглядає приблизно так (нижче 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запис, який би сказав вам, на якій галузі базується ця галузь.

Якщо ви знаєте, що відповідна гілка була створена за межами головної гілки (відщеплення від ведучої гілки), наприклад, ви можете використовувати таку команду, щоб побачити спільного предка:

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

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

Про це сказав у своїй відповіді гбакон .


3
"git reflog show <branch>" працює добре, дуже явно показує, коли створено гілку. Treesh подається на "git show - підсумок <treesh>"
paxos1977

1
"Git log -g <branch>" працював для мене - багато деталей. Щоб використовувати будь-яке з них, потрібно бути на гілці.
Лідія

18

Я ще не впевнений у команді git для цього, але думаю, що ви можете їх знайти в рефлегах.

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

Здається, мої файли мають часову позначку Unix.

Оновлення: Можливо, існує можливість використовувати історію релогізації замість історії фіксації під час друку журналів:

git log -g

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


12

Спробуйте це

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

3
можливо вам знадобиться %раніше(refname)
Vor

1
@Як я змінив
бініям

Я пропустив це наскрізь, | cut -c 5- | sort -r |а потім проклав через grep протягом місяця, надаючи мені список зворотнього хронологічного порядку, більш-менш.
Номенон

2
@Noumenon: for-every-ref може сортувати для вас, додавши напр --sort='-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

Це означає:

  • Розробка відділення створюється (checkout -b) від master

  • Функція відділення-jira35 створюється (checkout -b) з розробки

  • Особливість відділення-jira-sut-46 створюється (check--b) з розробки


2
але де дати? і ви бачите виїзд у кожну галузь багато разів. Чи означає це лише ПЕРШЕ виникнення кожної гілки - це її створення?
Motti Shneor

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/


1

Це зробив це для мене: (10 років потому)

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

Оскільки немає збереженої інформації про часи створення гілок, це робиться, це відображення першої фіксації кожної гілки ( --no-walk), яка включає дату вчинення. Використовуйте--remotes для віддалених гілок або пропустіть для місцевих гілок.

Оскільки я роблю принаймні одну фіксацію у філії перед створенням іншої, це дозволило мені відстежувати кілька місяців створення філій (та демонструвати розробку для розробників) для цілей документації.

джерело: AnoE на stackexchange


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.