Jak ustalić, kiedy utworzono oddział Git?


327

Czy istnieje sposób ustalenia, kiedy utworzono oddział Git? Mam repozytorium w repozytorium i nie pamiętam, aby je utworzyć i pomyślałem, że może zobaczenie znacznika czasu utworzenia pobudzi moją pamięć.


3
stwierdził, że było to bardzo pomocne commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen

1
Kiedy zadałeś to pytanie, czy naprawdę chciałeś tylko uzyskać datę i godzinę utworzenia oddziału, czy też chciałeś wiedzieć, gdzie w historii zatwierdzeń gałąź została utworzona po raz pierwszy, tj. Które zatwierdzenie gałęzi zostały najpierw rozgałęzione od?

3
@Ciastko, pytanie jest dość jasne. Byłem zainteresowany, kiedy tworzyłem oddział. To powiedziawszy, wiedząc, że zatwierdzenie byłoby przydatną informacją w ogólnym przypadku.
paxos1977,

Odpowiedzi:


151

Posługiwać się

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

Jeśli wolisz widzieć go w kontekście za pomocą gitk, użyj

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

(gdzie foo to nazwa gałęzi, której szukasz).

Zrzut ekranu


24
Aby wyjaśnić odpowiedź, proces składa się z dwóch etapów. (1) uzyskaj drzewko za pomocą „git merge-base <branch> master”, gdzie gałąź jest gałęzią zainteresowania. (2) Użyj drzewka jako danych wejściowych do programu git, aby uzyskać datę: „git show - podsumowanie <treesh>”
paxos1977

11
Ta odpowiedź wydaje się być taka, że ​​gałąź została utworzona z poziomu głównego. Ale co, jeśli tak nie jest? Czy istnieje sposób na znalezienie pierwszego zatwierdzenia oddziału mającego więcej niż 1 dziecko?
Manitra Andriamitondra

20
To nie jest dzień, w którym oddział został utworzony - to „rozgałęzienia” popełnić.
Marco

44
Rozwiązanie będzie działać tylko wtedy, gdy „oddział” nigdy nie zostanie ponownie połączony z „głównym”. Czy istnieje sposób, aby znaleźć pierwszą bazę scalania dla dwóch oddziałów?
Ilya Ivanov

22
To pokazuje bazę scalania, a nie tworzenie gałęzi.
Hedley

139

Jak wskazano w komentarzach i odpowiedzi Jackuba , o ile gałąź jest młodsza niż liczba dni ustawiona w ustawieniu konfiguracji gc.reflogexpire(domyślnie 90 dni), możesz użyć swojego dziennika, aby dowiedzieć się, kiedy odwołanie do gałęzi było pierwszy stworzony.

Pamiętaj, że git reflogmoże przyjąć większość git logflag. Ponadto zauważ, że HEAD@{0}selektory stylów są faktycznie pojęciem czasu i w rzeczywistości są traktowane (w sposób zhakowany) jako ciągi dat. Oznacza to, że możesz użyć flagi --date=locali uzyskać wynik w następujący sposób:

$ git reflog --date = local
763008c HEAD @ {Fri Aug 20 10:09:18 2010}: pull: Przewijanie do przodu
f6cec0a HEAD @ {Tue Aug 10 09:37:55 2010}: pull: Przewijanie do przodu
e9e70bc HEAD @ {czw 4 lutego 02:51:10 2010}: pull: przewijanie do przodu
836f48c HEAD @ {Thu Jan 21 14:08:14 2010}: kasy: przejście od mistrza do mistrza
836f48c HEAD @ {Thu Jan 21 14:08:10 2010}: pull: Przewiń do przodu
24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}: Kasa: Przeprowadzka z 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}: Kasa: przejście z Master do v2.6.31
24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}: pull: Fast forward
964fe08 HEAD @ {Mon Oct 26 15:29:29 2009}: Kasa: Przeprowadzka z 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a HEAD @ {pon 26 października 14:52:12 2009}: kasa: przejście z systemu głównego do v2.6.28

Czasami może być przydatne użycie --date=relative:

$ git reflog --date = względna
763008c HEAD @ {4 tygodnie temu}: pull: Przewijanie do przodu
f6cec0a HEAD @ {6 tygodni temu}: pull: przewijanie do przodu
e9e70bc HEAD @ {8 miesięcy temu}: pull: Fast forward
836f48c HEAD @ {8 miesięcy temu}: kasa: przejście od mistrza do mistrza
836f48c HEAD @ {8 miesięcy temu}: pull: Fast forward
24bc734 HEAD @ {8 miesięcy temu}: kasa: przejście z 74fca6a42863ffacaf7ba6f1936a9f228950f657 do opanowania
74fca6a HEAD @ {8 miesięcy temu}: kasa: przejście z wersji master do v2.6.31
24bc734 HEAD @ {8 miesięcy temu}: pull: Fast forward
964fe08 HEAD @ {11 miesięcy temu}: kasa: przejście z 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 do opanowania
4a6908a HEAD @ {11 miesięcy temu}: kasa: przejście z systemu głównego do v2.6.28

