C'è un modo per andare alla cassa precedente ramo?


703

Voglio un po 'l'equivalente di cd -for git. Se sono in filiale mastere faccio il checkout foo, mi piacerebbe poter digitare qualcosa di simile git checkout -a cui tornare mastere poterlo digitare nuovamente per tornare a foo.

Esiste qualcosa del genere? Sarebbe difficile da attuare?


2
Vorrei digitare la freccia SU per trovare il mio precedente comando di checkout git: p
Kit Ho

11
che comporta spostare le mani dalla posizione iniziale, digitare gc- è MODO più veloce quindi premere verso l'alto fino a trovare quello che stai cercando
Matt Briggs,

@MattBriggs in realtà scrivi gc-o era quella scorciatoia pergit checkout -
jewbix.cube

2
@ jewbix.cube Devi conoscere gli alias, sia per la tua shell che per git.
Gauthier,

@KitHo: mi ritrovo a voler farlo costantemente, ma il comando che desidero potrebbe non esistere nemmeno nella storia se, ad esempio, avessi appena creato il ramo.
M_M,

Risposte:


1227

Dalle note di rilascio per 1.6.2

@{-1}è un modo per fare riferimento all'ultimo ramo in cui ti trovavi. Questo è
accettato non solo laddove è previsto il nome di un oggetto, ma ovunque sia previsto il nome di un ramo e si comporta come se fosse stato digitato il nome del ramo.
Ad esempio git branch --track mybranch @{-1}, git merge @{-1}e
git rev-parse --symbolic-full-name @{-1}funzionerebbe come previsto.

e

git checkout -è una scorciatoia per git checkout @{-1}.


46
wow, avrei dovuto assolutamente provarlo! pensato - era un guscio-ismo, e che se la funzionalità fosse stata geniale, sarebbe qualcosa di diverso
Matt Briggs,

9
Questo non funziona bene quando esegui il checkout di un SHA di commit due volte, nel qual caso @ {- 1} indica dove ti
trovavi

1
Sto usando ZSH e ho dovuto racchiudere tra virgolette @ {- 1}. Altrimenti git soffocato: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
Questa è probabilmente la prima volta che una risposta SO mi fa sorridere in modo incontrollato. Pensavo che sarebbe stato molto più difficile!
Owen,

25
Complimenti extra per la pedagogia utilizzata: mostra la struttura generale, quindi menziona la stenografia compatta ma meno generale! ... lo uso abbastanza spesso @{u}, che è il ramo a monte del ramo attuale. È molto utile, ad esempio, per git log @{u}..quali elenchi di commit a monte non sono stati ancora estratti. E il contrario, git log ..@{u}che è solo il commit locale, non è stato ancora spinto.
Benjohn,

208

Il modo più semplice per farlo al giorno d'oggi è:

git checkout -

... che è un alias di:

git checkout @{-1}

git checkout meno

Se vuoi saperne di più su questo, ho scritto un intero articolo a riguardo qui: Dai un'occhiata a The Branch precedente in Git .


3
Perfetto. Stavo cercando qual era il modo geniale per farlo, in modo da poter creare questo alias esatto. Sono contento di vedere che esiste.
Tabitha,

3
C'è un modo per elencare i rami precedenti senza verificarli?
Erotemic

7
@Erotemic using bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin

Incredibile vedere il 'git checkout -' alias è una cosa! È esattamente quello che stavo cercando :)
James Tayler,

@Erotemic in PowerShell sarebbe git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . In bash devi scrivere qualcosa di equivalente (ottieni reflog e filtralo in righe contenenti ": checkout:" stringa e quindi estrai il nome del ramo). Questo è in realtà ciò che fa git
Mariusz Pawelski il

28

Come sottolinea @Karl e dal git checkoutmanuale:

Come caso speciale, la sintassi "@ {- N}" per l'ennesimo ramo precedente controlla il ramo (invece di staccarsi). Puoi anche specificare - che è sinonimo di "@ {- 1}".

Quindi entrambi git checkout -egit checkout @{-1} funzionerebbero in questo caso

Il più vicino credo che sta usando git refloge analizzare l'ultimo moving from branch1 to branch2egit checkout branch1


11

Basta aggiungere qualche dettaglio in più alle risposte precedenti per capire il meccanismo con cui git checkout @{-N}funziona. Cammina il reflog per ispezionare la cronologia dei checkout, quindi se si desidera implementare qualcosa di simile da soli, si dovrebbe essere in grado di analizzare l'output di git reflogcercare le checkout:linee. Puoi controllare l'implementazione nel sorgente git sha1_name.c, in particolare la funzione interpret_nth_prior_checkout.



10

La versione Git ha 2.23introdotto il git switchcomando che puoi usare per farlo (e altro). Citando la documentazione ufficiale:

Passa a un ramo specificato. L'albero di lavoro e l'indice vengono aggiornati per corrispondere al ramo. Tutti i nuovi commit verranno aggiunti alla punta di questo ramo.

Nel tuo caso specifico puoi rilasciare git switch -per tornare al ramo in cui eri in precedenza. È possibile eseguire nuovamente lo stesso comando per tornare al primo ramo.

PS Non è che non sai già come farlo (voglio dire, sono passati 7 anni da quando hai posto questa domanda), ma questo comando è meno confuso e amichevole per i principianti in quanto risolve una confusione comune che sorge durante l'uso git checkout.


5

Sono arrivato a questa domanda con lo stesso pensiero per controllare il mio ramo precedente. Sto usando ohmyz in Mac. Sotto il comando mi ha aiutato.

$ gco -
$ git checkout -

Solo un avvertimento che ohmyz è super lento rispetto ad altri gestori di pacchetti zsh. Consiglierei di dare un'occhiata a antigen o zplug .
spex,

2
Nel caso in cui non sia chiaro, questo funziona perché il plug-in Git di Oh My Zsh definisce gcoun modo breve di scrivere git checkout. Quindi gco -chiama git checkout -.
Rory O'Kane,

offco amico mio. inutile spiegarlo git checkout -. per fail-safe aggiornato.
Venkat.R,

1

La soluzione più popolare è:

git checkout @{-N}

Dove N - conteggio dei passi dei rami per tornare indietro alla cronologia di pagamento.


1

Ecco alcuni suggerimenti sulle parti della documentazione di Git che descrivono le soluzioni git checkout -e git checkout @{-1}fornite dalle altre risposte:

  • Quando si specifica una revisione Git per qualsiasi comando, @{-<n>}, ad esempio,@{-1} significa “il n ° ramo / commit controllato prima di quella attuale”. La documentazione per git checkout <branch>reiterare: "È possibile utilizzare la @{-N}sintassi per fare riferimento all'ennesimo ramo / commit dell'ultimo check-out utilizzando l' git checkoutoperazione".

  • Per l' <branch>argomento digit checkout "puoi anche specificare" -"che è sinonimo di" @{-1}".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.