Risolvere un conflitto di unione "entrambi aggiunti" in git?


138

Sto ribellando in git, e un conflitto che ottengo è 'entrambi aggiunti' - cioè esattamente lo stesso nome è stato aggiunto indipendentemente nel mio ramo, e nel ramo su cui mi sto rifacendo. git statusmi dice:

# 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 posso risolverlo? Devo usare uno strumento di unione o esiste un modo per farlo solo dalla riga di comando? Se io git rm src/MyFile.cs, come fa git a sapere quale versione del file voglio rimuovere e quale voglio conservare?

Risposte:


139

Se usi git rmgit, tutte le versioni di quel percorso verranno rimosse dall'indice, quindi l'azione di risoluzione ti lascerà senza nessuna versione.

È possibile utilizzare git checkout --ours src/MyFile.csper scegliere la versione dal ramo su cui si sta eseguendo la rebasing o git checkout --theirs src/MyFile.csper scegliere la versione dal ramo su cui si sta eseguendo la rebasing.

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 unione non funzionava era perché git creava 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
Quindi stai dicendo che questo sarà risolto in una recente versione di Git?
Jez,

1
@Jez: è nelle versioni git> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey

21
Dalle risposte di @Tom: quando si fa ... git checkout --ours someFile Può sembrare che non abbia fatto nulla quando si fa lo stato git. Ricordati di farlo dopo. git add someFile git status
pec

72

A volte trovo confuso l'uso delle opzioni --theirse --oursper identificare la provenienza del file. La maggior parte delle volte la mia sarà nel ramo che sto rifacendo, a cui fa riferimento --theirs!

Puoi anche usare git checkout <tree-ish> -- src/MyFile.cs

Dove <tree-ish>può essere sostituito dal nome della filiale o dall'ID commit 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


42

Quando si fa ...

git checkout --ours someFile

Può sembrare che non abbia fatto nulla quando ha fatto lo stato git.

Ricordati di farlo dopo.

git add someFile
git status
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.