Ostatnia uwaga: --allflaga (która jest tak naprawdę flagą git-log rozumianą przez git-reflog) pokaże rekordy dla wszystkich znanych ref w refs/(zamiast po prostu HEAD), co wyraźnie pokaże zdarzenia rozgałęzienia:

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: Utworzono z HEAD

3
Bardzo interesujące. +1. Oczywiście pod warunkiem, że nastąpi to w gc.reflogexpireciągu kilku dni.
VonC

2
@VonC - masz rację. Domyślna wartość gc.reflogexpire to 90 dni.
Aaron

1
Wreszcie! jedyna odpowiedź, w której sam git mówi: „gałąź: Utworzono z HEAD”. Aby ta nieuchwytna „gałąź” git MOŻE zostać wyśledzona do daty i godziny jej utworzenia ... Dzięki, nagroda +1. Ale co z tym gc.reflogexpire i jak to zrobić na zdalnych gałęziach?
Motti Shneor,

60

Pro Git § 3.1 Rozgałęzienie Git - Czym jest gałąź , dobrze wyjaśnia, czym tak naprawdę jest gałąź git

Gałąź w Git jest po prostu lekkim ruchomym wskaźnikiem do [a] zatwierdzenia.

Ponieważ gałąź jest tylko lekkim wskaźnikiem, git nie ma wyraźnego pojęcia o swojej historii ani dacie utworzenia. „Ale poczekaj,” słyszę, jak mówisz, „oczywiście, git zna moją historię oddziału!” Cóż, w pewnym sensie.

Jeśli uruchomisz jedną z następujących czynności:

git log <branch> --not master
gitk <branch> --not master

zobaczysz coś, co wygląda jak „historia twojego oddziału”, ale tak naprawdę jest to wykaz zatwierdzeń osiągalnych z „oddziału”, które nie są osiągalne z poziomu master. Daje to potrzebne informacje, ale tylko wtedy, gdy nigdy nie scaliłeś „gałęzi” z powrotem do wzorca i nigdy nie scaliłeś wzorca z „odgałęzieniem” od momentu jego utworzenia. Jeśli się połączyłeś, ta historia różnic upadnie.

Na szczęście reflog często zawiera potrzebne informacje, jak wyjaśniono w różnych innych odpowiedziach tutaj. Użyj tego:

git reflog --date=local <branch>

aby pokazać historię oddziału. Ostatni wpis na tej liście to (prawdopodobnie) punkt, w którym utworzono gałąź.

Jeśli gałąź została usunięta, wówczas „gałąź” nie jest już prawidłowym identyfikatorem git, ale możesz użyć tego zamiast tego, co może znaleźć to, czego potrzebujesz:

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

Lub w powłoce cmd Windows:

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

Pamiętaj, że reflog nie będzie działał skutecznie na zdalnych gałęziach, tylko na tych, nad którymi pracowałeś lokalnie.


Hmm, nie jestem jeszcze pewien, jak przydatna jest ta odpowiedź, będę musiała przestudiować ją później. Jednak z tego, co warto, zdecydowanie dobrze się spisałeś, starając się napisać coś kompleksowego , a nie tylko krótką, leniwą częściową odpowiedź, więc to zdecydowanie dobre. Ważne jest również, aby pamiętać, że możesz do tego używać reflog, o ile twoja gałąź nie jest starsza niż gc.reflogexpiredni, jak wskazano w tej odpowiedzi i tej odpowiedzi .

4
Nie chciałem powielać wszystkich dobrych informacji o reflogach z innych odpowiedzi, ale chętnie dodam gc.reflogexpire, jeśli uważasz, że jest to przydatne. Moja odpowiedź miała na celu (1) wyjaśnienie, czym jest gałąź git i dlaczego jej „historia” jest nieco mglista, (2) umieszczenie przydatnych poleceń na pierwszym planie i na środku, w tym (3) pokazywanie zatwierdzeń na gałęzi, a nie master i (4) grep-przeszukiwanie rejestru dla usuniętej gałęzi. Witamy mile widziane.
yoyo

Dzięki @Ciastko. Co zabawne, pierwotnie miałem nawiasy kątowe wokół „gałęzi”, ale to usuwało całe słowo z podglądu odpowiedzi, więc założyłem, że zostało błędnie potraktowane jako (nieprawidłowy) wbudowany HTML.
yoyo

Ta metoda działa dobrze przez IntelliJ i BitBucketgit reflog --date=local <branch>
Isaac weathers

41

Po pierwsze, jeśli oddział został utworzony w gc.reflogexpireciągu kilku dni (domyślnie 90 dni, tj. Około 3 miesięcy), możesz użyć git log -g <branch>lub git reflog show <branch>znaleźć pierwszy wpis w reflog, który byłby zdarzeniem tworzenia i wygląda mniej więcej tak git log -g:

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

