Erro ao mudar para ramo principal: minhas alterações locais seriam substituídas pelo checkout

127

Esta pergunta é semelhante a esta , mas mais específica.

Eu tenho um projeto com dois ramos ( staginge beta).

Eu desenvolvo staginge uso o masterramo para corrigir erros. Portanto, se estou trabalhando no preparo e vejo um erro, mudo para masterbranch:

git checkout master

e faça as coisas:

git add fileToAdd
git commit -m "bug fixed"

e depois mesclo com os dois ramos:

git checkout staging
git merge master
git checkout beta
git merge beta

E não importa se há outros arquivos na árvore de trabalho.

Mas agora, quando tento mudar para o masterramo, estou recebendo um erro :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Eu pensei que eu deveria remover o arquivo da área de teste:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

mas estou recebendo o mesmo erro. Se git statuseu receberNo changes to commit

Manolo
fonte
4
Você já tentou reset --hard? Se você realmente tem certeza de que deseja descartar suas alterações. Ou use esconderijo se não o fizer.
Keltar
@keltar - Não. Não quero descartar minhas alterações. Apenas mantê-los na árvore de trabalho para uma tarde comprometer
Manolo
1
Eu não acho que você pode mudar de ramo mantendo alterações não confirmadas, mas eu poderia estar errado - não é realmente o meu campo. Tente se git add your-filecomprometer.
Keltar
@keltar - Eu trabalhei antes dessa maneira. Não quero confirmar nenhuma alteração no stagingmomento.
Manolo
Talvez o seu arquivo conflitante não tenha sido alterado quando você tentou isso antes. Você tem alterações, o git precisa salvá-las em algum lugar para restaurar mais tarde. É muito improvável que seja possível sem confirmações. Mas se você realmente não quiser usar o stash, é exatamente por isso que ele existe.
Keltar

Respostas:

128

Seu erro aparece quando você modifica um arquivo e a ramificação para a qual você está alternando também possui alterações para esse arquivo (do último ponto de mesclagem).

Suas opções, como eu vejo, são - commit e, em seguida, altere esse commit com alterações extras (você pode modificar os commit no git, desde que não sejam pusheditados); ou - use esconderijo:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savecriará stash que contém suas alterações, mas não está associado a nenhuma confirmação ou mesmo ramificação. git stash popaplicará a entrada mais recente do stash à sua ramificação atual, restaurando as alterações salvas e removendo-a do stash.

Keltar
fonte
3
Obrigado. Tem certeza de que isso não fará nenhuma alteração na minha árvore de trabalho (arquivos não adicionados)? Eu não quero perder minhas alterações: - /
Manolo
Ops, digitado incorretamente addquando é realmente saveatualizado. Você quer dizer, para outros arquivos? git stash savesem o nome do arquivo, o parâmetro salvará todos os arquivos modificados, se você desejar (e revertê-los para o estado confirmado mais recente). E ter uma cópia extra da árvore de diretórios nunca é demais, mas estou sempre paranóico com isso.
Keltar
A coisa seria salvar todos os arquivos modificados, exceto o que eu quero adicionar à masterramificação. Além disso, uma opção seria popas alterações em outro ramo?
Manolo
Não sei bem o que você quer dizer. Sim, você pode aplicar o stash em outro ramo, mas ele simplesmente substituirá o conteúdo dos arquivos, não os mesclará.
Keltar
1
@ Mel não tem nada a ver com ramos, o problema é alterações não confirmadas. O checkout, por definição, precisa redefinir seus arquivos para o estado de master, mas, ao fazer isso, perderá o conteúdo atual e, como esse conteúdo não é confirmado, seria impossível retornar a esse estado posteriormente, daí um erro para que você não ficaria chateado com alterações perdidas mais tarde.
Keltar
150

Encontrei o mesmo problema e resolvi-o

git checkout -f branch

e sua especificação é bastante clara.

-f, --force

Ao alternar ramificações, continue mesmo se o índice ou a árvore de trabalho diferirem de HEAD. Isso é usado para jogar fora as alterações locais.

Ao fazer o check-out de caminhos do índice, não falhe nas entradas não imersas; em vez disso, entradas não mescladas são ignoradas.

KikiYu
fonte
7
Quando meu git ficou atolado (sem alterações locais, mas ainda com esse erro), essa solução me ajudou!
Lukyer
5
Obrigado, você salvou minha tela de obter um punho por ela.
Owl
3
Eu perdi minhas alterações que maneira
Jacek Dziurdzikowski
1
Sim, você perderá alterações fazendo isso, isso deve vir com uma grande ressalva.
21818 Alexander Mills
Eu quero o contrário. master está por trás da minha ramificação e eu estou em dia com a master, mas ainda não consigo alternar ramificações. Deve ser um bug do Git.
Jgmjgm 16/04/19
12

Você pode forçar o checkout de sua filial, se não desejar confirmar suas alterações locais.

git checkout -f branch_name
Deepika Patel
fonte
1
O sudonão é necessário, ele apenas quebrará as permissões do arquivo. É o mesmo comando git postado por @kiki_yu um ano antes, mas é ainda pior.
kenorb
2
Eu perdi minhas alterações que maneira
Jacek Dziurdzikowski
2
@JacekDziurdzikowski Então, você perdeu suas alterações duas vezes (veja o comentário na resposta de kiki_yu), aplicando soluções que mencionavam explicitamente que o descarte de alterações locais era o próprio objetivo . Meu detector de sarcasmo está quebrado ou ... você está falando sério?
RomainValeri
@RomainValeri Hmm, acho que essa foi a minha maneira de alertar outras pessoas que são iniciantes com o git (elas precisam ser iniciantes se estiverem lendo este post) para estarem prontas para se despedir de todas as alterações que fizeram. Eu pensei que o tempo em que as alterações feitas em um ramo deveriam permanecer nesse ramo até que eu faça o checkout novamente. Dica para os novatos que também pensam assim: use o git stash :) #
711 Jacek Dziurdzikowski
Resposta duplicada, sem motivo. A primeira resposta tem ainda mais informações.
MAChitgarha 23/01
9

Encontrei o mesmo problema e resolvi-o

ramo git checkout -f

Bem, tenha cuidado com o -finterruptor. Você perderá quaisquer alterações não confirmadas se usar o -fcomutador. Embora possa haver alguns casos de uso em que é útil -f, na maioria dos casos, convém fazer stashas alterações e depois switchramificar. O stashingprocedimento é explicado acima.

BeNiza
fonte
0

Você pode confirmar na ramificação atual, finalizar a compra para outra ramificação e, finalmente, escolher essa confirmação (em vez de mesclar).

Vitaly Zdanevich
fonte
Pode ser mais útil se você der mais explicações sobre isso.
MAChitgarha 23/01
-1

Se você conseguir isso ao tentar verificar um ramo diferente:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Isso significa que você tem algumas alterações que precisa confirmar na ramificação que fez check-out - ou precisa limpá-las ou escondê-las como a maioria dos pontos acima. 19 em 20 vezes, tenho mais chances de confirmar minhas alterações.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Agora que você fez isso, pode verificar o outro ramo e alternar facilmente.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Apenas verifique se você está no ramo direito e pressionando para o ramo direito ao executar o comando git push origin $ {branch}. Nota: se você tiver seu projeto conectado diretamente ao Intellij, poderá ver que alterou sua ramificação no canto inferior direito da janela principal.

Tony Fraser
fonte