ramificação do switch git sem descartar as alterações locais


181

Tudo bem, digamos que um dia fazemos algumas modificações e, quando vamos enviá-las, percebemos que estávamos trabalhando no ramo errado.

Como podemos forçar o git a mudar de ramificação sem descartar as alterações locais .

Provavelmente vou fazer isso de uma maneira ingênua enquanto espero uma resposta, mas gostaria de saber se existe um procedimento correto, pois estaria mentindo se dissesse que isso não aconteceu comigo antes ...

  • Repo alterado de backup
  • git reset --hard
  • git checkout right-branch
  • Restaurar alterações
  • git commit -m "changes"

Respostas:


342

Existem várias maneiras diferentes, dependendo de quanto tempo você está e em quais filiais você deseja.

Vamos cometer um erro clássico:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Então agora você deseja que essas mudanças, com as quais você ainda não se comprometeu master, estejam ativadas develop.

  1. Se você não tem um developainda, o método é trivial:

    $ git checkout -b develop
    

    Isso cria uma nova developramificação a partir de onde você estiver agora. Agora você pode confirmar e o novo material está ativado develop.

  2. Você tem um develop. Veja se o Git permitirá que você alterne sem fazer nada:

    $ git checkout develop
    

    Isso será bem-sucedido ou reclamará. Se conseguir, ótimo! Apenas cometa. Caso contrário ( error: Your local changes to the following files would be overwritten ...), você ainda tem muitas opções.

    O mais fácil é provavelmente git stash(como postdisseram todas as outras pessoas que responderam ao clique ). Execute git stash saveor git stash push, 1 ou simplesmente git stashque é a abreviação de save/ push:

    $ git stash
    

    Isso confirma seu código (sim, ele realmente faz alguns commit) usando um método estranho que não é branch-y. As confirmações feitas não estão "em" nenhuma ramificação, mas agora estão armazenadas com segurança no repositório; portanto, você pode mudar de ramificação e depois "aplicar" o stash:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Se tudo correr bem, e você gostar dos resultados, deverá fazer git stash dropa reserva. Isso exclui a referência às confirmações estranhas não ramificadas-y. (Eles ainda estão no repositório e, às vezes, podem ser recuperados em uma emergência, mas para a maioria dos propósitos, você deve considerá-los desaparecidos nesse ponto.)

A applyetapa faz uma mesclagem das alterações ocultas, usando o poderoso mecanismo de mesclagem subjacente do Git, o mesmo tipo de coisa usado quando você faz mesclagens de ramificações. Isso significa que você pode obter "conflitos de mesclagem" se o ramo em que você estava trabalhando por engano for suficientemente diferente do ramo em que você pretendia trabalhar. Portanto, é uma boa ideia inspecionar os resultados com cuidado antes de assumir que o stash foi aplicado corretamente, mesmo que o próprio Git não tenha detectado nenhum conflito de mesclagem.

Muitas pessoas usam git stash pop, o que é uma abreviação de git stash apply && git stash drop. Tudo bem, mas significa que, se o aplicativo resultar em uma bagunça, e você decidir que não deseja seguir esse caminho, não poderá recuperar o estoque facilmente. É por isso que recomendo separar applye inspecionar resultados, dropsomente se / quando estiver satisfeito. (É claro que isso introduz outro ponto em que você pode fazer outra pausa para o café e esquecer o que estava fazendo, voltar e fazer a coisa errada , para que não seja uma cura perfeita.)


1 O savein git stash saveé o verbo antigo para criar um novo esconderijo. A versão 2.13 do Git introduziu o novo verbo para tornar as coisas mais consistentes pope adicionar mais opções ao comando de criação. A versão 2.16 do Git obsoleta formalmente o verbo antigo (embora ainda funcione no Git 2.23, que é a versão mais recente no momento em que estou editando isso).


3
E se eu quiser mudar para outro ramo sem confirmar o ramo atual (por exemplo, as alterações não foram concluídas) e depois voltar para continuar?
stt106

@ stt106: você ainda deve confirmar, mas pode fazê-lo, como nesta e nas outras respostas, via git stashpara que os commits - pois git stash, você recebe dois commits por entrada de stash, em um arranjo incomum - não estejam em nenhuma ramificação. Exceto em casos especiais de muito curto prazo, no entanto, geralmente prefiro fazer um commit normal. Você pode git reset --softou git reset --mixedmais tarde, ou use git commit --amendpara afastá-lo, quando voltar a trabalhar nesse ramo. (Em Git moderna, você também pode usar git worktree add, que pode ser uma solução ainda-melhor.)
Torek

"Isso será bem sucedido ou reclamará". Quais seriam os motivos de sucesso ou erro ao fazer o checkout?
nanocv


todas as minhas alterações locais são perdidas quando estou alternando com as etapas acima. Estou no ramo <a> e faço minhas alterações. Quero passar para o ramo <b> e enviar todas as alterações. quando estou fazendo git stash e movendo-me para outros branches, está puxando todos os arquivos do <b> branch e minhas alterações locais estão se perdendo
Mukul Munjal

38

Use git stash

git stash

Empurra as alterações para uma pilha. Quando você quiser puxá-los de volta, use

 git stash apply

Você pode até retirar itens individuais. Para remover completamente o estoque:

 git stash clear

7
O último comando provavelmente deve ser git stash drop; git stash clearlimpará toda a pilha de stash, incluindo stashes possivelmente não relacionados a esse conjunto de comandos.
Leland

15
  • git stash para salvar suas alterações não confirmadas
  • git stash list para listar seus stashes não solicitados salvos
  • git stash apply stash@{x} onde x pode ser 0,1,2..no de esconderijos que você fez

4

Você também pode :

  • Use git stashpara arquivar suas alterações ou,

  • Crie outra ramificação e confirme suas alterações lá e, em seguida, mescle essa ramificação em seu diretório de trabalho

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.