Czy jest jakiś sposób na pobranie poprzedniej gałęzi?

703

Tak jakby chciałem odpowiednikiem cd -git. Jeśli jestem w oddziale masteri kasę foo, chciałbym móc napisać coś takiego, jak git checkout -wrócić masteri móc wpisać go ponownie, aby wrócić do foo.

Czy coś takiego istnieje? Czy byłoby trudne do wdrożenia?

Matt Briggs
źródło
2
Chciałbym wpisać strzałkę W GÓRĘ, aby znaleźć moje poprzednie polecenie kasowania git: p
Kit Ho
11
który polega na oderwaniu rąk od pozycji wyjściowej, wpisaniu gc- jest DROGA szybsze niż naciśnięcie do momentu, aż znajdziesz to, czego szukasz
Matt Briggs
@MattBriggs, czy rzeczywiście piszesz, gc-czy był to skrótgit checkout -
jewbix.cube
2
@ jewbix.cube Musisz dowiedzieć się o aliasach, zarówno dla twojej powłoki, jak i dla gita.
Gauthier
@KitHo: Chcę ciągle to robić, ale polecenie, które chcę, może nawet nie istnieć w historii, jeśli na przykład właśnie utworzyłem gałąź.
M_M

Odpowiedzi:

1225

Z informacji o wersji 1.6.2

@{-1}to sposób na odniesienie do ostatniej gałęzi, w której byłeś. Jest to
akceptowane nie tylko tam, gdzie oczekiwana jest nazwa obiektu, ale wszędzie tam, gdzie oczekiwana jest nazwa gałęzi i działa tak, jakbyś wpisał nazwę gałęzi.
Na przykład git branch --track mybranch @{-1}, git merge @{-1}i
git rev-parse --symbolic-full-name @{-1}będzie działać zgodnie z oczekiwaniami.

i

git checkout -jest skrótem od git checkout @{-1}.

Karl Bielefeldt
źródło
46
wow, powinienem był po prostu spróbować! wymyślił - był to shell-ism i że jeśli funkcjonalność byłaby w git, byłoby to coś innego
Matt Briggs
9
Nie działa to dobrze, gdy dwukrotnie kasujesz zatwierdzenie SHA, w którym to przypadku {{- 1} wskazuje miejsce, w którym byłeś przed pierwszą
kasą
1
Używam ZSH i musiałem zawrzeć @ {- 1} w cudzysłowie. W przeciwnym razie git zakrztusił się:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
Murphy Randle
14
To chyba pierwszy raz, kiedy odpowiedź SO sprawiła, że ​​się uśmiechnęłam w niekontrolowany sposób. Myślałem, że będzie to o wiele trudniejsze!
Owen,
25
Dodatkowe wyróżnienia za zastosowaną pedagogikę: pokaż ogólny obiekt, a następnie wspomnij o zwartym, ale mniej ogólnym skrócie! … Często używam @{u}, który jest odgałęzieniem obecnego oddziału. Jest to bardzo przydatne np. W przypadku git log @{u}..list, które nie zostały jeszcze pobrane. I odwrotność, git log ..@{u}która jest tylko lokalnymi zobowiązaniami, które nie zostały jeszcze wprowadzone.
Benjohn,
207

Najprostszym sposobem na zrobienie tego w dzisiejszych czasach jest:

git checkout -

... który jest aliasem:

git checkout @{-1}

Git Checkout minus

Jeśli chcesz dowiedzieć się więcej na ten temat, napisałem cały artykuł na ten temat tutaj: Kasa Poprzedni oddział w Git .

marcgg
źródło
3
Doskonały. Szukałem, co to za git sposób, aby stworzyć dokładnie ten alias. Cieszę się, że to po prostu istnieje.
Tabitha
3
Czy istnieje sposób wylistowania poprzednich gałęzi bez ich sprawdzania?
Erotemiczny
7
@Erotemiczny za pomocą bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Niesamowite widzieć alias „git checkout -” to coś! Właśnie tego szukałem ux :)
James Tayler
@Erotemiczny w PowerShell to byłoby git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . W bash musisz napisać coś równoważnego (pobierz ponownie log i przefiltruj do wierszy zawierających ciąg „: checkout:”, a następnie wyodrębnij nazwę gałęzi). To właśnie robi git
Mariusz Pawelski,
28

