2010-11-03 10 views
5

Assumendo che un file sia in stato di conflitto con git.git: memorizza le diverse fasi di un file nell'indice/albero di lavoro dopo il conflitto

Significa che l'indice contiene 3 versioni del file, la precedente, quella da un ramo, quella dall'altro.

Vorrei eseguire il checkout della versione 3 ("loro") nella directory di lavoro e la versione di stage 2 ("nostra") nell'indice.

C'è un modo indolore per farlo?

+0

In realtà è la "nostra" versione (dal ramo corrente che si fondono in), la versione "loro" (dal ramo che si sta unendo) e la versione "antenato" (antenato comune di entrambi i rami) - non la versione precedente in generale. –

risposta

4

Probabilmente il modo più indolore è così.

# Checkout 'their' version from the index into the working tree 
git checkout --theirs file 

# reset the index to the HEAD version, i.e 'our' branch 
git reset HEAD file 

trafficando con l'indice con il update-index impianto idraulico non dovrebbe essere necessario a meno che non hai perso il tuo HEAD (per così dire).

+0

Eccellente. Molto più semplice +1 – VonC

1

Il trucco è in "aggiunta di una versione all'indice": ciò contrassegna il file come risolto (ovvero non più "nostro" o "loro").
Quindi deve essere l'ultimo passaggio.

Forse qualcosa di simile:

git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file 
git show :2:<filename> > <filename>  # display the "ours" version in the working dir 
git add <filename>       # add it to the index 
              # (marking the conflicting file as resolved) 
move <filename>.theirs <filename>  # erasing the file with the "theirs" version 
              # in the working directory 

Non esattamente "indolore" ...


Per evitare il file temporaneo, Jakub Narębski suggerisce di utilizzare git update index (un comando idraulico) per manipolare direttamente l'indice.

--replace --cacheinfo <mode> <object> <path> 

--cacheinfo viene utilizzato per registrare un file che non si trova nella directory di lavoro corrente. Questo è utile per la fusione con il check-out minimo.

Per impostazione predefinita, quando un indice di file esiste nell'indice, git update-index rifiuta un tentativo di aggiungere path/file. Allo stesso modo, se esiste un file path/file, non è possibile aggiungere un percorso file. Con il flag --replace, le voci esistenti che sono in conflitto con la voce aggiunta vengono automaticamente rimosse con messaggi di avviso.

+0

VonC: hai ottenuto il trucco giusto: l'aggiunta distrugge le fasi dell'indice. Ho trovato la tua soluzione finora! :-) Non è affatto indolore, ma grazie comunque! Sono più alla ricerca di qualche comando idraulico git che possa ottenere ciò senza il problema di archiviare un file temporaneo. –

+0

@Olivier: va bene, aspetta Jakub o Jefromi o Charles o ... in qualsiasi momento ora;) – VonC

+0

Puoi usare a basso livello ['git update-index'] (http://www.kernel.org/pub /software/scm/git/docs/git-update-index.html) per manipolare l'indice: vedere '--cacheinfo ' (forse con '--replace') e' --force-remove' options. –

Problemi correlati