Annulla git stash pop che provoca conflitti di unione


519

Ho iniziato ad apportare modifiche al mio codebase, senza rendermi conto che ero su un vecchio argomento. Per trasferirli, volevo metterli da parte e quindi applicarli a un nuovo ramo fuori dal master. Ho usato git stash popper trasferire le modifiche work-in-progress di questo nuovo ramo, dimenticando che non avevo tirato nuove modifiche nel maestro prima di creare il nuovo ramo. Ciò ha comportato una serie di conflitti di unione e la perdita di una scorta netta dei miei cambiamenti (da quando ho usato pop).

Dopo aver ricreato correttamente il nuovo ramo, come posso recuperare le modifiche nascoste per applicarle correttamente?

Risposte:


657

A quanto pare, Git è abbastanza intelligente da non perdere una scorta se non si applica in modo pulito. Sono stato in grado di raggiungere lo stato desiderato con i seguenti passaggi:

  1. Per annullare la messa in scena dei conflitti di unione: git reset HEAD .(notare il punto finale)
  2. Per salvare l'unione in conflitto (per ogni evenienza): git stash
  3. Per tornare al master: git checkout master
  4. Per estrarre le ultime modifiche: git fetch upstream; git merge upstream/master
  5. Per correggere la mia nuova filiale: git checkout new-branch; git rebase master
  6. Per applicare le modifiche stash corrette (ora 2 ° in pila): git stash apply stash@{1}

14
Eccellente grazie! # 6 è davvero la risposta che stavo cercando. Potrebbe aggiungere a git stash dropcome ultimo passaggio per sbarazzarsi della scorta indesiderata dal n. 2.
austinmarton,

2
# 2 non funzionerà se sono presenti percorsi non uniti, verrà invece generato l'errore qui descritto: stackoverflow.com/questions/5483213/…
Étienne

5
Non del tutto vero: Git manterrà lo stash nell'elenco degli stash se non si applica in modo pulito. Vedi questi documenti su git stash pop: "L'applicazione dello stato può fallire con i conflitti; in questo caso, non viene rimosso dall'elenco degli stash. È necessario risolvere i conflitti manualmente e chiamare git stash dropsuccessivamente in seguito". ( git-scm.com/docs/git-stash )
Carolyn Conway

4
Strano come questa risposta e la domanda siano pubblicate nello stesso preciso minuto
chiamami

14
@ call-me Questo è qualcosa che penso che le persone dovrebbero effettivamente fare più spesso! Nota come il modulo "Poni una domanda" ha una casella di controllo che ti consente di rispondere alla tua domanda nello stesso modulo :). Questo a volte mi capita quando sto scrivendo una domanda che mi stordisce, ma nel tentativo di ottimizzare la domanda per StackOverflow, finisco per capire la soluzione. Questo è successo un po 'di tempo fa, quindi non ricordo se fosse il caso qui, ma immagino che sia successo.
Acjay,

342

Per fortuna git stash popnon non cambia la scorta nel caso di un conflitto!

Quindi, niente di cui preoccuparsi, basta ripulire il codice e riprovare.

Supponi che la tua base di codice sia stata pulita prima, puoi tornare a quello stato con: git checkout -f
Quindi fai le cose che hai dimenticato, ad esempio git merge missing-branch
Dopo che git stash pophai appena sparato di nuovo e ottieni la stessa scorta, che prima era in conflitto.

Attenzione: lo stash è sicuro, tuttavia non lo sono le modifiche non confermate nella directory di lavoro. Possono incasinarsi.


16
Quello che capisco è che puoi semplicemente ripulire e pop di nuovo, ma non puoi annullarlo . Se il pop si mescola con altre modifiche non impegnate, devi ripulire manualmente.
Haridsv,

Questa è una soluzione molto semplice e ha funzionato benissimo per me. Si presume che sia possibile ripristinare tutto ciò che è cambiato localmente (non sono state apportate modifiche prima / dopo lo stash), che penso funzioni per la maggior parte delle situazioni. Se è necessario salvare alcune modifiche aggiuntive che si sono verificate prima di rendersi conto che si trattava di un problema, nella maggior parte dei casi si dovrebbe essere in grado di eseguire il commit di tali file prima di forzare un checkout.
Progetto 707,

Questo non era il caso per me. L'ho chiamato ho git stash poptentato di unirmi automaticamente, sono in conflitto e l'ho tenuto.
Trevor Hickey,

1
@TrevorHickey Il punto di questa risposta è che lo stash rimane com'è in caso di conflitto, che puoi chiamare tutte git stash pople volte che ti serve fino a quando non finisce senza un conflitto. Quindi, dopo il conflitto, sì, la directory di lavoro è in disordine, tuttavia, è possibile ripulirla e richiamare git stash pop.
flori,

5
questo comando per annullare l'ultima applicazione stash è molto utile git checkout -f:!
Lefi Tarik,

16

Le istruzioni qui sono un po 'complicate, quindi offrirò qualcosa di più semplice:

  1. git reset HEAD --hard Abbandona tutte le modifiche al ramo corrente

  2. ... Eseguire il lavoro intermedio, se necessario

  3. git stash pop Re-pop la scorta di nuovo in un secondo momento quando sei pronto



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.