2012-03-22 6 views
97

Sto iniziando con git, e un conflitto che ottengo è "entrambi aggiunti" - cioè, esattamente lo stesso nome è stato aggiunto indipendentemente nel mio ramo, e nel ramo su cui sto basandomi. git status mi dice:Risoluzione di un conflitto di unione "entrambi aggiunti" in git?

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
#  both added:   src/MyFile.cs 

La mia domanda è, come faccio a risolvere questo? Devo usare uno strumento di unione o esiste un modo per farlo solo dalla riga di comando? Se I git rm src/MyFile.cs, in che modo git sa quale versione del file voglio rimuovere e quale voglio mantenere?

risposta

97

Se si utilizza git rm git rimuoverà tutte le versioni di quel percorso dall'indice in modo che l'azione risolvibile ti lascerà senza alcuna versione.

È possibile utilizzare git checkout --ours src/MyFile.cs per scegliere la versione dal ramo su cui si sta ridefinendo o git checkout --theirs src/MyFile.cs per scegliere la versione dal ramo che si sta ridefinendo.

Se si desidera una fusione è necessario utilizzare uno strumento di unione o modificarlo manualmente.

+1

Grazie. E ho appena capito che il motivo per cui lo strumento di fusione non funzionava era perché git crea i file .LOCAL e .REMOTE per l'unione, ma non il file .BASE. Penso che dovrebbe solo creare un file .BASE vuoto. Se si crea manualmente il file .BASE vuoto, lo strumento di unione funziona correttamente. – Jez

+1

@Jez: vedere questa discussione: http://thread.gmane.org/gmane.comp.version-control.git/188776/focus=188867 –

+1

Quindi stai dicendo che verrà corretto in una versione recente di git? – Jez

51

A volte trovo confuso utilizzando le opzioni --theirs e --ours per identificare da dove verrà il file. Il più delle volte il mio sarà nel ramo che sto ribadendo a cui si fa riferimento --theirs!

È inoltre possibile utilizzare git checkout <tree-ish> -- src/MyFile.cs

Qualora il <tree-ish> può essere sostituito o dal nome del ramo o commettere-id che contiene il file che si desidera conservare.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

26

Nel fare ...

git checkout --ours someFile

Può sembrare che non ha fatto nulla quando si fa git status.

Ricordarsi di fare questo in seguito.

git add someFile 
git status