Come posso risolvere un conflitto di unione dovuto alla rimozione di un file in un ramo?


225

Ho creato un dialogramo e quando provo a unirlo al masterramo. Ci sono 2 conflitti. Non so come risolvere CONFLICT (delete/modify). Puoi dirmi cosa fare per favore?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

Ho aperto src/DialogAdapter.java, risolto il conflitto e ho fatto un file git add src/DialogAdapter.java. Cos'altro devo fare?


Puoi leggere questo post su Stack Overflow: - Come posso risolvere i conflitti di unione in Git? La risposta accettata fa riferimento al manuale di git .
pesante

Risposte:


284

Il messaggio di conflitto:

CONFLITTO (elimina / modifica): res / layout / dialog_item.xml eliminato nella finestra di dialogo e modificato in HEAD

significa che è res/layout/dialog_item.xmlstato cancellato nel ramo 'dialog' che stai unendo, ma è stato modificato in HEAD (nel ramo in cui ti stai unendo).

Quindi devi decidere se

  • rimuovi il file utilizzando " git rm res/layout/dialog_item.xml"

o

  • accetta la versione da HEAD (magari dopo averla modificata) con " git add res/layout/dialog_item.xml"

Quindi finalizzi l'unione con " git commit".

Nota che git ti avviserà che stai creando un merge commit, nel (raro) caso in cui è qualcosa che non vuoi. Probabilmente risale ai giorni in cui detto caso era meno raro.


24
git rm …Ho provato il primo ( ) ma ottengo …: needs mergee rm '…'che sto avendo difficoltà a interpretare. E poi se provo a eseguire il commit, stackoverflow.com/questions/19985906/… viene nuovamente visualizzato.
Jesse Glick

17
Non importa la seconda metà di quel commento. L'output di Git è alquanto allarmante ma sembra innocuo.
Jesse Glick

4
Esiste un approccio di massa? Ho un progetto a portata di mano che si basa su cose esterne che non voglio mantenere. Quindi ci sono molti file che sono stati modificati a monte e voglio eliminare nel mio ramo che sto ribasando indipendentemente da cosa. È noioso farlo uno per uno.
mlt

2
@mit: puoi usare git ls-files --stagee / o git status --porcelaine / o git diff-files <something>per ottenere l'elenco dei file modificati e guidare uno script per eliminarli o accettare la tua o la loro versione.
Jakub Narębski

1
@ Miele: il messaggio CONFLITTO include la descrizione di quale modifica era su quale ramo. Puoi controllarlo più tardi con git statuso git diff --cc. C'è anche git log --merge
qualcosa

80

Normalmente corro git mergetoole mi chiederà se voglio mantenere il file modificato o tenerlo cancellato. Questo è il modo più veloce IMHO poiché è un comando invece di diversi per file.

Se hai un mucchio di file eliminati in una sottodirectory specifica e desideri che tutti vengano risolti eliminando i file, puoi farlo:

yes d | git mergetool -- the/subdirectory

Il dè fornito di scegliere l'eliminazione di ogni file. È inoltre possibile utilizzare mper mantenere il file modificato. Tratto dal prompt che vedi quando corri mergetool:

Use (m)odified or (d)eleted file, or (a)bort?

1
@BrianMinton anche io, l'altra roba era solo un circolo vizioso
Nate L,

2
Questo diventa fastidioso quando ci sono molti file, c'è un modo per dare una risposta per tutti?
ideasman42

2
@ ideasman42 Ho aggiornato la mia risposta per mostrare una soluzione di eliminazione batch.
void

1
Non sapevo davvero dello strumento di unione. Mi hai salvato la giornata amico!
Mert,

8

Se stai usando Git Gui su Windows,

  1. Interrompi l'unione
  2. Assicurati di essere nel tuo ramo di destinazione
  3. Elimina il file in conflitto da Explorer
  4. Eseguire nuovamente la scansione per le modifiche in Git Gui (F5)
  5. Notare che il file in conflitto viene eliminato
  6. Seleziona Stage Changed Files To Commit (Ctrl-I) dal menu Commit
  7. Inserisci un commento di commit come "file in conflitto eliminato"
  8. Conferma (ctrl-invio)
  9. Ora se riavvii l'unione, (si spera) funzionerà.

6
Al ragazzo non piace il modo in cui gestisci Git con la GUI, probabilmente. Un modo da riga di comando è migliore.
Souris
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.