Erro: não é possível puxar com rebase: você tem alterações sem etapas


138

Comecei a colaborar com alguns amigos em um projeto e eles usam o repositório heroku git.

Eu clonei o repositório há alguns dias e eles fizeram algumas alterações desde então, estou tentando obter as atualizações mais recentes

Executei o git pull --rebasecomando conforme indicado aqui (esta é a maneira correta de fazer isso?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Estou tendo o erro a seguir:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Meu palpite é que eu brinquei com o código e agora ele quer que eu confirme ou descarte (é isso o que stash significa?) As alterações. É isso que está acontecendo? Se for esse o caso, eu gostaria de descartar quaisquer alterações que eu possa ter feito e apenas obter o código atualizado no repositório git.

Alguma idéia do que eu posso fazer?

Respostas:


173

Do git status, este irá mostrar-lhe quais arquivos foram alterados. Como você declarou que não deseja manter as alterações, pode fazer git checkout -- <file name>ou git reset --hardse livrar delas.

Na maioria das vezes, o git lhe dirá o que fazer com as mudanças. Por exemplo, sua mensagem de erro dizia git stashsuas alterações. Isso seria se você quisesse mantê-los. Depois de puxar, você faria git stash pope suas alterações seriam reaplicadas.

git status também tem como se livrar das alterações, dependendo se o arquivo é preparado para confirmação ou não.


1
Este parecia ter trabalho, mas agora eu estou enfrentando outro erro (começou há novas questões para vistors futuras Não confunda): stackoverflow.com/questions/23518247/...
user3597950

Eu estou literalmente tendo isso toda vez, apenas recentemente. Antes, obter arquivos que não afetam as alterações atuais é bom, mas agora exige tudo o que você altera para esconder. Eu não posso nem empurrar, sou forçado a usargit push -f
Karma Blackshaw 10/06

@KarmaBlackshaw Você não precisa forçar o empurrão. Se você precisar fazer um empurrão forçado, isso significa que o seu histórico local e o histórico remoto são diferentes e essa é uma pergunta diferente da abrangida por esta resposta.
Schleis 10/06

É realmente diferente do que o escopo desta questão fornece. Mas encontrei uma maneira de excluir o ramo atual e criar um novo ramo a partir do desenvolvimento. Eu acho que foi o meu ramo que teve algumas coisas configuradas incorretamente.
Karma Blackshaw

91

Se você deseja manter as alterações de trabalho enquanto realiza uma nova refazer, você pode usá-lo --autostash. A partir da documentação :

Antes de iniciar o rebase, armazene as modificações locais (consulte git-stash [1] ), se necessário, e aplique o stash quando terminar.

Por exemplo:

git pull --rebase --autostash

7
Esta é a resposta moderna.
adl

13
Se você deseja que o autostash seja o comportamento padrão, você pode definir git config --global rebase.autoStash true Então você não precisa passar no comutador.
Zoredache

1
ISSO, o que eu estava procurando! (observe que a opção de linha de comando está disponível no git 2.9, mas a opção rebase.autostashestá disponível no 2.6).
Jjmontes # 04/18

Isso funciona muito bem git rebase --interactivetambém!
Dan Dascalescu

6
Por que esse não é o padrão?
Nick

49

Puxar com rebase é uma boa prática em geral.

No entanto, você não pode fazer isso se o seu índice não estiver limpo, ou seja, você fez alterações que não foram confirmadas.

Você pode fazer isso para contornar o problema, assumindo que deseja manter suas alterações:

  1. esconda suas alterações com: git stash
  2. puxe do mestre com rebase
  3. reaplique as alterações que você escondeu em (1) com: git stash apply stash@{0}ou a mais simplesgit stash pop

1
Este parecia ter trabalho, mas agora eu estou enfrentando outro erro (começou há novas questões para vistors futuras Não confunda): stackoverflow.com/questions/23518247/...
user3597950

6
@nehemiahjacob Você também pode git stash popaplicar as alterações escondidas mais recentemente e evitar memorizar por mais tempo apply stash@{0}.
Kostas Rousis 28/08

Eu tenho que fazer isso o tempo todo. Alguma maneira mais fácil?
Alper

@ normalmente, você trabalha em outro ramo (recurso). Na minha experiência, só busco e me refiro ao master depois de comprometer meu trabalho, portanto não há necessidade de esconder / pop. Se você encontrar-se embora fazendo muito isso durante seu fluxo de trabalho de desenvolvimento, você sempre pode fazer um alias em sua .bashrc(ou o que você usa):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@ KostasRousis Eu tenho esse pseudônimo exato, lol. Eu chamo de 'sppgit'
luizfls 10/03

30

Primeiro comece com um git status

Veja se você tem alguma alteração pendente. Para descartá-los, execute

git reset --hard

Este parecia ter trabalho, mas agora eu estou enfrentando outro erro (começou há novas questões para vistors futuras Não confunda): stackoverflow.com/questions/23518247/...
user3597950

16

Isso funciona para mim:

git fetch
git rebase --autostash FETCH_HEAD

1
Ah, autostash, isso me poupa mais dois comandos. Esta deve ser a resposta correta IMO.
Erik Berkun-Drevnig 23/11

10

Você sempre pode fazer

git fetch && git merge --ff-only origin/master

e você não obterá (a) nenhuma alteração se tiver alterações não confirmadas que conflitem com as alterações anteriores ou (b) o mesmo efeito que stash / pull / apply: uma reformulação para incluir as alterações mais recentes do HEAD e as alterações não confirmadas restantes como é.


6

Quando a mudança não-estática ocorre porque o git está tentando consertar as convenções eol em um arquivo (como sempre é o meu caso), nenhuma quantidade de stash, check-out ou redefinição o fará desaparecer.

No entanto, se a intenção é realmente reestruturar e ignorar as alterações não faseadas, o que faço é excluir a ramificação localmente e verificar novamente.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! Ainda não me falhou.


2

Se você deseja ocultar automaticamente suas alterações e removê-las para todas as novas versões, você pode fazer isso:

git config --global rebase.autoStash true

1
Essa é a única resposta que faz com que a versão mais recente do Git funcione da mesma maneira que o Git sempre funcionou no passado. Por que fazer as pessoas adicionarem --autostashquando pode ser apenas ... automático?
Andrew Koster
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.