git switch branch senza eliminare le modifiche locali


182

Bene, diciamo che un giorno ci accorgeremo di apportare un sacco di modifiche e quando andremo a commetterle notiamo che stavamo lavorando sul ramo sbagliato.

Come possiamo forzare git a cambiare ramo senza scartare le modifiche locali .

Probabilmente sto andando a fare questo in modo ingenuo mentre aspetto una risposta, ma vorrei sapere se esiste una procedura corretta poiché mentirei se dicessi che non mi è successo prima ...

  • Backup modificato repository
  • git reset --hard
  • git checkout right-branch
  • Ripristina modifiche
  • git commit -m "changes"

Risposte:


343

Ci sono molti modi diversi a seconda di quanto sei lontano e su quale ramo (i) li desideri.

Facciamo un classico errore:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Quindi ora vuoi che questi cambiamenti, a cui non ti sei ancora impegnato master, siano attivi develop.

  1. Se non haidevelop ancora un metodo, il metodo è banale:

    $ git checkout -b develop
    

    Questo crea una nuova developfiliale a partire da dove ti trovi ora. Ora puoi impegnarti e le nuove cose sono tutte attive develop.

  2. Si hanno una develop. Vedi se Git ti permetterà di cambiare senza fare nulla:

    $ git checkout develop
    

    Ciò avrà successo o si lamenterà. Se ci riesce, fantastico! Basta impegnarsi. Altrimenti ( error: Your local changes to the following files would be overwritten ...), hai ancora molte opzioni.

    Il più semplice è probabilmente git stash(come hanno detto tutti gli altri risponditori che mi hanno battuto al clic post). Esegui git stash saveo git stash push, 1 o semplicemente git stashche è l'abbreviazione di save/ push:

    $ git stash
    

    Questo commette il tuo codice (sì, fa davvero alcuni commit) usando uno strano metodo non-branch-y. I commit che effettua non sono "su" alcun ramo ma ora sono archiviati in modo sicuro nel repository, quindi ora puoi cambiare ramo, quindi "applicare" lo stash:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Se tutto va bene e ti piacciono i risultati, allora dovresti farlo git stash drop. Questo elimina il riferimento ai bizzarri commit non branch-y. (Sono ancora nel repository e a volte possono essere recuperati in caso di emergenza, ma per la maggior parte degli scopi, dovresti considerarli andati a quel punto.)

Il applypassaggio fa una fusione dei cambiamenti nascosti, usando il potente meccanismo di fusione sottostante di Git, lo stesso tipo di cose che usa quando si fanno le fusioni di rami. Ciò significa che puoi ottenere "unisci conflitti" se il ramo su cui stavi lavorando per errore è sufficientemente diverso dal ramo su cui intendevi lavorare. Quindi è una buona idea ispezionare attentamente i risultati prima di presumere che lo stash sia stato applicato in modo pulito, anche se Git stesso non ha rilevato alcun conflitto di unione.

Molte persone usano git stash pop, che è una scorciatoia per git stash apply && git stash drop. Va bene per quanto va, ma significa che se l'applicazione si traduce in un pasticcio e decidi di non voler proseguire su questo percorso, non puoi recuperare facilmente la scorta. Ecco perché raccomando applyrisultati separati e di controllo, dropsolo se / quando soddisfatti. (Questo ovviamente introduce un altro punto in cui puoi fare un'altra pausa caffè e dimenticare quello che stavi facendo, tornare indietro e fare la cosa sbagliata , quindi non è una cura perfetta.)


1 Il savein git stash saveè il vecchio verbo per la creazione di una nuova scorta. Git versione 2.13 ha introdotto il nuovo verbo per rendere le cose più coerenti pope per aggiungere più opzioni al comando di creazione. La versione 2.16 di Git ha deprecato formalmente il vecchio verbo (sebbene funzioni ancora in Git 2.23, che è l'ultima versione al momento in cui sto modificando questo).


3
Cosa succede se desidero passare a un altro ramo senza impegnarmi nel ramo corrente (ad es. Le modifiche non sono terminate) e successivamente tornare indietro per continuare?
stt106

@ stt106: devi ancora eseguire il commit, ma puoi farlo, come in questa e nelle altre risposte, tramite in git stashmodo che i commit - poiché git stash, ottieni due commit per voce stash, in una disposizione insolita - non si trovano su alcun ramo. Tranne casi speciali a brevissimo termine, in genere preferisco fare un commit normale. Puoi git reset --softo in git reset --mixedseguito, o usare git commit --amendper metterlo da parte, quando torni a lavorare su quel ramo. (Nel moderno Git, puoi anche usare git worktree add, che potrebbe essere una soluzione ancora migliore.)
torek

"Questo avrà successo o si lamenterà". Quali sarebbero le ragioni del successo o dell'errore durante il checkout?
nanocv,


tutte le mie modifiche locali si perdono quando passo con i passaggi precedenti Sono nel ramo <a> e faccio le mie modifiche e voglio passare al ramo <b> e spingere tutte le mie modifiche in quello. quando sto facendo git stash e mi sto spostando su altri rami, sta tirando tutti i file del ramo <b> e i miei cambiamenti locali si stanno perdendo
Mukul Munjal

38

Usa git stash

git stash

Spinge le modifiche in una pila. Quando si desidera ritirarli, utilizzare

 git stash apply

Puoi persino estrarre singoli oggetti. Per eliminare completamente la scorta:

 git stash clear

7
L'ultimo comando dovrebbe essere probabilmente git stash drop; git stash cleareliminerà l'intero stack di stash, inclusi gli stash eventualmente non correlati a questo set di comandi.
Leland,

15
  • git stash per salvare le modifiche non impegnate
  • git stash list per elencare gli stash non salvati salvati
  • git stash apply stash@{x} dove x può essere 0,1,2..no di stash che hai effettuato

4

Puoi:

  • Utilizzare git stashper archiviare le modifiche o,

  • Creare un altro ramo e confermare le modifiche lì, quindi unire quel ramo nella directory di lavoro

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.