git: alterna ramificação e ignora quaisquer alterações sem confirmar


318

Eu estava trabalhando em um ramo git e estava pronto para confirmar minhas alterações, então fiz um commit com uma mensagem útil de commit. Então, distraidamente, fiz pequenas alterações no código que não valem a pena ser mantidas. Agora eu quero mudar de ramo, mas o git me dá,

erro: você tem alterações locais para "X"; não pode mudar de ramificação.

Posso mudar de agência sem confirmar? Se sim, como posso configurar isso? Caso contrário, como saio desse problema? Quero ignorar as pequenas alterações sem confirmar e apenas alterar os ramos.


1
Acredito que isso só acontece quando as alterações são realizadas para confirmação, mas não confirmadas? O git checkout funciona perfeitamente para alterar ramificações, se você ainda não testou os arquivos usando o git add ou algo semelhante.
Jeremy Wall

1
Oi Jeremy, o que você quer dizer com 'encenado'? Forçar o usuário a confirmar o arquivo antes de alterar as ramificações não parece ser um ótimo fluxo de trabalho. Por exemplo, se eu estou no repositório principal e rapidamente quero verificar algo em uma ramificação. Preciso confirmar o código com o mestre primeiro, mesmo que o código esteja meio escrito! Você está dizendo que, de fato, deveria ser possível fazer check-out de uma filial nessa situação?
21711 Daniel Farrell

@boyfarrell Você pode usar o 'Git stash' para salvar temporariamente as alterações sem confirmar.
Howiecamp


1
quando você alterna para uma ramificação sem confirmar as alterações na ramificação antiga, o git tenta mesclar as alterações nos arquivos na nova ramificação. Se a fusão for feita sem nenhum conflito, as ramificações swithing serão bem-sucedidas e você poderá ver as alterações na nova ramificação. Mas se ocorrer um conflito, você obterá error: You have local changes to '<filename>'; cannot switch branches.e a ramificação não será alterada. você pode fazer git checkout -m <branch-name>para mesclar conflitos e fazer checkout na ramificação e resolver conflitos por conta própria ou git checkout -f <branch-name>ignorar alterações.
samad montazeri 8/06/19

Respostas:


400

Você precisa de um estado limpo para alterar ramificações. O check-out da agência somente será permitido se não afetar os 'arquivos sujos' (como Charles Bailey comenta nos comentários).

Caso contrário, você deve:

  • esconder sua mudança atual ou
  • reset --hard HEAD (se você não se importa em perder essas pequenas alterações) ou
  • checkout -f (Ao alternar ramificações, continue mesmo se o índice ou a árvore de trabalho diferirem de HEAD. Isso é usado para descartar as alterações locais.)

Ou, mais recentemente:

Prossiga mesmo que o índice ou a árvore de trabalho seja diferente de HEAD.
O índice e a árvore de trabalho são restaurados para corresponder ao destino da troca.

Isso difere de git switch -m <branch-name>, o que desencadeia uma mescla de três vias entre a ramificação atual, o conteúdo da árvore de trabalho e a nova ramificação: você não perderá seu trabalho em andamento dessa maneira.


34
"Você precisa de um estado limpo para alterar as ramificações." só é verdade se a alteração da ramificação afetar os 'arquivos sujos'.
CB Bailey

10
Para o método stash, digitei "git stash save", "git checkout otherbranch" e, finalmente, "git stash pop".
Venkat D.

1
Atualmente, não vejo essa mensagem de erro e as alterações feitas em uma ramificação aparecem na outra quando faço o "status git". algo mudou?
precisa

2
obrigado. o checkout -f era o que eu precisava. i fez git reset --hard git limpo -f git checkout mybranch -f
nologo

1
Aqui está a grande coisa que o Git errou totalmente ao violar a definição básica de um ramo. Ao contrário do git branch, dois espaços de trabalho totalmente diferentes são extraídos de um repositório.
Nehem

125

Se você deseja descartar as alterações,

git checkout -- <file>
git checkout branch

Se você deseja manter as alterações,

git stash save
git checkout branch
git stash pop

