Existe alguma maneira de obter o git checkout branch anterior?

703

Eu meio que quero o equivalente a cd -para o git. Se eu estiver no ramo mastere fizer o checkout foo, adoraria poder digitar algo como git checkout -voltar mastere digitar novamente para retornar foo.

Existe algo assim? Seria difícil de implementar?

Matt Briggs
fonte
2
Gostaria tipo de seta para cima para encontrar o meu anterior comando git checkout: p
Kit Ho
11
que envolve mover as mãos de cima a posição casa, digitação GC é muito mais rápido, em seguida, pressionando para cima até encontrar o que você está procurando
Matt Briggs
@MattBriggs você realmente digitar gc-ou foi abreviada paragit checkout -
jewbix.cube
2
@ jewbix.cube Você precisa aprender sobre aliases, tanto para o shell quanto para o git.
Gauthier
@KitHo: Acho que estou querendo fazer isso constantemente, mas o comando que eu quero pode nem existir na história se, por exemplo, eu apenas criei o ramo.
M_M 4/03/19

Respostas:

1227

Das notas de versão do 1.6.2

@{-1}é uma maneira de se referir ao último ramo em que você esteve. Isso é
aceito não apenas onde um nome de objeto é esperado, mas em qualquer lugar em que um nome de filial seja esperado e atue como se você tivesse digitado o nome da filial.
Por exemplo git branch --track mybranch @{-1}, git merge @{-1}e
git rev-parse --symbolic-full-name @{-1}funcionaria como esperado.

e

git checkout -é uma abreviação de git checkout @{-1}.

Karl Bielefeldt
fonte
46
uau, eu deveria ter tentado totalmente! percebi - era uma concha-ismo, e que, se a funcionalidade estava em git, seria algo diferente
Matt Briggs
9
Isso não funciona bem quando você check-out um commit SHA duas vezes, caso em que @ {- 1} pontos para onde você estava antes do primeiro check-out ..
user716468
1
Estou usando o ZSH e tive que agrupar @ {- 1} entre aspas. Caso contrário, o git engasgou: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
Esta é provavelmente a primeira vez que uma resposta do SO me fez sorrir incontrolavelmente. Achei que isso seria muito mais difícil!
Owen
25
Parabéns extra pela pedagogia usada: mostre as instalações gerais e mencione a abreviação compacta, mas menos geral! … Eu frequentemente uso @{u}, que é o ramo upstream do ramo atual. É muito útil, por exemplo, para git log @{u}..quais listas de confirmações upstream que ainda não foram recebidas. E o inverso, git log ..@{u}que é apenas o commit local que ainda não foi divulgado.
Benjohn
208

A maneira mais simples de fazer isso hoje em dia é:

git checkout -

... que é um alias de:

git checkout @{-1}

git check-out menos

Se você quiser saber mais sobre isso, escrevi um artigo inteiro aqui: Confira a ramificação anterior no Git .

marcgg
fonte
3
Perfeito. Eu estava pesquisando qual era a maneira mais inteligente de fazer isso, para que eu pudesse criar esse alias exato. Fico feliz em ver que simplesmente existe.
Tabitha
3
Existe uma maneira de listar as ramificações anteriores sem vê-las?
Erotêmico 8/06
7
@Erotemic usando bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Incrível ver o apelido 'git checkout -' é uma coisa! Isso é exatamente o UX eu estava procurando :)
James Tayler
@Erotemic no PowerShell seria git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . No bash, você deve escrever algo equivalente (obter reflog e filtrá-lo para linhas que contenham ": checkout:" string e depois extrair o nome do ramo). Este é realmente o que git faz
Mariusz Pawelski
28

Como o @Karl aponta e do git checkoutmanual:

Como um caso especial, a sintaxe "@ {- N}" da N-ésima última ramificação faz check-out da ramificação (em vez de desanexar). Você também pode especificar - que é sinônimo de "@ {- 1}".

Então, ambos git checkout -e git checkout @{-1}iria trabalhar neste caso

Mais próximo, eu acredito que está usando o git refloge analisar o mais recente moving from branch1 to branch2egit checkout branch1

manojlds
fonte
11

Apenas adicionando mais detalhes às respostas anteriores para entender o mecanismo pelo qual git checkout @{-N}funciona. Ele percorre o reflog para inspecionar o histórico de checkout; portanto, se você quiser implementar algo semelhante por conta própria, poderá analisar a saída de git reflogprocurar checkout:linhas. Você pode verificar a implementação na fonte git sha1_name.c, especificamente na função interpret_nth_prior_checkout.

ddd
fonte
2
para o preguiçoso
Mariusz Pawelski
10

A versão Git 2.23introduziu o git switchcomando que você pode usar para fazer isso (e mais). Citando a documentação oficial:

Alterne para uma ramificação especificada. A árvore de trabalho e o índice são atualizados para corresponder à ramificação. Todas as novas confirmações serão adicionadas à dica deste ramo.

No seu caso específico, você pode emitir git switch -para voltar ao ramo em que estava anteriormente. Você pode executar o mesmo comando novamente para retornar à primeira ramificação.

PS Não é que você ainda não saiba como fazer isso (quero dizer, já se passaram sete anos desde que você fez essa pergunta), mas esse comando é menos confuso e amigável para iniciantes, pois trata de uma confusão comum que surge ao usar git checkout.

Mike
fonte
5

Cheguei a essa pergunta com o mesmo pensamento de fazer checkout do meu ramo anterior. Estou usando ohmyz no Mac. O comando abaixo me ajudou.

$ gco -
$ git checkout -
Venkat.R
fonte
Apenas um aviso de que o ohmyz é super lento em comparação com outros gerenciadores de pacotes zsh. Eu recomendaria dar uma olhada no antígeno ou no zplug .
Spex # 10/18
2
Caso não esteja claro, isso funciona porque o plug-in Git do Oh My Zsh define gcocomo uma maneira curta de escrever git checkout. Então é gco -só ligar git checkout -.
Rory O'Kane
offcourse meu amigo. escusado será explicar o seu git checkout -. atualizado à prova de falhas.
Venkat.R 17/01/19
1

A solução mais popular é:

git checkout @{-N}

Onde N - passo, conte as filiais para voltar ao histórico de checkout.

Jackkobec
fonte
1

Aqui estão os ponteiros para as partes da documentação do Git que descrevem os git checkout -e git checkout @{-1}soluções dadas pelas outras respostas:

  • Ao especificar uma revisão do Git para qualquer comando,, por @{-<n>}exemplo,@{-1} significa “a n- ésima ramificação / confirmação feita antes da atual.” A documentação para git checkout <branch>reitera: "Você pode usar a @{-N}sintaxe para se referir à N-ésima última ramificação / confirmação verificada usando a git checkoutoperação".

  • Para o <branch>argumento degit checkout , "você também pode especificar ' -', que é sinônimo de ' @{-1}'."

Rory O'Kane
fonte