Quale versione del file git verrà finalmente utilizzata: LOCAL, BASE o REMOTE?


174

Quando c'è un collison durante git merge, apro una fusione chiamata Meld . Apre tre file LOCAL, BASE e REMOTE. Come ho letto LOCAL è il mio ramo locale, BASE è l'antenato comune e REMOTE è il ramo da unire.

Ora alla mia domanda: quale versione del file verrà finalmente utilizzata? È REMOTO? In tal caso, posso modificarlo come voglio, indipendentemente da cosa sia nel ramo BASE, ad esempio?

Risposte:


142

E 'quello in mezzo: BASE.

In realtà, BASEnon è l'antenato comune, ma l'unione semifinita in cui i conflitti sono contrassegnati con >>>>e <<<<.

Puoi vedere i nomi dei file nella parte superiore della finestra di modifica della combinazione.

Guarda lo screenshot qui

base di fusione

È possibile modificare il BASEfile come desiderato con o senza l'utilizzo dei comandi di fusione.
Puoi anche sbarazzarti di meld e modificare il file con il tuo editor di testo preferito.

  • Il codice tra <<<< HEADe =====marcatori è quello del tuo file locale prima dell'unione.
  • Il codice tra ====e >>>> <branch name>è quello del file remoto.

3
Alcune persone ottengono una migliore comprensione dei blocchi in conflitto in un file che non è riuscito a fondersi automaticamente se hanno l' merge.conflictstyleopzione di configurazione impostata su diff3anziché quella predefinita merge.
kostix,

3
In realtà non vedo HEAD, <<< e === canta. Nel caso in cui hai fornito la finestra centrale sarebbe vuota. Ma questa è solo una nota per gli altri, grazie per la tua risposta.
Tsusanka,

Se non vedi i HEAD, <<<<<e =====segni, vuol dire che non v'è alcun conflitto a tutti. In questo caso, la finestra centrale non sarà vuota, mostrerà il risultato
dell'unione

10
Quando eseguo l'unione con Meld, non vedo alcun segno <<<<<<, ======né i >>>>>>marker nel riquadro centrale (ovvero la versione BASE); e a volte, il riquadro centrale sarà vuoto, come riportato da aGr. Forse questa differenza è dovuta a impostazioni diverse. Quando inizio lo strumento Fusione, esisteranno i seguenti file, supponendo che il nome del file nel repository è X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, dove #è un numero. Chiamando il risultato di unione la versione BASE è confusa; Unire sarebbe meglio.
Teemu Leisti,

3
BASE è in effetti l'antenato comune, MERGED è il nome del file con le informazioni di unione parziale in esso. Si prega di vedere la mia domanda e risposta Configurare e usare Meld come git difftool e mergetool che spiega esattamente come funziona. HTH.
mattst

107

La combinazione ha una funzione di unione nascosta a 3 vie attivata passando il 4o parametro:

meld $LOCAL $BASE $REMOTE $MERGED

I riquadri destro e sinistro vengono aperti in modalità di sola lettura, quindi non è possibile unire accidentalmente la strada sbagliata. Il riquadro centrale mostra il risultato dell'unione. Per i conflitti mostra la versione di base in modo da poter vedere tutti i bit importanti: testo originale nel mezzo e modifiche contrastanti su entrambi i lati. Alla fine, quando premi il pulsante "Salva", viene scritto il file $ MERGED, esattamente come previsto da git.

Il file ~ / .gitconfig che utilizzo contiene le seguenti impostazioni:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

questo apre la fusione con 3 schede, la prima e la seconda scheda contenenti le differenze diff che sto cercando di unire e la terza scheda, aperta per impostazione predefinita, mostra la vista di unione a 3 vie.

Ora, il motivo per cui la funzione è nascosta è che non è ancora abbastanza lucido. È molto utile come lo è ora, ma Kai Willadsen, l'autore della fusione, ha indicato alcune rughe che devono essere risolte. Ad esempio, non esiste una GUI per avviare la modalità di unione a 3 vie, la sintassi della riga di comando è un po 'arcana e così via. Se parli di pitone e hai del tempo a disposizione, sai cosa fare.

