2013-02-15 17 views
97

Ho appena incorporato un ramo nel mio master in git e ho ottenuto Automatic merge failed; fix conflicts and then commit the result. Ora ho eseguito git mergetool e vimdiff si è aperto con l'immagine qui sotto. Non so come usare vimdiff. Cosa significa ciascun pannello qui e come devo procedere per risolvere il conflitto di unione?Come si usa vimdiff per risolvere un conflitto?

enter image description here

+2

Vedere [questa pagina] (http://vim.wikia.com/wiki/A_better_Vimdiff_Git_mergetool). Se questo è ciò che intendi per "corretto", lo stato corrente del tuo codice è in alto a sinistra. – romainl

+0

@romainl Sono ancora confuso dopo aver letto ciò, quali sono le scorciatoie e come scegliere il file da utilizzare come ramo principale? –

+2

@Danny [http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/](http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/) è buono –

risposta

100

Tutti e quattro i buffer forniscono una visione diversa dello stesso file. Il buffer in alto a sinistra (LOCAL) è il modo in cui il file è stato visualizzato nel ramo di destinazione (in cosa si sta unendo). Il buffer in alto a destra (REMOTE) è il modo in cui il file è stato visualizzato nel ramo sorgente (da cui si sta effettuando la fusione). Il buffer intermedio (BASE) è l'antenato comune dei due (quindi è possibile confrontare il modo in cui le versioni sinistra e destra sono divergenti l'una dall'altra).

Posso sbagliare sul punto seguente. Penso che l'origine del conflitto di unione sia che entrambi i file hanno cambiato la stessa porzione del file da BASE; LOCAL ha modificato le virgolette da doppio a singolo e REMOTE ha apportato la stessa modifica, ma ha anche modificato il valore di sfondo da un colore a un URL. (Penso che l'unione non sia abbastanza intelligente da notare che tutte le modifiche a LOCAL sono presenti anche in REMOTE, ma sa solo che LOCAL ha apportato modifiche da BASE nelle stesse posizioni di REMOTE).

In ogni caso, il buffer inferiore contiene il file che è possibile modificare in realtà — quello che si trova nella directory di lavoro. Puoi apportare le modifiche che ti piacciono; vim ti mostra come differisce da ciascuna delle viste principali, ovvero le aree che l'unione automatica non è in grado di gestire. Tirare le modifiche da LOCAL se non si desidera che le modifiche REMOTE. Tira le modifiche da REMOTE se preferisci quelle alle modifiche LOCAL. Tira da BASE se pensi che sia REMOTE che LOCAL abbiano torto. Fai qualcosa di completamente diverso se hai un'idea migliore! Alla fine, le modifiche apportate qui sono quelle che verranno effettivamente commesse.

+2

Domanda veloce come posso salvare in vim? –

+3

': x' o': w' (': x' esce anche) più 'return'. –

+4

Anders: ci sono altri strumenti di unione che puoi usare se non hai familiarità con come usare 'vim'. – chepner

9

La risposta di @ chepner è ottima, vorrei aggiungere alcuni dettagli su "come dovrei procedere per risolvere il conflitto di fusione" della domanda. Se si guarda a come effettivamente utilizzare vimdiff in questo caso, va sotto.


In primo luogo, per affrontare l'opzione "annullare tutto" - se non si vuole usare "vimdiff" e si vuole interrompere l'unione: stampa Esc, quindi digitare :qa! e ha colpito Invio. (vedi anche How to exit the Vim editor?). Git ti chiederà quindi se l'unione è stata completata, rispondi con n.


Se si desidera utilizzare vimdiff, ecco alcune utili scorciatoie.Questo presuppone che conosciate basi di Vim (navigazione e inserimento/modalità normale):

  • navigare a tampone di fondo (risultato della fusione): Ctrl-Wj
  • passare alla prossima diff con j/k; o, meglio, utilizzare ]c e [c per spostarsi avanti e indietro diff rispettivamente
  • uso zo mentre su una piega per aprirlo, se si desidera vedere più contesto
  • per ogni diff, come per ogni risposta @ di chepner, è possibile ottenere la versione di codice da locali versione, remoto o di base, o di modificarlo e rifare, come si vede in forma
    • t o farlo dalla versione locale, utilizzare :diffget LO
    • da remoto: :diffget RE
    • dalla base: :diffget BA
    • o, se si desidera modificare da soli, ottenere una versione da/remote/base locale prima, e poi andare a modalità di inserire e modificare il resto
  • una volta fatto, salvare il risultato della fusione, e chiudere tutte le finestre :wqa
  • normalmente, git merge rileva che è stato fatto e completa l'unione commettere

È possibile cercare in Internet altre scelte rapide di vimdiff. Ho trovato questo utile ad esempio: https://gist.github.com/hyamamoto/7783966

+0

Dovrebbe essere aumentato di 300 volte e accettato come risposta migliore. –

Problemi correlati