179 votes

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

Quand il y a une collision pendant 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 branche locale, BASE est l'ancêtre commun et REMOTE est la branche à fusionner.

J'en viens maintenant à ma question : quelle version du fichier sera finalement utilisée ? Est-elle REMOTE ? Si oui, puis-je l'éditer comme je veux, sans tenir compte de ce qui se trouve dans la branche BASE par exemple ?

143voto

Fabien Quatravaux Points 1289

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 >>>> y <<<< .

Vous pouvez voir les noms de fichier sur le dessus de la fenêtre d'édition de meld.

Voir la capture d'écran ici

meld base

Vous pouvez modifier le BASE comme vous le souhaitez avec ou sans utiliser les 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 y ===== Les marqueurs sont ceux de votre fichier local avant la fusion.
  • Le code entre ==== y >>>> <branch name> est celui du fichier distant.

3 votes

Certaines personnes comprennent mieux les morceaux en conflit dans un fichier dont la fusion automatique a échoué si elles disposent de l'option merge.conflictstyle option de configuration définie sur diff3 au lieu de l'option par défaut merge .

3 votes

En fait, je ne vois pas les signes HEAD, <<< et ===. Dans le cas que vous avez fourni, la fenêtre du milieu serait vide. Mais c'est juste une remarque pour les autres, thx pour votre réponse.

0 votes

Si vous ne voyez pas le HEAD , <<<<< y ===== signe, cela signifie qu'il n'y a pas de conflit du tout. Dans ce cas, la fenêtre du milieu ne sera pas vide, elle montrera le résultat de la fusion, mais il n'y aura pas de partie "rouge".

107voto

Tomek Bury Points 581

Meld a un fonction cachée de fusion à 3 voies activé en passant le 4ème paramètre :

meld $LOCAL $BASE $REMOTE $MERGED

Les volets de droite et de gauche sont ouverts en mode lecture seule, de sorte que vous ne pouvez pas fusionner accidentellement dans le mauvais sens. Le panneau du milieu montre le résultat de la fusion. Pour les conflits, il montre la version de base afin que vous puissiez voir tous les éléments importants : le texte original au milieu, et les modifications conflictuelles de chaque côté. 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 paramètres suivants :

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

cela ouvre meld avec 3 onglets, le 1er et le 2ème onglet contenant les différences simples que j'essaie de fusionner, et le 3ème onglet, ouvert par défaut, montre la vue de la fusion à 3.

La raison pour laquelle cette fonctionnalité est cachée est qu'elle n'est pas encore assez aboutie. Il est très utile tel qu'il est maintenant, mais Kai Willadsen, l'auteur du meld, a souligné quelques rides qui doivent être aplanies. Par exemple, il n'y a pas d'interface graphique pour lancer le mode de fusion à trois, la syntaxe de la ligne de commande est un peu obscure, etc. Si vous parlez python et avez un peu de temps libre, vous savez quoi faire.

Modifier : Dans les nouvelles versions de Meld, le synaxe a légèrement changé. C'était dans les commentaires, mais cela appartient à la réponse.

La commande meld utilise maintenant l'option --output, donc la dernière ligne du snippet ci-dessus devrait être :

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

0 votes

@Jesse Cela semble fonctionner avec Meld 1.6.0, mais pas avec Meld 1.7.0.

7 votes

@Jesse, @lumbric, il semble que les nouvelles versions de meld utilisent le drapeau --output pour le résultat $MERGED. J'ai découvert cela en regardant le lancement de meld script qui est venu avec ma version de git : github.com/git/git/blob/master/mergetools/meld

0 votes

@Johann Hm oui vous avez raison, mais cela ne résout pas le problème. Le lancement script que vous avez lié, ne fournit pas la fonctionnalité avancée telle que décrite dans la solution de Tomek Bury.

59voto

axeoth Points 1624

