Gibt es eine Möglichkeit, den vorherigen Zweig auszuchecken?

703

Ich möchte irgendwie das Äquivalent von cd -für Git. Wenn ich in einer Filiale bin masterund zur Kasse gehe foo, würde ich gerne etwas eingeben können , zu dem ich zurückkehren möchte , und es erneut eingeben können, um zu zurückkehren .git checkout -masterfoo

Gibt es so etwas? Wäre es schwer zu implementieren?

Matt Briggs
quelle
2
Ich möchte, dass Sie den Pfeil NACH OBEN eingeben, um meinen vorherigen Befehl zum Auschecken von Git zu finden: p
Kit Ho
11
Dazu müssen Sie Ihre Hände von der Ausgangsposition entfernen und gc eingeben. Dies ist viel schneller als das Drücken nach oben, bis Sie das finden, wonach Sie suchen
Matt Briggs
@ MattBriggs tippst du tatsächlich gc-oder war das die Abkürzung fürgit checkout -
jewbix.cube
2
@ jewbix.cube Du musst mehr über Aliase erfahren, sowohl für deine Shell als auch für Git.
Gauthier
@KitHo: Ich möchte das ständig tun, aber der gewünschte Befehl ist möglicherweise nicht einmal im Verlauf vorhanden, wenn ich beispielsweise gerade den Zweig erstellt habe.
M_M

Antworten:

1227

Aus den Versionshinweisen zu 1.6.2

@{-1}ist eine Möglichkeit, auf den letzten Zweig zu verweisen, in dem Sie waren. Dies wird
nicht nur akzeptiert, wenn ein Objektname erwartet wird, sondern überall dort, wo ein Zweigname erwartet wird, und verhält sich so, als hätten Sie den Zweignamen eingegeben.
Zum Beispiel git branch --track mybranch @{-1}, git merge @{-1}und
git rev-parse --symbolic-full-name @{-1}würde wie erwartet.

und

git checkout -ist eine Abkürzung für git checkout @{-1}.

Karl Bielefeldt
quelle
46
wow, ich hätte es einfach versuchen sollen! dachte - war ein Shell-Ismus, und wenn die Funktionalität in git wäre, wäre es etwas anderes
Matt Briggs
9
Dies funktioniert nicht gut, wenn Sie einen Commit-SHA zweimal
auschecken.
1
Ich verwende ZSH und musste @ {- 1} in Anführungszeichen setzen. Ansonsten erstickt git: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
Dies ist wahrscheinlich das erste Mal, dass eine SO-Antwort mich unkontrolliert zum Lächeln bringt. Ich dachte, das wäre so viel schwieriger!
Owen
25
Zusätzliches Lob für die verwendete Pädagogik: Zeigen Sie die allgemeine Einrichtung und erwähnen Sie dann die kompakte, aber weniger allgemeine Abkürzung! … Ich benutze ziemlich oft @{u}, das ist der Upstream-Zweig des aktuellen Zweigs. Es ist sehr nützlich, um beispielsweise git log @{u}..Upstream-Commits aufzulisten, die noch nicht abgerufen wurden. Und das Gegenteil, git log ..@{u}das sind nur die lokalen Commits, die noch nicht gepusht wurden.
Benjohn
208

Der einfachste Weg dies heutzutage zu tun ist:

git checkout -

... das ist ein Alias ​​von:

git checkout @{-1}

Git Checkout minus

Wenn Sie mehr darüber wissen möchten, habe ich hier einen ganzen Artikel darüber geschrieben: Checkout The Previous Branch In Git .

marcgg
quelle
3
Perfekt. Ich habe nachgeschlagen, wie ich das machen soll, damit ich genau diesen Alias ​​erstellen kann. Ich bin froh zu sehen, dass es einfach existiert.
Tabitha
3
Gibt es eine Möglichkeit, die vorherigen Zweige aufzulisten, ohne sie auszuchecken?
Erotemic
7
@Erotemic using bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Erstaunlich, die 'Git Checkout' zu sehen - Alias ​​ist eine Sache! Das ist genau die UX, nach der ich gesucht habe :)
James Tayler
@Erotemic in Powershell wäre es git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . In bash müssen Sie etwas Äquivalentes schreiben (Reflog abrufen und in Zeilen filtern, die den String ": checkout:" enthalten, und dann den Zweignamen extrahieren). Dies ist eigentlich, was git tut
Mariusz Pawelski
28

