Contexto: estou trabalhando no master adicionando um recurso simples. Depois de alguns minutos, percebo que não era tão simples e deveria ter sido melhor trabalhar em um novo ramo.
Isso sempre acontece comigo e não tenho idéia de como alternar para outro ramo e levar todas essas alterações não confirmadas comigo, deixando o ramo mestre limpo. Eu git stash && git stash branch new_branch
simplesmente faria isso, mas é o que eu recebo:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Você sabe se existe alguma maneira de conseguir isso?
Respostas:
Não há necessidade de esconder.
não toca nas alterações locais. Ele apenas cria a ramificação a partir do HEAD atual e define o HEAD lá. Então eu acho que é isso que você quer.
--- Edite para explicar o resultado do mestre de checkout ---
Você está confuso porque
checkout master
não descarta suas alterações?Como as alterações são apenas locais, o git não deseja que você as perca com muita facilidade. Ao alterar a ramificação, o git não substitui as alterações locais. O resultado do seu
checkout master
é:, o que significa que seus arquivos de trabalho não estão limpos. O git mudou o HEAD, mas não substituiu os arquivos locais. É por isso que seu último status ainda mostra as alterações locais, embora você esteja ativo
master
.Se você realmente deseja descartar as alterações locais, é necessário forçar a finalização da compra
-f
.Como suas alterações nunca foram confirmadas, você as perderia.
Tente retornar ao seu ramo, confirme as alterações e faça o checkout do master novamente.
Você deve receber uma
M
mensagem após o primeiro check-out, mas não mais após ocheckout master
e nãogit status
deve exibir arquivos modificados.--- Edite para esclarecer a confusão sobre o diretório de trabalho (arquivos locais) ---
Em resposta ao seu primeiro comentário, as alterações locais são apenas ... bem, locais. O Git não os salva automaticamente, você deve pedir para salvá-los para mais tarde. Se você fizer alterações e não as confirmar ou ocultar explicitamente, o git não as fará a versão. Se você alterar HEAD (
checkout master
), as alterações locais não serão substituídas desde que não sejam salvas.fonte
git checkout
“Atualiza os arquivos na árvore de trabalho para corresponder à versão no índice ou na árvore especificada.”. Isso pressupõe que suas alterações no seu sistema de arquivos serão GONE posteriormente. Sem chance de recuperá-los. Mesmo se você disser que não, isso ainda deixa um sentimento muito ruim. Eu não confio esta em tudo . A documentação é realmente ruim ou o comportamento padrão do git é realmente perigoso. Não é necessário confiar em alguma heurística "automagica" para detectar que, nesse caso, você não deseja perder suas alterações.checkout
não entrar em conflito com as alterações locais, o checkout funcionará e deixará as alterações locais em paz. No entanto, entendo o mau pressentimento, a página de manual talvez deva dizer "Atualiza arquivos não modificados na árvore de trabalho". Por outro lado, o Git não facilita demais a perda de alterações locais.git checkout
deixa suas alterações locais em paz ou recusa se houver um conflito.git checkout <other_branch> -f
. Você perderá suas alterações locais sem aviso prévio.Tentar:
fonte
Duas coisas que você pode fazer:
ou
(
git checkout -
<- o traço é um atalho para o ramo anterior em que você estava)(
git stash -u
<--u
significa que ele também leva alterações sem etapas)fonte
Se você estiver usando o cliente GitHub Windows (como eu sou) e estiver em uma situação de alterações não confirmadas que deseja mover para uma nova ramificação, basta "Criar uma nova ramificação" através do cliente GitHub. Ele mudará para o ramo recém-criado e preservará suas alterações.
fonte
Se você deseja que suas alterações não confirmadas atuais na ramificação atual sejam movidas para uma nova ramificação, use o comando a seguir para criar uma nova ramificação e copiar as alterações não confirmadas automaticamente.
Isso criará um novo ramo a partir do seu ramo atual (supondo que seja mestre), copie as alterações não confirmadas e mude para o novo ramo.
Confirme suas alterações na nova ramificação.
Como uma nova ramificação é criada, antes de enviá-la para remota, é necessário configurar o upstream. Use o comando abaixo para configurar o upstream e envie-o para remoto.
Depois de pressionar este comando, um novo ramo será criado no controle remoto e seu novo ramo local será enviado para o controle remoto.
Agora, se você quiser jogar fora suas alterações não confirmadas da ramificação principal, use:
Isso descartará quaisquer alterações locais não confirmadas na finalização da compra.
fonte
No mais recente cliente GitHub para Windows , se você tiver alterações não confirmadas, escolha criar uma nova ramificação.
Ele pergunta como lidar com esse cenário exato:
O mesmo se aplica se você simplesmente alternar a ramificação também.
fonte