2014-10-10 7 views
6

In Git, come potrei controllare un ramo più vecchio conservando tutte le mie modifiche dal ramo corrente, ma sarebbero state semplicemente contrassegnate come modifiche non salvate o nuovi file.Git: controlla un ramo mantenendo le modifiche non modificate

Esiste un comando come git checkout-but-keep-changes branch_name?

+0

Non è chiaro cosa stai chiedendo. Quando dici "le mie modifiche" ti riferisci a commit a un ramo precedente, o file modificati, o? –

+0

@AndrewC Grazie, ho aggiornato la mia domanda. –

+0

La risposta del 3340 copre quasi tutto in quel caso. –

risposta

-1

ero alla ricerca di un git resettare --soft

dispiace la mia domanda non era molto chiaro.

10

Git normally does this quando si controllano i file, supponendo che le modifiche apportate non riguardino i file che verranno modificati dal checkout. Ad esempio, supponiamo di avere i seguenti file in un repository:

a.txt 
b.txt 
c.txt 

Ora farò una modifica a un file a.txt:

a.txt (modified) 
b.txt 
c.txt 

Ora supponiamo di avere altri due rami, a-changed e b-changed, in cui sono stati modificati rispettivamente a.txt e b.txt.

Se provo a verificare b-changed, Git lo farà senza reclami, perché le mie modifiche alla directory di lavoro non sono in conflitto con le modifiche apportate su quel ramo. Tuttavia, se provo a dare un'occhiata a a-changed, Git non lo farà, perché ho apportato delle modifiche alla mia copia locale, e il checkout le avrebbe scoperte. Git dice:

$ git checkout a-changed 
error: Your local changes to the following files would be overwritten by checkout: 
     a.txt 
Please, commit your changes or stash them before you can switch branches. 
Aborting 

Git non vi fornirà un modo per aggirare questo problema: stash your changes! Ciò salva le modifiche correnti come una patch e le annulla nella directory di lavoro. Cioè, dopo aver eseguito git stash, la directory di lavoro verrà pulita e le tue modifiche saranno posizionate sullo stack . È quindi possibile eseguire il checkout del ramo desiderato ed eseguire git stash pop, che farà scoppiare le modifiche dallo stack e applicarle al nuovo albero di lavoro. Spero che si applicheranno in modo pulito. Se non lo fanno, otterrai gli indicatori di conflitto standard di unione in a.txt. In particolare, lo stash è non fuori dallo stack, quindi è necessario eseguire un git stash drop dopo aver risolto l'unione.

È inoltre possibile passare il flag -m (--merge) al comando checkout, che indica che si desidera che le modifiche siano unite a tre vie con le modifiche in entrata. In generale, preferisco mettere da parte le cose.