2013-01-06 11 views
12

supponiamo che ho un conflitto di unione su foo/bar.txt quando si esegue questo:Come risolvere automaticamente un conflitto Git prendendo la versione nel ramo attuale?

$ git checkout A 
$ git merge B 

mi piacerebbe per risolvere automaticamente il conflitto prendendo foo/bar.txt di ramo A. (So quello che sto facendo, e io . hanno bisogno di questo la versione nel ramo B è sbagliato, e non mi importa di perdere i cambiamenti nella struttura di lavoro, in questo caso) sembra che posso farlo eseguendo questi comandi:.

$ git reset foo/bar.txt 
$ git checkout foo/bar.txt 

E` c'è una soluzione più semplice, a comando singolo?

Sfortunatamente questi comandi cambiano foo/bar.txt anche se non c'è conflitto, e io non lo voglio. Se non c'è conflitto, voglio mantenere foo/bar.txt in qualunque stato git merge B lo abbia lasciato.

Quindi ho bisogno di un comando shell Unix, che rilevi se c'è un conflitto in foo/bar.txt, e se esiste, risolverebbe il conflitto prendendo la versione di foo/bar.txt dal ramo corrente. Non avrebbe fatto altro, cioè non avrebbe modificato altri file, non avrebbe commesso le modifiche e non cambierebbe foo/bar.txt se non c'è conflitto in quel file.

+0

Remoto: http://stackoverflow.com/questions/528659/git-automatic-conflict-resolution –

risposta

10

Se si vuole fare come un one-off, il comando a linea singola è:

$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file 
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what 

Per configurare merge di Git di ignorare in modo permanente tutte le modifiche a monte a un file localmente cambiato:

$ git config merge.pin.driver true 
$ echo foo/bar.txt merge=pin >> .git/info/attributes 

(true sopra è solo il comando UNIX true, il suo successo dice che ha fatto la versione locale guardare a destra, in questo caso per non fare nulla per esso. è può naturalmente ottenere più sofisticato, con i comandi di unione.)

Credo che non si vuole o merge --strategy=ours--strategy-option=ours, quelli si applicano a intere unioni.

+0

Grazie (+1) per la risposta informativa, ho imparato molto da Git. – pts

6

È possibile specificare l'opzione strategia di unione ours nella strategia di unione recursive (predefinita). Farà una normale unione, ma in caso di hunk in conflitto sceglierà la versione del ramo attuale.

git checkout A 
git merge -Xours B 
+0

Grazie per queste informazioni aggiuntive. Sfortunatamente non risponde alla mia domanda, perché il comando 'git unire B' (e probabilmente anche molte altre modifiche al filesystem non impegnate) è già stato eseguito. – pts

+0

Se è già stato eseguito il comando di unione, è necessario utilizzare il metodo 'reset && checkout'. – knittl

+0

Il metodo di reset + checkout non è una risposta alla mia domanda, perché non è un no-op se non c'è conflitto (vedere la domanda per i dettagli). – pts

Problemi correlati