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?


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}.


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 .


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


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.



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.


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 -

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.


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}”. ”

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.