Errore: impossibile eseguire il pull con rebase: sono presenti modifiche non messe in scena


138

Ho iniziato a collaborare con alcuni amici a un progetto e usano il repository heroku git.

Ho clonato il repository alcuni giorni fa e da allora hanno apportato alcune modifiche, quindi sto cercando di ottenere gli ultimi aggiornamenti

Ho eseguito il git pull --rebasecomando come indicato qui (È questo il modo giusto per farlo?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Ottengo il seguente errore:

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

La mia ipotesi è che ho fatto un casino con il codice e ora vuole che io commetta o scarti (è questo che significa stash?) Le modifiche. È questo che sta succedendo? Se questo è il caso, vorrei annullare tutte le modifiche che avrei potuto apportare e ottenere semplicemente il codice aggiornato dal repository git.

Qualche idea di cosa posso fare?

Risposte:


173

Fai git status, questo ti mostrerà quali file sono stati modificati. Dato che hai dichiarato di non voler mantenere le modifiche che puoi fare git checkout -- <file name>o git reset --harddi sbarazzartene.

Per la maggior parte, git ti dirà cosa fare con i cambiamenti. Ad esempio, il tuo messaggio di errore ha detto alle git stashtue modifiche. Questo sarebbe se volessi tenerli. Dopo aver tirato, lo faresti git stash pope le tue modifiche verrebbero riapplicate.

git status ha anche come eliminare le modifiche a seconda che il file sia messo in scena per il commit o meno.


1
Questo sembrava avere lavoro, ma ora sto affrontando un altro errore (ripreso a domande a dirottano futuri a non confondere): stackoverflow.com/questions/23518247/...
user3597950

Lo sto letteralmente ogni volta, solo di recente. In precedenza, il recupero di file che non influisce sulle modifiche correnti va bene, ma ora richiede tutto ciò che è stato modificato. Non riesco nemmeno a spingere, sono costretto a usaregit push -f
Karma Blackshaw il

@KarmaBlackshaw Non dovresti aver bisogno di forzare la spinta. Se devi fare una spinta forzata, ciò significa che la tua cronologia locale e la cronologia remota sono diverse e questa è una domanda diversa rispetto a ciò che copre questa risposta.
Schleis,

È davvero diverso da ciò che fornisce l'ambito di questa domanda. Ma ho trovato un modo cancellando il ramo corrente e sviluppando un nuovo ramo. Immagino che fosse il mio ramo che aveva alcune cose configurate erroneamente.
Karma Blackshaw,

91

Se si desidera mantenere le modifiche operative durante l'esecuzione di un rebase, è possibile utilizzare --autostash. Dalla documentazione :

Prima di iniziare rebase, riponi le modifiche locali (vedi git-stash [1] ) se necessario, e applica lo stash quando hai finito.

Per esempio:

git pull --rebase --autostash

7
Questa è la risposta moderna.
adl

13
Se si desidera che l'autashash sia il comportamento predefinito che è possibile impostare git config --global rebase.autoStash true , non è necessario passare l'interruttore.
Zoredache,

1
QUESTO, quello che stavo cercando! (nota che l'opzione della riga di comando è disponibile da git 2.9, ma l'opzione rebase.autostashè disponibile da 2.6).
jjmontes

Funziona benissimo git rebase --interactiveanche per questo!
Dan Dascalescu,

6
Perché non è questo il valore predefinito?
Nick

49

Tirare con rebase è una buona pratica in generale.

Tuttavia, non è possibile farlo se l'indice non è pulito, ovvero sono state apportate modifiche che non sono state confermate.

Puoi farlo per aggirare, supponendo che desideri mantenere le modifiche:

  1. riponi le tue modifiche con: git stash
  2. estrarre dal master con rebase
  3. riapplica le modifiche che hai nascosto in (1) con: git stash apply stash@{0}o il più semplicegit stash pop

1
Questo sembrava avere lavoro, ma ora sto affrontando un altro errore (ripreso a domande a dirottano futuri a non confondere): stackoverflow.com/questions/23518247/...
user3597950

6
@nehemiahjacob Puoi anche git stash popapplicare le modifiche nascoste più di recente ed evitare di memorizzare più a lungo apply stash@{0}.
Kostas Rousis,

Devo farlo sempre. Qualche modo più semplice?
Alper,

@alper di solito lavori su un altro ramo (funzione). Nella mia esperienza, prendo e ribasso contro il maestro solo dopo aver impegnato il mio lavoro, quindi non c'è bisogno di stash / pop. Se ti ritrovi a fare molte cose durante il tuo flusso di lavoro di sviluppo, puoi sempre creare un alias nel tuo .bashrc(o qualunque cosa tu usi):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis Ho quell'alias esatto, lol. Lo chiamo 'sppgit'
luizfls il


16

Questo funziona per me:

git fetch
git rebase --autostash FETCH_HEAD

1
Ah autashash, che mi fa risparmiare altri due comandi. Questa dovrebbe essere la risposta corretta IMO.
Erik Berkun-Drevnig,

10

Puoi sempre fare

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

e non otterrai (a) nessuna modifica se hai modifiche senza commit che sono in conflitto con le modifiche a monte o (b) lo stesso effetto di stash / pull / apply: un rebase per metterti sulle ultime modifiche da HEAD e le tue modifiche senza commit rimaste come è.


6

Quando la modifica non messa in scena è dovuta al fatto che git sta tentando di correggere le convenzioni di eol su un file (come sempre nel mio caso), nessuna quantità di stash, check-out o reimpostazione lo farà scomparire.

Tuttavia, se l'intenzione è davvero di riformulare e ignorare le modifiche non messe in scena, ciò che faccio è eliminare il ramo localmente, quindi ricontrollarlo.

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

Ecco! Non mi ha ancora deluso.


2

Se si desidera archiviare automaticamente le modifiche e annullarle per ogni rebase, è possibile effettuare questa operazione:

git config --global rebase.autoStash true

1
Questa è l'unica risposta che fa funzionare la versione più recente di Git nello stesso modo in cui Git ha sempre funzionato in passato. Perché fare in modo che le persone aggiungano --autostashquando può essere solo ... automatico?
Andrew Koster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.