Existe-t-il un moyen de git checkout branche précédente?

703

Je veux en quelque sorte l'équivalent de cd -for git. Si je suis en succursale masteret que je passe à la caisse foo, j'aimerais pouvoir taper quelque chose comme git checkout -revenir à master, et pouvoir le taper à nouveau pour revenir foo.

Existe-t-il quelque chose comme ça? Serait-il difficile à mettre en œuvre?

Matt Briggs
la source
2
Je voudrais taper la flèche vers le HAUT pour trouver ma commande de contrôle git précédente: p
Kit Ho
11
cela implique de déplacer vos mains de la position d'origine, en tapant gc- est bien plus rapide que d'appuyer jusqu'à ce que vous trouviez ce que vous cherchez
Matt Briggs
@MattBriggs avez-vous réellement tapé gc-ou était ce raccourci pourgit checkout -
jewbix.cube
2
@ jewbix.cube Vous devez vous renseigner sur les alias, à la fois pour votre shell et pour git.
Gauthier
@KitHo: Je me retrouve à vouloir le faire constamment, mais la commande que je veux peut même ne pas exister dans l'historique si, par exemple, je viens de créer la branche.
M_M

Réponses:

1227

À partir des notes de version de 1.6.2

@{-1}est un moyen de faire référence à la dernière branche sur laquelle vous étiez. Ceci est
accepté non seulement là où un nom d'objet est attendu, mais partout où un nom de branche est attendu et agit comme si vous aviez tapé le nom de la branche.
Par exemple git branch --track mybranch @{-1}, git merge @{-1}et
git rev-parse --symbolic-full-name @{-1}fonctionnerait comme prévu.

et

git checkout -est un raccourci pour git checkout @{-1}.

Karl Bielefeldt
la source
46
wow, j'aurais vraiment dû essayer! figuré - était un shell-isme, et que si la fonctionnalité était dans git, ce serait quelque chose de différent
Matt Briggs
9
Cela ne fonctionne pas bien lorsque vous extrayez deux fois un SHA de validation, auquel cas @ {- 1} indique où vous étiez avant la première extraction.
user716468
1
J'utilise ZSH, et j'ai dû encapsuler @ {- 1} entre guillemets. Sinon git étranglé: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
C'est probablement la première fois qu'une réponse SO me fait sourire de façon incontrôlable. Je pensais que ce serait tellement plus difficile!
Owen
25
Félicitations supplémentaires pour la pédagogie utilisée: montrez les installations générales, puis mentionnez le raccourci compact mais moins général! … J'utilise assez souvent @{u}, qui est la branche amont de la branche actuelle. Il est très utile, par exemple, pour git log @{u}..répertorier les commits en amont qui ne sont pas encore extraits. Et l'inverse git log ..@{u}qui n'est que les commits locaux qui ne sont pas encore poussés.
Benjohn
208

La façon la plus simple de le faire de nos jours est:

git checkout -

... qui est un alias de:

git checkout @{-1}

git checkout moins

Si vous voulez en savoir plus, j'ai écrit un article entier à ce sujet ici: Checkout The Previous Branch In Git .

marcgg
la source
3
Parfait. Je cherchais quelle était la meilleure façon de faire pour que je puisse créer cet alias exact. Heureux de voir qu'il existe simplement.
Tabitha
3
Existe-t-il un moyen de répertorier les branches précédentes sans les vérifier?
Erotemic
7
@Erotemic using bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Incroyable de voir l'alias 'git checkout -' est une chose! C'est exactement le ux que je cherchais :)
James Tayler
@Erotemic en PowerShell ce serait git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . En bash, vous devez écrire quelque chose d'équivalent (obtenir reflog et le filtrer sur les lignes contenant la chaîne ": checkout:" puis extraire le nom de la branche). C'est en fait ce que fait
Git
28

Comme le souligne @Karl et dans le git checkoutmanuel:

Dans un cas particulier, la syntaxe "@ {- N}" pour la N-ème dernière branche extrait la branche (au lieu de la détacher). Vous pouvez également spécifier - qui est synonyme de "@ {- 1}".

Donc, les deux git checkout -et git checkout @{-1}fonctionneraient dans ce cas

Le plus proche, je crois, utilise le git refloget analyse les derniers moving from branch1 to branch2etgit checkout branch1

manojlds
la source
11

Il suffit d'ajouter un peu plus de détails aux réponses précédentes pour comprendre le mécanisme qui git checkout @{-N}fonctionne. Il parcourt le reflog pour inspecter l'historique de paiement, donc si vous voulez implémenter quelque chose de similaire par vous-même, vous devriez pouvoir analyser la sortie de la git reflogrecherche de checkout:lignes. Vous pouvez vérifier l'implémentation dans la source git sha1_name.c, en particulier la fonction interpret_nth_prior_checkout.

ddd
la source
2
pour les paresseux
Mariusz Pawelski
10

La version Git a 2.23introduit la git switchcommande que vous pouvez utiliser pour cela (et plus). Citant la documentation officielle:

Basculez vers une branche spécifiée. L'arbre de travail et l'index sont mis à jour pour correspondre à la branche. Tous les nouveaux commits seront ajoutés à la pointe de cette branche.

Dans votre cas spécifique, vous pouvez émettre git switch -pour revenir à la branche où vous étiez précédemment. Vous pouvez réexécuter la même commande pour revenir à la première branche.

PS Ce n'est pas que vous ne savez pas déjà comment faire cela (je veux dire que cela fait 7 ans que vous avez posé cette question), mais cette commande est moins déroutante et conviviale pour les débutants car elle résout une confusion courante qui survient lors de l'utilisation git checkout.

Mike
la source
5

J'ai atterri à cette question avec la même pensée pour vérifier ma branche précédente. J'utilise ohmyz dans Mac. La commande ci-dessous m'a aidé.

$ gco -
$ git checkout -
Venkat.R
la source
Juste un avertissement: ohmyz est super lent par rapport aux autres gestionnaires de paquets zsh. Je recommanderais de regarder l' antigène ou le zplug .
spex
2
Dans le cas où ce n'est pas clair, cela fonctionne parce que le plugin Git d'Oh My Zsh définit gcocomme un court moyen d'écriture git checkout. Appelle donc gco -juste git checkout -.
Rory O'Kane
bien sûr mon ami. inutile d'expliquer son git checkout -. pour la sécurité intégrée mise à jour.
Venkat.R
1

La solution la plus populaire est:

git checkout @{-N}

Où N - nombre de pas des branches pour revenir sur l'historique de paiement.

Jackkobec
la source
1

Voici des pointeurs vers les parties de la documentation de Git qui décrivent les solutions git checkout -et les git checkout @{-1}solutions apportées par les autres réponses:

  • Lors de la spécification d' une révision Git pour toute commande, @{-<n>}, par exemple@{-1} signifie « la n ième branche / allouent vérifié avant l'actuel. » La documentation pour git checkout <branch>réitère: "Vous pouvez utiliser la @{-N}syntaxe pour faire référence à la N-ème dernière branche / validation extraite à l'aide de l' git checkoutopération."

  • Pour l' <branch>argument degit checkout «vous pouvez également spécifier« -»qui est synonyme de« @{-1}».»

Rory O'Kane
la source