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?
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.
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é.
<<<< HEAD
et =====
est celui de votre fichier local avant la fusion.====
et >>>> <branch name>
est celui du fichier distant.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
Il y a 4 fichiers impliqués:
$LOCAL
Le fichier de la branche sur laquelle vous effectuez la fusion. insensible au processus de fusion lorsqu'il vous est présenté
$REMOTE
Le fichier de la branche à partir de laquelle vous effectuez la fusion. insensible au processus de fusion lorsqu'il vous est présenté
$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é
$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.
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
Avec fusion 1.7, la solution de Tomek Bury ne fonctionne plus.
Le paramètres par défaut ne m'a pas satisfait:
Au lieu de Meld> = 1.7, je suggère l'une des deux autres solutions.
Première solution:
meld $LOCAL $BASE $REMOTE --auto-merge
Deuxième solution:
meld $LOCAL $MERGED $REMOTE
. 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
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
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.
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