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?

user3597950
fonte

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.

Schleis
fonte
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
mkobit
fonte
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
Kostas Rousis
fonte
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
Igal S.
fonte
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
CppChase
fonte
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 é.

Jared Updike
fonte
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.

tggagne
fonte
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
agirault
fonte
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