spostare i file modificati in un altro ramo per il check-in


422

Questo mi succede spesso: scrivo un po 'di codice, vado a controllare le mie modifiche e poi mi rendo conto di non essere nel ramo giusto per verificare quelle modifiche. Tuttavia, non posso passare a un altro ramo senza ripristinare le modifiche. C'è un modo per spostare le modifiche in un altro ramo da controllare lì?

Risposte:


751

git stash È tuo amico.

Se non hai ancora effettuato il commit, esegui semplicemente git stash. Ciò salverà tutte le modifiche.

Passa al ramo in cui desideri apportare le modifiche ed esegui git stash pop.

Ci sono molti usi per git stash. Questo è sicuramente uno dei motivi più utili.

Un esempio:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
Non c'è bisogno di riporre le modifiche non impegnate, vengono con te quando controlli un ramo. Stash è più per l'archiviazione a lungo termine di cose temporanee (cose che vuoi finire e impegnare in seguito, ma devi fare qualcos'altro in questo momento).
Tekkub,

2
Capisco questo. Quindi devo nascondermi, cambiare ramo e poi pop C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS

3
@Tekkub "conservazione a lungo termine di cose temporanee" che dice che è molto imbarazzante, un altro punto per usare la scorta è che la spinge in una pila, quindi se non vuoi che si riporti e lavori su qualcos'altro è utile in quel modo . Sì, non è necessario ma si sente solo più pulito e più sotto controllo.
Atherion,

bravo baby! dovresti aggiungere cosa dovresti fare se hai fatto i commit
Ishan Srivastava il

2
@Tekkub Questo è vero solo se il ramo a cui stai passando è aggiornato con il ramo in cui ti trovi. Se, ad esempio, stai lavorando accidentalmente sul ramo del prod e devi passare al ramo dello stadio, ma lo stadio è cambiato nel frattempo, l'unico modo per effettuare il passaggio.
danielson317,

248

Se non hai già eseguito il commit delle modifiche , utilizza semplicementegit checkout per passare al nuovo ramo e quindi esegui il commit normalmente: le modifiche ai file non sono legate a un determinato ramo fino a quando non le esegui.

Se si dispone di già commesso le modifiche:

  1. genere git log e ricordare lo SHA del commit che si desidera spostare.
  2. Dai un'occhiata al ramo in cui vuoi spostare il commit.
  3. Digitare git cherry-pick SHAsostituendo lo SHA dall'alto.
  4. Torna al tuo ramo originale.
  5. Utilizzare git reset HEAD~1per ripristinare prima del commit del ramo sbagliato.

cherry-pick accetta un determinato commit e lo applica all'intestazione attualmente estratta, consentendo in tal modo di copiare il commit su un nuovo ramo.


9
Non dovresti nemmeno scegliere la ciliegia qui. git reset HEAD~N --softe quindi git checkout -bper spostare tutto il codice ora senza commit in un nuovo ramo.
Aaron,

19
le modifiche ai file non sono legate a un determinato ramo fino a quando non vengono commesse. <- questo. Questo ha risolto un mistero per me. Grazie.
Tschallacka,

8
Ottengo il seguente errore quando provo a cambiare ramo: "le modifiche locali ai seguenti file verrebbero sovrascritte dal checkout". Quindi, non mi sembra di potermi spostare in un altro ramo e impegnarmi normalmente.
Mischa,

3
@Mischa non funziona se si passa da due rami con storie diverse
all'altro con

1
@Aaron è molto più bello (per lo scenario post-commit)! Si prega di fare una risposta separata.
Jacktose,

16

Purtroppo questo succede anche a me abbastanza regolarmente e io uso git stashse ho realizzato il mio errore prima git commite uso git cherry-pickaltrimenti, entrambi i comandi sono spiegati abbastanza bene in altre risposte

Voglio aggiungere un chiarimento per git checkout targetBranch: questo comando manterrà la directory di lavoro e lo snapshot in scena solo se targetBranch ha la stessa cronologia del ramo corrente

Se non hai già eseguito il commit delle modifiche, utilizza semplicemente git checkout per passare al nuovo ramo e quindi esegui il commit normalmente

L'affermazione di @ Amber non è falsa, quando ci si sposta in un newBranch , git checkout -b newBranchviene creato un nuovo puntatore che punta allo stesso commit esatto del ramo corrente.
In effetti, se ti è capitato di avere un altro ramo che condivide la cronologia con il tuo ramo corrente (entrambi puntano allo stesso commit) puoi "spostare le tue modifiche" digit checkout targetBranch

Tuttavia, generalmente rami diversi significano cronologia diversa e Git non ti consentirà di passare da un ramo all'altro con una directory di lavoro sporca o un'area di gestione temporanea. nel qual caso puoi fare git checkout -f targetBranch(modifiche pulite e usa e getta) o git stage+git checkout targetBranch ( modifiche pulite e salvare ), semplicemente eseguendo git checkout targetBranchverrà visualizzato un errore:

errore: le modifiche locali ai seguenti file verrebbero sovrascritte dal checkout: ... Conferma le modifiche o nascondile prima di cambiare filiale. Interruzione


5

Un reset soft git riporterà le modifiche impegnate nel tuo indice. Successivamente, controlla la filiale su cui intendevi impegnarti. Quindi git commit con un nuovo messaggio di commit.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Dai documenti git :

git reset [<mode>] [<commit>]Questo modulo reimposta la testa del ramo corrente e, eventualmente, aggiorna l'indice (ripristinandolo all'albero di) e l'albero di lavoro a seconda. Se viene omesso, il valore predefinito è --mix. Deve essere uno dei seguenti:

--softNon tocca affatto il file indice o l'albero di lavoro (ma reimposta la testa, proprio come fanno tutte le modalità). Questo lascia tutti i tuoi file modificati "modifiche da impegnare", come direbbe lo stato git.

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.