Il y a 4 fichiers impliqués :

  1. $LOCAL Le fichier sur la branche où vous fusionnez ; non touché par le processus de fusion lorsqu'il vous est montré

  2. $REMOTE Le fichier sur la branche d'où vous fusionnez ; non touché par le processus de fusion lorsqu'il vous est montré

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

  4. $MERGED Le fichier partiellement fusionné, avec les conflits ; c'est le seul fichier qui a été touché par le processus de fusion et, en fait, qui ne vous a jamais été montré dans le cadre du processus de fusion. meld


El $MERGED est celui qui contient le fichier <<<<<< , >>>>>> , ===== (et, peut-être, |||||| ) (qui délimitent les conflits). Ce site est le fichier que vous modifiez manuellement pour corriger les conflits.

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

Lors de l'utilisation du mergetool (supposer meld ), les fichiers qui s'y trouvent sont les suivants : $LOCAL , $BASE , $REMOTE . Notez que vous ne voyez pas le $MERGED bien qu'il soit transmis en tant que paramètre caché à la fonction meld pour y écrire le résultat de la modification.

En d'autres termes, en meld si vous éditez le fichier au milieu, la fonction $BASE et vous prenez tous les changements à gauche ou à droite. manuellement . Il s'agit d'un fichier propre, non touché par le processus de fusion. Le seul problème est que, lorsque vous enregistrez, vous n'enregistrez pas dans le fichier $BASE mais dans le quatrième paramètre caché de meld c'est-à-dire le $MERGED (que vous ne voyez même pas). Le site $BASE Le fichier fait no contiennent des conflits ou des fusions partielles réussies parce que ce n'est pas le $MERGED fichier .

Dans le montage visuel, en vous présentant les $BASE (au lieu du fichier $MERGED fichier) git abandonne toutes ses tentatives de fusion (ces tentatives sont visibles, si vous le souhaitez, dans le fichier $MERGED) et vous permet de complètement faire la fusion à partir de zéro .

En fin de compte, dans les conflits de fusion manuelle et visuelle, vous ne regardez pas les mêmes fichiers, mais le résultat final est écrit dans le même fichier (c'est le $MERGED ).

La correction manuelle des conflits se fait sur $MERGED parce que git n'a pas de sens pour vous présenter trois fichiers, il écrase donc les informations des trois fichiers ( $LOCAL , $BASE , $REMOTE ) en ce que $MERGED fichier.

Mais les outils visuels avoir les moyens pour vous montrer trois fichiers : ils vous montrent les $LOCAL , $BASE , $REMOTE des fichiers. Vous reprenez les modifications du $LOCAL y $REMOTE et vous les apportez dans le $BASE en reconstruisant complètement et même en écrasant la tentative ratée de fusion qu'est le fichier $MERGED fichier.

0 votes

Je voulais juste savoir qu'il existe des outils (par exemple, beyond compare) qui affichent les 4 fichiers.

0 votes

@yoniYalovitsky : oui, ou p4merge

0 votes

J'avais l'habitude d'utiliser l'outil de fusion du paquet ClearCase.

16voto

Saad Malik Points 152

La solution de Cosmin fonctionne, mais la $BASE est mis à jour - pas $MERGED . Cela mettra à jour le $MERGED fichier :

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

0 votes

Je peux le confirmer, la solution de Saad fonctionne pour moi sur Ubuntu. En ce qui concerne la question originale, voici la réponse correcte actuelle.

3 votes

Dans ma version de meld - 3.11, cette commande fonctionne parfaitement : cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE

0 votes

Pourquoi auriez-vous besoin --diff $BASE $LOCAL --diff $BASE $REMOTE à la fin ? pour moi sur 1.8.4, cela fonctionne bien (pour autant que je puisse voir) : cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE

11voto

Thomas Leonard Points 2166

J'ai constaté qu'aucun des fichiers par défaut affichés n'était sauvegardé. meld affichait $LOCAL , $REMOTE y $BASE par défaut. Pour que cela fonctionne, j'ai dû faire en sorte que meld affiche $MERGED au lieu de $BASE . En mettant cela dans mon ~/.gitconfig l'a réparé 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

0 votes

Excusez-moi, cette configuration est-elle compatible avec inux ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X