Modifica: nelle versioni più recenti di Meld, la sinossi è leggermente cambiata. Questo era nei commenti, ma appartiene alla risposta.

Il comando meld ora utilizza l'opzione --output, quindi l'ultima riga dello snippet sopra dovrebbe essere:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @lumbric, sembra che le versioni più recenti di fusione utilizzino il flag --outputper il risultato $ MERGED. L'ho scoperto guardando lo script di lancio della fusione fornito con la mia versione di git: github.com/git/git/blob/master/mergetools/meld
Johann,

1
@lumbric Credo di si, per Meld 1.7.x + con il --output option. Vedi questa riga nello script di lancio:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
Nell'ultima fusione (versione> 1.8.4), dobbiamo usare l'opzione --auto-merge. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE
auto

7
Ho avuto lo stesso problema di @pingpongboss usando Meld 1.8.4: Meld stava aprendo le cose in un riquadro separato, invece di aprire la terza scheda. Il comando la multa, infine, ha lavorato è: cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED. Quindi, questo apre 3 schede (buon vecchio modo), le fusioni automatiche si fondono nel mezzo, dove il centro è $ MERGED e verrà usato come output per la risoluzione del conflitto.
Farmir,

2
La sintassi per l'output può essere --output=<file>o -o <file>, vedimeld --help
levsa,

57

Ci sono 4 file coinvolti:

  1. $LOCALIl file sul ramo in cui si stanno unendo; non toccato dal processo di unione quando mostrato a te

  2. $REMOTEIl file sul ramo da cui si sta unendo; non toccato dal processo di unione quando mostrato a te

  3. $BASEL'antenato comune di $ LOCAL e $ REMOTE, ad es. il punto in cui i due rami hanno iniziato a deviare il file considerato; non toccato dal processo di unione quando mostrato a te

  4. $MERGEDIl file parzialmente unito, con conflitti; questo è l'unico file toccato dal processo di unione e, in realtà, non ti è mai stato mostratomeld


Il $MERGEDfile è quello che contiene i <<<<<<, >>>>>>, =====(e, forse, ||||||i marcatori) (che è in conflitto delimitano). Questo è il file che si modifica manualmente per correggere i conflitti.

La modifica manuale dei conflitti e la modifica dei conflitti visivi vengono eseguite su file diversi e presentano informazioni diverse.

Quando si utilizza il mergetool (assumere meld), i file che stanno vedendo in essa sono: $LOCAL, $BASE, $REMOTE. Nota che non vedi il $MERGEDfile, anche se questo viene passato come parametro nascosto meldper scrivere lì il risultato della modifica.

In altre parole, in meld, stai modificando il file nel mezzo, il $BASEfile e scegli manualmente tutte le modifiche da sinistra o da destra . È un file pulito, non toccato dal processo di unione. L'unico inconveniente è che, quando si salva, non si salva nel $BASEfile, ma nel quarto parametro nascosto di meld, che è il $MERGEDfile (che non si vede nemmeno). Il $BASEfile non contiene conflitti o fusioni parziali riuscite perché non è il $MERGEDfile .

Nella modifica visiva, quando ti viene presentato il $BASEfile (anziché il $MERGEDfile), in gitpratica viene scartato tutti i suoi tentativi di eseguire l'unione (tali tentativi sono visibili, se lo desideri, nel file $ MERGED) e ti consente di eseguire completamente l'unione da zero .

La linea di fondo è che nei conflitti di fusione manuale e visiva non si osservano gli stessi file, ma il risultato finale viene scritto nello stesso file (che è il $MERGEDfile).

La correzione manuale dei conflitti viene fatto su $MERGEDperché git non ha media di presentarvi tre file, in modo che schiaccia le informazioni dai tre file ( $LOCAL, $BASE, $REMOTE) in quel $MERGEDfile.

Ma gli strumenti visivi hanno i mezzi per mostrare tre file: vi mostrano i $LOCAL, $BASE, $REMOTEi file. Si sta raccogliendo i cambiamenti dai $LOCALe $REMOTEfile e si stanno portando quelle nel $BASEfile completamente ri-costruzione e anche sovrascrivendo il fallito tentativo di fondere cioè il $MERGEDfile.


