Git: "Atualmente não está em nenhum ramo." Existe uma maneira fácil de voltar a um ramo, mantendo as alterações?


201

Então, eu fiz algum trabalho no repositório e, quando estou prestes a confirmar, percebo que não estou atualmente em nenhum ramo.

Isso acontece muito ao trabalhar com submódulos e eu sou capaz de resolvê-lo, mas o processo é tedioso e eu tenho pensado que deve haver uma maneira mais fácil de fazer isso.

Existe uma maneira fácil de voltar a um ramo, mantendo as alterações?

Respostas:


213

Se você não cometeu:

git stash
git checkout some-branch
git stash pop

Se você se comprometeu e não mudou nada desde:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Se você se comprometeu e fez um trabalho extra:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Este não ajuda se você já se comprometeu. Nenhum voto negativo, pois isso não foi especificado na pergunta.
Dean Rather

24
se você já confirmou: observe o hash do commit que você fez (use git showor git rev-parse HEAD), alterne para o branch e, em seguida, git cherry-pickseguido pelo hash de commit.
Araqnid 18/05/12

7
Se confirmado, obtenha o hash do último commit. Faça o checkout do ramo em que você deseja estar egit merge _hash_
Daniel

TENHA MUITO CUIDADO. Se você tiver confirmado a alteração e seguir estas etapas ... Você verá a mensagem ... "Sua filial e sua origem / mestre divergiram".
thinkanotherone

1
@thinkanotherone Se você já efetuou suas alterações, não haveria nada para esconder e verificar um ramo diferente não é o fim do mundo. O commit que você acabou de fazer ainda está lá e você pode mesclá-lo a esse branch usando git merge <hash-of-the-commit-you-just-made>.
Erik B

160

isso me ajudou

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Se você já fez vários commits, é isso que você precisa fazer.
Benjamin Oakes

Ainda não tentei, mas parece que funcionaria. No entanto, acho que é um cenário improvável. Acredito que a maioria das pessoas perceberá que não está em nenhum ramo antes de se comprometerem e usarão a resposta aceita para corrigir isso.
Erik B

49
Você ficaria surpreso.
Eric

@ ErikB Eu nem sabia que havia algo como não estar em um galho. Esta resposta foi muito útil para mim.
Konstantin Schubert

2
resposta adorável, na verdade, apenas digitou e funcionou, ao contrário de praticamente todo o resto encontrado como iniciante no GIT - você pode apontar que newbranch é um nome arbitrário e não deve ser substituído por um hash de confirmação
Toni Leigh

22
git checkout master

Isso é resultado algo como isto:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Então, vamos fazê-lo:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Eu não tentei, mas parece que funcionaria bem. Eu acho que se você executasse git gcentre executar esses dois comandos, perderia esses commits, mas, a menos que esteja executando git gcautomaticamente, essa deve ser uma abordagem bastante livre de riscos. Eu continuaria com a resposta de babay, mas se você quiser evitar escrever dois comandos extras, acho que esse é o caminho a seguir.
Erik B

Eu havia deixado o ramo principal em algum momento, que não tenho muita certeza. Eu havia confirmado minhas alterações, não houve alterações no mestre. Essas instruções trouxeram minhas alterações para o ramo principal e tudo de bom.
Matti Jokipii

+1 Eu estava nervoso em verificar outra ramificação enquanto deixava commits para trás, vendo essa mensagem ter confiança para seguir em frente.
J-Dizzle

11

Deixando outro caminho aqui

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Ele pode ter feito vários commit. Nesse caso, veja a resposta de babay.
Benjamin Oakes

@BenjaminOakes Pode ser que sim, mas esses comandos git nem são válidos.
Erik B

@ErikB Definitivamente verdade. :) A resposta de babay é a forma válida do que Alex parece estar tentando fazer.
Benjamin Oakes

9

Como alternativa, você pode configurar seus submódulos para que, em vez de estar no estado principal desanexado padrão, verifique uma ramificação.

