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?

Erik B
fonte

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
araqnid
fonte
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
babay
fonte
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
m_messiah
fonte
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 
Observador
fonte
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
Abizern
fonte
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.

Ian
fonte
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.

Erik B
fonte
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.

kenorb
fonte
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
Erik B
fonte
é 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