Volevo solo che ci fossero strumenti (ad es. Al di là del confronto) che mostrano tutti e 4 i file
yoniLavi

@yoniYalovitsky: yes, o p4merge
user1284631

Usavo lo strumento di unione dal pacchetto ClearCase
mishmashru

@yoniLavi - bene questi strumenti mostrano 4 riquadri , ma non necessariamente tutti e quattro i file come descritto in questa risposta. In particolare, è possibile impostare questi 4 riquadro strumenti visualizzare $LOCAL, $REMOTE, $BASEe l'uscita inizialmente pari a $BASE, ma che è diverso da $MERGEDnel senso che non ha il tentativo di git per unire i file e i marcatori di conflitto e così via. In effetti, quello sarebbe il modo di usare questi strumenti che sono più simili all'approccio a 3 riquadri di LOCAL / REMOTE / BASE + OUTPUT, che non mostra l'unione. Il quarto riquadro consente solo di separare la base dall'output.
BeeOnRope

16

La soluzione di Cosmin funziona, ma il file $ BASE viene aggiornato, non $ MERGED . Questo aggiornerà il file $ MERGED :

meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

Posso confermarlo. La soluzione di Saad funziona per me su Ubuntu. Per quanto riguarda la domanda originale, questa è l'attuale risposta corretta.
Cosmin

3
Nella mia versione di meld - 3.11, questo comando funziona alla grande:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

perché avresti bisogno --diff $BASE $LOCAL --diff $BASE $REMOTEalla fine? per me il 1.8.4, questo funziona benissimo (per quanto posso vedere):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Farmir

1
@farmir: non è necessario. Apre altre due schede in combinazione in modo da poter vedere LOCAL e REMOTE confrontati con BASE singolarmente.
Sam Kauffman,

1
Non importa quale ordine provo con tali argomenti, la scheda a tre vie è sempre la terza scheda, mentre la prima scheda è sempre selezionata per impostazione predefinita. C'è un modo per rendere la scheda a tre vie selezionata per impostazione predefinita?
Sam Kauffman,

13

Con Meld 1.7 la soluzione di Tomek Bury non funziona più.

Le impostazioni predefinite non mi soddisfacevano:

Impostazioni predefinite

Invece per Meld> = 1.7 suggerisco una delle altre due soluzioni.

Prima soluzione :

 meld $LOCAL $BASE $REMOTE --auto-merge

prima soluzione

Seconda soluzione :

 meld $LOCAL $MERGED $REMOTE

seconda soluzione

.gitconfig

Copia e incolla questo nel tuo .gitconfigfile per ottenere le soluzioni come descritto sopra:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Copia e incolla questo in un .gitconfig.localfile per impostare meld17 o meld16 solo per questa macchina nel caso in cui usi il tuo .gitconfig su più macchine:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

Questo non funziona su Meld 1.8.4. Se si esegue cmd = meld $LOCAL $BASE $REMOTE --auto-merge, il riquadro centrale sarà $ BASE e non $ MERGE che viene effettivamente utilizzato come output della risoluzione dei conflitti.
Farmir,

1
@farmir Hai scelto $ BASE come seconda scheda.
Alex78191,

11

Ho scoperto che nessuno dei file predefiniti mostrati veniva salvato. la fusione stava mostrando $LOCAL, $REMOTEe $BASEper impostazione predefinita. Per farlo funzionare, dovevo mostrare la fusione $MERGEDinvece di $BASE. Mettendo questo nel mio ~/.gitconfigriparato per me:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Sto usando Arch, con:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

Mi scusi, questa configurazione è inux compatibile?
MadMad666,

2

Per qualche motivo le versioni più recenti di fusione non visualizzano le linee di marker aggiunte per i conflitti (<<<<<<<, =======, >>>>>>>). Se vuoi vedere quelle linee, dovresti installare meld v 1.3.3 o precedente.


Ho trovato utile la risposta di @lumbric stackoverflow.com/a/22911793/641892
wnasich

2

Vedere la risposta di Saad per la risposta corretta.

Con la fusione 1.8.1 su Ubuntu stavo ottenendo il

numero errato di argomenti forniti a --diff

e aggiungendo il --output prima di $ MERGED ho risolto il problema per me:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
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.