Wie @Karl und aus dem git checkoutHandbuch hervorhebt :

Als Sonderfall überprüft die Syntax "@ {- N}" für den N-ten letzten Zweig den Zweig (anstatt ihn zu trennen). Sie können auch angeben, was gleichbedeutend mit "@ {- 1}" ist.

Also beides git checkout -und git checkout @{-1}würde in diesem Fall funktionieren

Am nächsten, glaube ich, ist das Verwenden git reflogund Analysieren der neuesten moving from branch1 to branch2undgit checkout branch1

Manojlds
quelle
11

Fügen Sie den vorherigen Antworten nur einige Details hinzu, um den Mechanismus zu verstehen, nach dem git checkout @{-N}funktioniert. Das Reflog wird durchlaufen, um den Checkout-Verlauf zu überprüfen. Wenn Sie also etwas Ähnliches selbst implementieren möchten, sollten Sie in der Lage sein, die Ausgabe der git reflogSuche nach checkout:Zeilen zu analysieren . Sie können die Implementierung in der Git-Quelle überprüfen sha1_name.c, insbesondere die Funktion interpret_nth_prior_checkout.

ddd
quelle
2
für die Faulen
Mariusz Pawelski
10

Die Git-Version 2.23hat den git switchBefehl eingeführt, mit dem Sie dies (und mehr) tun können. Zitieren der offiziellen Dokumentation:

Wechseln Sie zu einem bestimmten Zweig. Der Arbeitsbaum und der Index werden entsprechend der Verzweigung aktualisiert. Alle neuen Commits werden an der Spitze dieses Zweigs hinzugefügt.

In Ihrem speziellen Fall können Sie Probleme haben git switch -, zu dem Zweig zurückzukehren, in dem Sie zuvor waren. Sie können denselben Befehl erneut ausführen, um zum ersten Zweig zurückzukehren.

PS Es ist nicht so, dass Sie noch nicht wissen, wie das geht (ich meine, es ist 7 Jahre her, seit Sie diese Frage gestellt haben), aber dieser Befehl ist für Anfänger weniger verwirrend und freundlich, da er eine häufige Verwirrung behebt, die bei der Verwendung auftritt git checkout.

Mike
quelle
5

Ich bin mit dem gleichen Gedanken auf diese Frage gestoßen, um meinen vorherigen Zweig zu überprüfen. Ich benutze Ohmyz in Mac. Der folgende Befehl hat mir geholfen.

$ gco -
$ git checkout -
Venkat.R
quelle
Nur ein Heads-up, dass Ohmyz im Vergleich zu anderen zsh-Paketmanagern sehr langsam ist. Ich würde empfehlen, einen Blick auf Antigen oder Zplug zu werfen .
Spex
2
Im Fall ist es nicht klar, das funktioniert , weil Oh My Zsh Git - Plugin definiert gcoals Kurzschreibweise git checkout. Also gco -einfach anrufen git checkout -.
Rory O'Kane
Natürlich mein Freund. unnötig zu erklären git checkout -. für ausfallsicher aktualisiert.
Venkat.R
1

Die beliebteste Lösung ist:

git checkout @{-N}

Wobei N - Schrittanzahl der Zweige, um zum Checkout-Verlauf zurückzukehren.

Jackkobec
quelle
1

Hier sind Hinweise auf die Teile der Git-Dokumentation, die die git checkout -und die git checkout @{-1}Lösungen der anderen Antworten beschreiben:

  • Wenn Sie eine Git-Revision für einen Befehl angeben @{-<n>},@{-1} bedeutet dies beispielsweise "der n- te Zweig / Commit wurde vor dem aktuellen ausgecheckt". In der Dokumentation für git checkout <branch>Wiederholungen heißt es: "Sie können die @{-N}Syntax verwenden, um auf den N-ten letzten Zweig / Commit zu verweisen, der mit git checkoutOperation ausgecheckt wurde ."

  • Für das <branch>Argumentgit checkout "Sie können auch" angeben -, was gleichbedeutend ist mit @{-1}"."

Rory O'Kane
quelle