Quelle version du fichier git sera finalement utilisée: LOCAL, BASE ou REMOTE?

Quand il y a une collision lors de la git merge , j’ouvre un outil de fusion appelé Meld . Il ouvre trois fichiers LOCAL, BASE et REMOTE. Comme je l’ai lu, LOCAL est ma twig locale, BASE est un ancêtre commun et REMOTE est la twig à fusionner.

Maintenant à ma question: quelle version du fichier sera finalement utilisée? Est-ce à distance? Si oui, puis-je l’éditer comme je le souhaite, quelle que soit la twig de BASE par exemple?

C’est celui du milieu: BASE .

En fait, BASE n’est pas l’ancêtre commun, mais la fusion à moitié terminée où les conflits sont marqués avec >>>> et <<<< .

Vous pouvez voir les noms de fichiers en haut de la fenêtre d'édition de fusion.

Voir la capture d'écran ici

base de fusion

Vous pouvez éditer le fichier BASE comme vous le souhaitez avec ou sans commandes Meld.
Vous pouvez également vous débarrasser de Meld et simplement éditer le fichier avec votre éditeur de texte préféré.

  • Le code entre <<<< HEAD et ===== markers est celui de votre fichier local avant la fusion.
  • Le code entre ==== et >>>> est celui du fichier distant.

Meld a une fonction de fusion cachée à 3 voies activée par le passage du 4ème paramètre:

 meld $LOCAL $BASE $REMOTE $MERGED 

Les volets droit et gauche sont ouverts en mode lecture seule, vous ne pouvez donc pas fusionner accidentellement dans le mauvais sens. Le volet central affiche le résultat de la fusion. Pour les conflits, il affiche la version de base afin que vous puissiez voir tous les bits importants: texte d’origine au milieu et modifications contradictoires des deux côtés. Enfin, lorsque vous appuyez sur le bouton “Enregistrer”, le fichier $ MERGED est écrit – exactement comme prévu par git.

Le fichier ~ / .gitconfig que j’utilise contient les parameters suivants:

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

Cela ouvre la fusion avec 3 tabs, le 1er et le 2ème onglet contenant les diffs simples que j’essaie de fusionner, et le troisième onglet, ouvert par défaut, affiche la vue de fusion à trois.

Maintenant, la raison pour laquelle la fonctionnalité est cachée est qu’elle n’est pas encore assez finie. C’est très utile comme il l’est maintenant, mais Kai Willadsen, l’auteur de la fusion, a signalé quelques rides qui doivent être corrigées. Par exemple, il n’y a pas d’interface graphique pour démarrer le mode de fusion à trois, la syntaxe de la ligne de commande est un peu mystérieuse, etc. Si vous parlez de python et que vous avez du temps, vous savez quoi faire.

Edit: Dans les nouvelles versions de Meld, la synax a légèrement changé. C’était dans les commentaires, mais cela fait partie de la réponse.

La commande meld utilise désormais l’option –output, donc la dernière ligne de l’extrait ci-dessus doit être:

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

Il y a 4 fichiers impliqués:

  1. $LOCAL Le fichier sur la twig où vous fusionnez; intact par le processus de fusion lorsqu’il vous est montré

  2. $REMOTE Le fichier sur la twig à partir de laquelle vous fusionnez; intact par le processus de fusion lorsqu’il vous est montré

  3. $BASE L’ancêtre commun de $ LOCAL et $ REMOTE, c.-à-d. le point où les deux succursales ont commencé à détourner le fichier considéré; intact par le processus de fusion lorsqu’il vous est montré

  4. $MERGED Le fichier partiellement fusionné, avec des conflits; c’est le seul fichier touché par le processus de fusion et, en fait, il ne vous a jamais été montré


Le fichier $MERGED est celui qui contient les <<<<<< , >>>>>> , ===== (et, peut-être,

) (qui délimitent les conflits). C’est le fichier que vous éditez manuellement pour corriger les conflits.