Editado para adicionar:

Uma maneira é fazer checkout de um ramo específico do submódulo quando você o adiciona com o sinalizador -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Outra maneira é simplesmente entrar no diretório do submódulo e verificar

git checkout master

1
Você poderia me dizer como fazer isso?
Erik B

existe uma maneira de atualizar um submódulo existente neste modo de ramificação padrão? atualizar gitmodulestalvez?
Hertzel Guinness

@HertzelGuinness Na verdade não. O submódulo é retirado em um commit sha específico. Um ramo é apenas um ponteiro para o sha e o sha para o qual ele aponta pode mudar. Isso não é útil porque não congela o estado do submódulo com check-out. Verificar uma ramificação é apenas uma conveniência se você estiver fazendo alterações no submódulo.
Abizern

5

Uma maneira de acabar nessa situação é depois de fazer uma nova recuperação a partir de uma ramificação remota. Nesse caso, os novos commits são apontados por HEADmasmaster não apontam para eles - estão apontando para onde estavam antes de você refazer a outra ramificação.

Você pode fazer isso confirmar seu novo master, fazendo:

git branch -f master HEAD
git checkout master

Isso atualiza masterà força para apontar para HEAD(sem colocá-lo master) e depois muda para master.


Funcionou perfeitamente conforme necessário. Eu já havia preparado os arquivos e confirmado, mas não foi possível enviar devido ao erro acima. Acima de duas linhas de código funcionou perfeitamente e empurrou meu código como esperado.
invinciblemuffi

4

Recentemente, tive esse problema novamente. Já faz um tempo desde que eu trabalhei com submódulos pela última vez e depois de aprender mais sobre o git, percebi que basta verificar o ramo em que você deseja se comprometer. O Git manterá a árvore de trabalho, mesmo que você não a esconda.

git checkout existing_branch_name

Se você deseja trabalhar em uma nova ramificação, isso deve funcionar para você:

git checkout -b new_branch_name

O checkout falhará se você tiver conflitos na árvore de trabalho, mas isso deve ser bastante incomum e, se isso acontecer, você pode apenas escondê-lo, soltá-lo e resolvê-lo.

Comparada à resposta aceita, essa resposta poupará a execução de dois comandos, que não levam muito tempo para serem executados. Portanto, não aceitarei essa resposta, a menos que milagrosamente receba mais votos (ou pelo menos perto) do que a resposta atualmente aceita.


2

O seguinte método pode funcionar:

git rebase HEAD master
git checkout master

Isso irá refazer as alterações atuais do HEAD sobre o mestre. Então você pode mudar o ramo.


Uma maneira alternativa é fazer o checkout da filial primeiro:

git checkout master

Em seguida, o Git deve exibir o SHA1 dos seus commits desanexados, para que você possa selecioná-los, por exemplo,

git cherry-pick YOURSHA1

Ou você também pode mesclar o mais recente:

git merge YOURSHA1

Para ver todas as suas submissões de diferentes ramos (para se certificar de que você tem deles), execute: git reflog.


0

Eu sei que disse a Babay em 2012 que achava improvável que alguém não percebesse que não estava em um galho e se comprometesse. Isso acabou de acontecer comigo, então acho que devo admitir que estava errado, mas considerando que demorou até 2016 para que isso acontecesse comigo, você poderia argumentar que é de fato improvável.

De qualquer forma, criar um novo ramo é um exagero na minha opinião. Tudo o que tem a fazer é:

git checkout some-branch
git merge commit-sha

Se você não copiou o commit-sha antes de verificar o outro ramo, pode encontrá-lo facilmente executando:

git reflog

é um problema raro (improvável) para um homem. Isso não aconteceu comigo desde 2012. Mas se você multiplicar a chance de quantidade de usuários git ... Será muito provável. Pode acontecer todos os dias com alguém. :)
babay 4/17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.