Jak wskazuje @Karl iz git checkoutinstrukcji:

W specjalnym przypadku składnia „@ {- N}” dla N-tej ostatniej gałęzi sprawdza gałąź (zamiast odłączania). Możesz także określić - co jest synonimem „@ {- 1}”.

Oba git checkout -i git checkout @{-1}działałyby w tym przypadku

Najbliżej uważam, że używa git reflogi analizuje najnowsze moving from branch1 to branch2igit checkout branch1

manojlds
źródło
11

Wystarczy dodać więcej szczegółów do poprzednich odpowiedzi, aby zrozumieć mechanizm git checkout @{-N}działania. Przechodzi do dziennika, aby sprawdzić historię kasy, więc jeśli chcesz samodzielnie zaimplementować coś podobnego, powinieneś być w stanie przeanalizować wyniki git reflogwyszukiwania checkout:linii. Możesz sprawdzić implementację w źródle git sha1_name.c, w szczególności funkcję interpret_nth_prior_checkout.

ddd
źródło
2
dla leniwych
Mariusz Pawelski
10

Wersja Git 2.23wprowadziła git switchpolecenie, którego możesz użyć do tego (i więcej). Cytując oficjalną dokumentację:

Przejdź do określonej gałęzi. Pracujące drzewo i indeks są aktualizowane w celu dopasowania do gałęzi. Wszystkie nowe zmiany zostaną dodane na końcu tego oddziału.

W konkretnym przypadku możesz poprosić git switch -o powrót do oddziału, w którym byłeś wcześniej. Możesz ponownie wykonać to samo polecenie, aby powrócić do pierwszej gałęzi.

PS Nie jest tak, że nie wiesz, jak to zrobić (mam na myśli, że minęło 7 lat, odkąd zadałeś to pytanie), ale to polecenie jest mniej mylące i przyjazne dla początkujących, ponieważ rozwiązuje powszechne zamieszanie, które pojawia się podczas korzystania git checkout.

Mikrofon
źródło
5

Doszedłem do tego pytania z tą samą myślą, aby sprawdzić moją poprzednią gałąź. Używam Ohmyza w Mac. Poniższe polecenie pomogło mi.

$ gco -
$ git checkout -
Venkat.R
źródło
Tylko heads-up, że ohmyz jest super wolny w porównaniu do innych menedżerów pakietów zsh. Poleciłbym przyjrzeć się antygenowi lub zplugowi .
spex
2
W przypadku, gdy nie jest to jasne, działa to, ponieważ wtyczka Git Oh My Zsh definiuje gcojako krótki sposób pisania git checkout. Więc gco -po prostu dzwoni git checkout -.
Rory O'Kane
offcourse mój przyjacielu. nie trzeba tego wyjaśniać git checkout -. zaktualizowano w razie awarii.
Venkat.R
1

Najpopularniejszym rozwiązaniem jest:

git checkout @{-N}

Gdzie N - liczba kroków gałęzi, aby cofnąć się w historii kasy.

Jackkobec
źródło
1

Oto wskaźniki do części dokumentacji Gita, które opisują git checkout -i git checkout @{-1}rozwiązania podane przez inne odpowiedzi:

  • Podając wersję Git dla dowolnego polecenia, @{-<n>}np.@{-1} Oznacza „ n- ta gałąź / zatwierdzenie wypisana przed bieżącą”. Dokumentacja dla git checkout <branch>powtórzenia: „Możesz użyć @{-N}składni, aby odnieść się do N-tego ostatniego rozgałęzienia / zatwierdzenia wypisanego za pomocą git checkoutoperacji.”

  • Jako <branch>argumentgit checkout „możesz również podać” -, który jest synonimem „ @{-1}”. ”

Rory O'Kane
źródło