L’édition manuelle des conflits et l’édition des conflits visuels se font sur différents fichiers et présentent différentes informations.

Lors de l’utilisation de mergetool (supposons que meld ), les fichiers qui y figurent sont: $LOCAL , $BASE , $REMOTE . Notez que vous ne voyez pas le fichier $MERGED , bien que cela soit passé en tant que paramètre masqué à meld pour y écrire le résultat de la modification.

En d’autres termes, dans meld , vous modifiez le fichier au milieu, le fichier $BASE , et vous sélectionnez manuellement toutes les modifications de gauche ou de droite. C’est un fichier propre, non touché par le processus de fusion. Le seul problème est que, lorsque vous enregistrez, vous ne sauvegardez pas dans le fichier $BASE , mais dans le quasortingème paramètre caché de meld , c’est le fichier $MERGED (que vous ne voyez même pas). Le fichier $BASE ne contient aucun conflit ou fusion réussie partielle car il ne s’agit pas du fichier $MERGED .

Dans l’édition visuelle, lorsque vous présentez le fichier $BASE (au lieu du fichier $MERGED ), git ignore toutes ses tentatives de fusion (ces tentatives sont visibles, si vous le souhaitez, dans le fichier $ MERGED) et vous permet faire complètement la fusion à partir de zéro .

L’essentiel est que dans les conflits de fusion manuels et visuels, vous ne regardez pas les mêmes fichiers, mais le résultat final est écrit dans le même fichier (c’est-à-dire le fichier $MERGED ).

La correction manuelle des conflits est faite sur $MERGED car git n’a aucun moyen de vous présenter trois fichiers, donc il écrase les informations des trois fichiers ( $LOCAL , $BASE , $REMOTE ) dans ce fichier $MERGED .

Mais les outils visuels ont les moyens de vous montrer trois fichiers: ils vous montrent les fichiers $LOCAL , $BASE , $REMOTE . Vous choisissez des modifications dans les fichiers $LOCAL et $REMOTE et vous les introduisez dans le fichier $BASE , en reconstruisant complètement et même en écrasant la tentative de fusion qui a échoué, à savoir le fichier $MERGED .

La solution de Cosmin fonctionne, mais le fichier $ BASE est mis à jour – pas $ MERGED . Cela mettra à jour le fichier $ 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 

Avec Meld 1.7, la solution de Tomek Bury ne fonctionne plus.

Les parameters par défaut ne m’ont pas satisfait:

Paramètres par défaut

Au lieu de Meld> = 1.7, je suggère l’une des deux autres solutions.

Première solution :

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

première solution

Deuxième solution :

  meld $LOCAL $MERGED $REMOTE 

deuxième solution

.gitconfig

Copiez-collez ceci dans votre fichier .gitconfig pour obtenir les solutions décrites ci-dessus:

 [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 

Copiez-collez ceci dans un fichier .gitconfig.local pour définir meld17 ou meld16 uniquement pour cette machine au cas où vous utiliseriez votre .gitconfig sur plusieurs machines:

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

J’ai constaté qu’aucun des fichiers par défaut affichés n’était enregistré. Meld montrait $LOCAL , $REMOTE et $BASE par défaut. Pour que cela fonctionne, il fallait que meld show $MERGED au lieu de $BASE . En mettant ceci dans mon ~/.gitconfig corrigé pour moi:

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

J’utilise Arch, avec:

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

Pour une raison quelconque, les nouvelles versions de Meld n’affichent pas les lignes de marqueur ajoutées pour les conflits (<<<<<<<, =======, >>>>>>>). Si vous voulez voir ces lignes, vous devez installer meld v 1.3.3 ou précédent.

S’il vous plaît voir la réponse de Saad pour la réponse correcte.

Avec meld 1.8.1 sur Ubuntu, je recevais le

mauvais nombre d’arguments fournis à –diff

et en ajoutant le –output avant que $ MERGED ne le répare pour moi:

 [mergetool "mymeld"] cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED