2011-08-27 12 views
191

Questo mi succede spesso: scrivo del codice, vado a controllare le mie modifiche e poi mi rendo conto di non essere nel ramo corretto per controllare le modifiche. Tuttavia non posso passare ad un altro ramo senza che le mie modifiche vengano ripristinate. C'è un modo per spostare le modifiche su un altro ramo da controllare lì?spostamento di file modificati in un altro ramo per il check-in

risposta

321

git stash è tuo amico.

Se non è stato ancora eseguito il commit, è sufficiente eseguire git stash. Ciò salverà tutte le tue modifiche.

Passare al ramo in cui si desiderano le modifiche ed eseguire git stash pop.

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

Un esempio:

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

Non c'è bisogno di mettere da parte non salvate cambiate, vanno con te quando si controlla un ramo. Stash è più per la memorizzazione a lungo termine di cose temporanee (cose che vuoi finire e commettere in seguito, ma devi fare qualcos'altro in questo momento). – Tekkub

+0

Ho capito. Quindi devo nascondere, cambiare ramo e quindi inserire 'C: \ kf [sviluppare +0 ~ 4 -0]> funzione checkit git/clienti
errore: le modifiche locali ai seguenti file verrebbero sovrascritte dal pagamento:
AspWebApp.vNext/global.asa
RestApi/Web.config
Prego, commettete le modifiche o mettetele da parte prima di poter cambiare ramo.
Aborting' – IsmailS

+0

@Tekkub "archiviazione a lungo termine di cose temporanee" che dice che si sente molto imbarazzante, un altro punto per usare la memoria è che lo spinge in una pila, quindi se non vuoi che riporti e lavori su qualcos'altro è utile in questo modo. Sì, non è necessario, ma si sente semplicemente più pulito e più controllato. – Atherion

113

Se non avete già commesso le modifiche, basta usare git checkout per passare al nuovo ramo e poi commetterli normalmente - le modifiche ai file non sono legati ad un ramo particolare fino a quando li si commettono.

Se avete già commesso le modifiche:

  1. Tipo git log e ricordare lo SHA del commit che si desidera spostare.
  2. Controllare il ramo su cui si desidera spostare il commit.
  3. Digitare git cherry-pick SHA sostituendo lo SHA dall'alto.
  4. Torna al tuo ramo originale.
  5. Utilizzare git reset HEAD~1 per reimpostare prima del commit del ramo errato.

cherry-pick accetta un dato commit e lo applica al capo attualmente estratto, consentendo così di copiare il commit su un nuovo ramo.

+4

Brilliant! Mi hai appena salvato da me stesso. ;) – Ben

+4

+1 per 'cherry-pick' – Jackson

+3

Non dovresti nemmeno aver bisogno di selezionare qui. 'git reset HEAD ~ N --soft' e poi' git checkout -b' per spostare tutto il codice _now_ uncommitted in un nuovo ramo. – Aaron

21

Se si desidera spostare le modifiche in un nuovo ramo, questo può essere fatto con due soli comandi:

git stash 
git stash branch new-branch 

Secondo il git stash documentation:

branch <branchname> [<stash>]

Creates and checks out a new branch named <branchname> starting from the commit at which the <stash> was originally created, applies the changes recorded in to the new working tree and index.

0

Purtroppo questo succede a e abbastanza regolarmente come bene e io uso git stash se ho realizzato il mio errore prima git commit e utilizzare git cherry-pick in caso contrario, entrambi i comandi sono spiegati molto bene in altre risposte

voglio aggiungere una precisazione per git checkout targetBranch: questo comando conserverà solo il vostro directory di lavoro e messo in scena snapshot se targetBranch ha la stessa storia come la vostra filiale corrente

If you haven't already committed your changes, just use git checkout to move to the new branch and then commit them normally

@ dichiarazione di Amber non è falso, quando si sposta in un newBranch, git checkout -b newBranch, un nuovo puntatore i s creato e punta allo stesso identico commit del ramo attuale.
Infatti, se è capitato di avere un altro ramo che condivide la storia con il vostro ramo corrente (sia punto allo stesso commit) si può "spostare i cambiamenti" da git checkout targetBranch

Tuttavia, di solito diversi rami significa storia diversa, e Git non ti permetterà di passare tra questi rami con una directory di lavoro sporca o un'area di staging. nel qual caso è possibile fare git checkout -f targetBranch (cambiamenti pulite e usa e getta) o git stage + git checkout targetBranch (pulita e Salva modifiche), semplicemente eseguendo git checkout targetBranch darà un errore:

error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches. Aborting

Problemi correlati