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ęć.
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ęć.
Odpowiedzi:
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).
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 reflog
może przyjąć większość git log
flag. 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=local
i 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: --all
flaga (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
gc.reflogexpire
ciągu kilku dni.
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.
gc.reflogexpire
dni, jak wskazano w tej odpowiedzi i tej odpowiedzi .
git reflog --date=local <branch>
Po pierwsze, jeśli oddział został utworzony w gc.reflogexpire
cią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.reflogexpire
i 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>.merge
wpis, 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> master
alternatywnie.
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 log
pokazuje 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.
Spróbuj tego
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
%
wcześniej(refname)
| 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.
--sort='-committerdate'
(Zwróć uwagę na „-” przed datą committer dla odwrotnej kolejności chronologicznej).
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
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:'
Polecenia To pokazuje daty utworzenia oddziału dev
zmain
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
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
Znalazłem najlepszy sposób: zawsze sprawdzam najnowszą gałąź utworzoną w ten sposób
git for-each-ref --sort=-committerdate refs/heads/
W połączeniu z odpowiedzią Andrew Sohna ( 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
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 --remotes
dla 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.