10
Na verdade o que Romerun diz (para ser completa): git stash save(quando em muitos ramos de trabalho), em seguida, git checkout branchXfazer algo git add/commit -metc. git checkout branchYe git stash poppara receber de volta o estoque
Highmastdon

2
Talvez sim. Eu tenho uma situação que onde eu quero fazer o que a resposta diz que, se eu estou entendendo direito: mudanças stash, interruptor de Y para X, em seguida, pop mudanças e comprometer-los em X.
Ben Klein

1
observe que git stash saveagora está obsoleto em favor degit stash push
Argento

Esse alias simplifica o caso de manter as alterações ao alterar ramificações.
Tom Hale

62

bem, deveria ser

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
Sim, o stash é global, não específico do ramo, se eu esconder pop depois de alternar entre ramos, receberei o mesmo stash que nos outros ramos
Aditya Mittal

6
Note-se git stashserá o padrão paragit stash save
Charlie-Greenman

Obrigado, é muito útil para mim
Govind Kumar


16

Observe que se você mesclou ramificações remotas ou possui confirmações locais e deseja voltar ao HEAD remoto, deve fazer:

git reset --hard origin/HEAD

HEAD sozinho se referirá apenas ao commit / mesclagem local - várias vezes eu esqueci que, ao redefinir e terminar com "seu repositório está com o X confirmado adiante", quando eu pretendia destruir TODAS as alterações / confirmações e retornar à ramificação remota .


9

Se você fez alterações nos arquivos que o Git também precisa alterar ao mudar de ramificação, isso não permitirá. Para descartar as alterações de trabalho, use:

git reset --hard HEAD

Então, você poderá trocar de ramificação.


9

Nenhuma dessas respostas me ajudou porque eu ainda tinha arquivos não rastreados, mesmo após a redefinição e a ocultação. Eu tive que fazer:

git reset --hard HEAD
git clean -d -f

4

alternando para uma nova ramificação perdendo alterações:

git checkout -b YOUR_NEW_BRANCH_NAME --force

alternando para uma filial existente perdendo alterações:

git checkout YOUR_BRANCH --force

4

Resposta fácil:

é forçar o checkout de uma filial

git checkout -f <branch_name>

Forçar o check-out de uma ramificação está dizendo ao git para eliminar todas as alterações que você fez na ramificação atual e finalizar a desejada.

ou caso você esteja verificando um commit

git checkout -f <commit-hash>


"pensei que eu poderia mudar de ramo sem confirmar. Se sim, como posso configurar isso? Se não, como posso resolver esse problema?"

A resposta para isso é Não , essa é literalmente a filosofia do Git: você monitora todas as alterações e que cada nó (ou seja, commit) precisa estar atualizado com as alterações mais recentes que você fez, a menos que você fez um novo commit, é claro.


Você decidiu manter as mudanças?

Em seguida, esconda-os usando

git stash

e, em seguida, para remover as alterações na ramificação desejada, use

git stash apply

que aplicará as alterações, mas também as manterá na fila de stash. Se você não quiser mantê-los na pilha de stash, coloque-os usando

git stash pop

Isso é o equivalente applye entãodrop


2

Feche o terminal, exclua a pasta onde está o seu projeto e, em seguida, clone novamente o seu projeto e pronto.


2
O git não foi projetado para empurrá-lo para excluir o projeto e clonar novamente! se você deseja obter a versão mais recente da origem, basta reset --hard!
Ahmed Nour Jamal El-Din

2

Se você deseja manter as alterações e alterar a ramificação em um comando de linha única

git stash && git checkout <branch_name> && git stash pop

1

Mover alterações não confirmadas para uma nova ramificação

Eu criei um .gitconfigalias para isso:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Para mudar para new-branch-name, use:

git spcosp new-branch-name

E quaisquer alterações de arquivo e índice não confirmadas serão mantidas.


1

git checkout -f your_branch_name

git checkout -f your_branch_name

se você tiver problemas para reverter alterações:

git checkout .

se você deseja remover diretórios e arquivos não rastreados:

git clean -fd

0

Para mudar para outro ramo sem confirmar as alterações quando o git stash não funcionar. Você pode usar o comando abaixo:

git checkout -f nome da filial

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.