web-dev-qa-db-fra.com

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

Lorsqu'il y a une collision au cours de 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 un ancêtre commun et REMOTE est la branche à fusionner.

Passons maintenant à ma question: quelle version du fichier sera finalement utilisée? Est-ce à distance? Si tel est le cas, puis-je le modifier comme je le souhaite, quelle que soit la nature de la branche BASE par exemple?

164
tsusanka

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 de >>>> et <<<<.

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

Voir la capture d'écran ici

meld base

Vous pouvez éditer le fichier BASE à votre guise avec ou sans les commandes de fusion.
Vous pouvez également vous débarrasser de la fusion et éditer simplement le fichier avec votre éditeur de texte préféré.

  • Le code entre les marqueurs <<<< HEAD et ===== est celui de votre fichier local avant la fusion.
  • Le code entre ==== et >>>> <branch name> est celui du fichier distant.
138
Fabien Quatravaux

La fusion a un fonction de fusion masquée à 3 voies activée en passant le 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 accidentellement fusionner dans le mauvais sens. Le volet du milieu montre le résultat de la fusion. Pour les conflits, il affiche la version de base afin que vous puissiez voir tous les éléments importants: le texte original au milieu et les 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 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 la fusion avec 3 onglets, le premier et le deuxième onglet contenant les diffs simples que je tente de fusionner, et le troisième onglet, ouvert par défaut, montre la vue de fusion à 3 voies.

La raison pour laquelle cette fonctionnalité est masquée est qu'elle n'est pas encore assez perfectionnée. C’est très utile en ce moment, mais Kai Willadsen, l’auteur de la fusion, a souligné 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 ligne de commande est un peu obscure, etc. Si vous parlez python et que vous avez un peu de temps, vous savez quoi faire.

Edit: Dans les versions plus récentes de Meld, la synaxe a légèrement changé. C'était dans les commentaires, mais ça fait partie de la réponse.

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

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
106
Tomek Bury

Il y a 4 fichiers impliqués:

  1. $LOCAL Le fichier de la branche sur laquelle vous effectuez la fusion. insensible au processus de fusion lorsqu'il vous est présenté

  2. $REMOTE Le fichier de la branche à partir de laquelle vous effectuez la fusion. insensible au processus de fusion lorsqu'il vous est présenté

  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é; insensible au processus de fusion lorsqu'il vous est présenté

  4. $MERGED Le fichier partiellement fusionné, avec des conflits; c'est le seul fichier touché par le processus de fusion et, en réalité, ne vous est jamais montré dans meld


Le fichier _$MERGED_ est celui qui contient les marqueurs _<<<<<<_, _>>>>>>_, _=====_ (et peut-être _||||||_) (qui délimitent les conflits). Ceci est le fichier que vous éditez manuellement pour corriger les conflits.

L'édition manuelle des conflits et l'édition des conflits visuels sont effectuées sur différents fichiers et présentent des informations différentes.

Lorsque vous utilisez l'outil mergetool (supposons que meld), les fichiers affichés sont les suivants: _$LOCAL_, _$BASE_, _$REMOTE_. Notez que vous ne voyez pas le fichier _$MERGED_, bien qu'il 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 éditez le fichier au milieu, le fichier _$BASE_, et vous sélectionnez manuellement toutes les modifications de gauche ou de droite . . C'est un fichier vierge, qui n'a pas été 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 masqué de meld, c’est-à-dire le fichier _$MERGED_ même voir). Le fichier _$BASE_ ne ne contient aucun conflit ni fusion partielle réussie car ce n'est pas le _$MERGED_ fichier .

Dans l’édition visuelle, lorsqu’on vous présente le fichier _$BASE_ (au lieu du fichier _$MERGED_) git ignore en gros 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 .

La ligne de fond 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 (le fichier _$MERGED_) .

La correction manuelle des conflits est faite sur _$MERGED_ parce que git n’a pas le moyen de vous présenter trois fichiers, alors il écrase les informations des trois fichiers (_$LOCAL_, _$BASE_, _$REMOTE_) de ce fichier _$MERGED_.

Mais les outils visuels ont les moyens de vous montrer trois fichiers: ils vous montrent le _$LOCAL_, _$BASE_, _$REMOTE_ des dossiers. Vous prenez des modifications dans les fichiers _$LOCAL_ et _$REMOTE_ et vous les importez dans le fichier _$BASE_, en reconstruisant complètement et même en écrasant la tentative de fusion ayant échoué qui est le _$MERGED_ fichier.

54
user1284631

La solution de Cosmin fonctionne, mais le fichier $ BASE est mis à jour - pas $ MERGED. Ceci 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
15
Saad Malik

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

Le paramètres par défaut ne m'a pas satisfait:

Default settings

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

Première solution:

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

first solution

Deuxième solution:

 meld $LOCAL $MERGED $REMOTE

second solution

. gitconfig

Copiez-le 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 si vous utilisez 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
13
lumbric

J'ai trouvé qu'aucun des fichiers par défaut montrés n'était sauvegardé. meld montrait $LOCAL, $REMOTE et $BASE par défaut. Pour que cela fonctionne, je devais faire meld show $MERGED au lieu de $BASE. Mettre ceci dans mon ~/.gitconfig le corrige 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
11
Thomas Leonard

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

2
wnasich

S'il vous plaît voir la réponse de Saad pour la bonne réponse.

Avec la fusion 1.8.1 sur Ubuntu, je recevais le

nombre incorrect 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
2
cosmin