Dostajesz, kto utworzył gałąź, ile operacji temu i z której gałęzi (cóż, może to być po prostu „Utworzono z HEAD”, co niewiele pomaga).

Tak powiedział MikeSep w swojej odpowiedzi .


Po drugie, jeśli masz gałąź dłuższą niż gc.reflogexpirei uruchomiłeś git gc(lub uruchomiono ją automatycznie), musisz znaleźć wspólnego przodka z gałęzią, z której został utworzony. Spójrz na plik konfiguracyjny, być może jest tam branch.<branchname>.mergewpis, który powiedziałby ci, na jakiej gałęzi ten jest oparty.

Jeśli wiesz, że gałąź, o której mowa, została utworzona poza gałęzią master (rozwidlenie z gałęzi master), możesz na przykład użyć następującego polecenia, aby zobaczyć wspólnego przodka:

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

Możesz także spróbować git show-branch <branch> masteralternatywnie.

Tak powiedział gbacon w swojej odpowiedzi .


3
„git reflog show <branch>” działa dobrze, bardzo wyraźnie pokazuje, kiedy gałąź została utworzona. Treesh dodaje do „git show - podsumowanie <treesh>”
paxos1977,

1
„Git log -g <granch>” działał dla mnie - wiele szczegółów. Musisz być w oddziale, aby użyć dowolnego z nich.
Lidia,

18

Nie jestem jeszcze pewien tego polecenia git, ale myślę, że można je znaleźć w dziennikach.

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

Wygląda na to, że moje pliki zawierają uniksowy znacznik czasu.

Aktualizacja: Wydaje się, że istnieje opcja użycia historii ponownego logowania zamiast historii zmian podczas drukowania dzienników:

git log -g

Możesz również śledzić ten dziennik, z powrotem do momentu utworzenia oddziału. git logpokazuje datę zatwierdzenia, a nie datę wykonania czynności, która spowodowała wpis w reflogu. Nie znalazłem tego jeszcze, poza tym, że zajrzałem do dziennika na ścieżce powyżej.


12

Spróbuj tego

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

3
być może będziesz potrzebować %wcześniej(refname)
Vor

1
@Vor dokonałem zmiany
biniam

Przesłałem to, | cut -c 5- | sort -r |a następnie przeszedłem przez grep dla miesiąca, podając mniej więcej porządek chronologiczny w odwrotnej kolejności.
Noumenon,

2
@Noumenon: for-each-ref może sortować dla ciebie, dodając np. --sort='-committerdate'(Zwróć uwagę na „-” przed datą committer dla odwrotnej kolejności chronologicznej).
Pete,

9

Posługiwać się:

git reflog

aby wyświetlić cały cykl życia repozytorium w bieżącym folderze. Nazwa oddziału, która pojawia się po raz pierwszy (od dołu do góry) jest źródłem, które zostało utworzone.

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

To znaczy:

  • Rozwój gałęzi jest tworzony (kasa -b) z poziomu głównego

  • Funkcja gałęzi-jira35 jest tworzona (kasa -b) z poziomu rozwoju

  • Funkcja gałęzi-jira-sut-46 jest tworzona (kasa -b) z poziomu rozwoju


2
ale gdzie są daty? i widzisz wymeldowanie do każdego oddziału wiele razy. Czy to oznacza tylko PIERWSZE wystąpienie każdej gałęzi?
Motti Shneor,

4

Wymyśliłem to, zanim znalazłem ten wątek.

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

Polecenia To pokazuje daty utworzenia oddziału devzmain

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

„data utworzenia oddziału” ... jeśli mniej niż 90 dni. Jeżeli została ona utworzona więcej niż 90 dni, informacje te zostaną usunięte. Jak wspomniano powyżej w stackoverflow.com/a/3748722/6309 .
VonC

@Sazzad Hissain Khan Ten działał dla nas, ponieważ chcieliśmy zapewnić „przyjazne porady na temat ściągów” niektórym nietechnicznym ludziom, którzy trochę zagubili się w zawiłościach Git.
Chris22

2

Jeśli chcesz uzyskać szczegółowe informacje dla wszystkich oddziałów

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

Znalazłem najlepszy sposób: zawsze sprawdzam najnowszą gałąź utworzoną w ten sposób

git for-each-ref --sort=-committerdate refs/heads/


1

Ten zrobił to dla mnie: (10 lat później)

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

Ponieważ nie ma zapisanych informacji o czasach tworzenia gałęzi, powoduje to wyświetlenie pierwszego zatwierdzenia każdego oddziału ( --no-walk), który zawiera datę zatwierdzenia. Użyj --remotesdla zdalnych gałęzi lub pomiń dla lokalnych gałęzi.

Ponieważ wykonuję co najmniej jedno zatwierdzenie w gałęzi przed utworzeniem kolejnej, pozwoliło mi to prześledzić kilka miesięcy tworzenia gałęzi (i uruchomienie funkcji) do celów dokumentacji.

źródło: AnoE na stackexchange


0

składnia: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

przykład: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

wynik: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.