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.
Passons maintenant à ma question: quelle version du fichier sera finalement utilisée? Est-ce REMOTE? Si tel est le cas, puis-je le modifier comme je le souhaite, quel que soit le contenu de la branche BASE par exemple?
merge.conflictstyle
option de configuration est définie sur audiff3
lieu de la valeur par défautmerge
.HEAD
,<<<<<
et les=====
signes, 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 affichera le résultat de la fusion, mais il n'y aura pas de partie "rouge"<<<<<<
,======
ni de>>>>>>
marqueurs dans le volet central (c'est-à-dire la version BASE) non plus; et parfois, le volet central sera vide, comme l'aGr l'a signalé. Peut-être que cette différence est due à des paramètres différents. Quand je commence l'outil Meld, les fichiers suivants existeront, en supposant que le nom du fichier dans le référentiel estX.java
:X.java
,X.java.orig
,X.java.BACKUP.#
,X.java.BASE.#
,X.java.LOCAL.#
,X.java.REMOTE.#
, où#
est un nombre. L'appel du résultat de fusion la version BASE est déroutant; MERGED serait mieux.Meld a une fonction de fusion à 3 voies cachée activée en passant le 4ème paramètre:
Les volets droit et gauche sont ouverts en mode lecture seule, vous ne pouvez donc pas fusionner accidentellement dans le mauvais sens. Le volet 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 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:
Cela ouvre la fusion 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 fusion à 3 voies.
Maintenant, la raison pour laquelle la fonctionnalité est cachée est qu'elle n'est pas encore assez polie. C'est très utile tel qu'il est maintenant, mais Kai Willadsen, l'auteur de la fusion, a souligné quelques rides à aplanir. Par exemple, il n'y a pas d'interface graphique pour démarrer le mode de fusion à 3 voies, la syntaxe de la ligne de commande est un peu obscure, etc. Si vous parlez python et que vous avez du temps libre, vous savez quoi faire.
Edit: Dans les nouvelles versions de Meld, la synaxe a légèrement changé. C'était dans les commentaires, mais cela fait partie de la réponse.
La commande meld utilise maintenant l'option --output, donc la dernière ligne de l'extrait ci-dessus devrait être:
la source
--output
pour le résultat $ MERGED. J'ai découvert cela en regardant le script de lancement de fusion fourni avec ma version de git: github.com/git/git/blob/master/mergetools/meld--output option
. Voir cette ligne dans le script de lancement:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. Ainsi, cela ouvre 3 onglets (bonne vieille méthode), fusionne automatiquement les fusions non conflictuelles au milieu, où le milieu est $ MERGED, et sera utilisé comme sortie de résolution de conflit.--output=<file>
ou-o <file>
, voirmeld --help
Il y a 4 fichiers impliqués:
$LOCAL
Le fichier sur la branche où vous fusionnez; non touché par le processus de fusion lorsqu'il vous est montré$REMOTE
Le fichier sur la branche à partir de laquelle vous fusionnez; non touché par le processus de fusion lorsqu'il vous est montré$BASE
L'ancêtre commun de $ LOCAL et $ REMOTE, ie. 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é$MERGED
Le fichier partiellement fusionné, avec des conflits; c'est le seul fichier touché par le processus de fusion et, en fait, ne vous a jamais été montré dansmeld
Le
$MERGED
fichier est celui qui contient les<<<<<<
,>>>>>>
,=====
(et, peut - être,||||||
) des marqueurs (que des conflits de délimiter). Il s'agit du fichier que vous modifiez 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 des informations différentes.
Lorsque vous utilisez le mergetool (on suppose
meld
), les fichiers qui y voient sont:$LOCAL
,$BASE
,$REMOTE
. Notez que vous ne voyez pas le$MERGED
fichier, bien qu'il soit passé comme paramètre caché pourmeld
y écrire le résultat de la modification.En d'autres termes, dans
meld
, vous éditez le fichier au milieu, le$BASE
fichier, 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$BASE
fichier, mais dans le quatrième paramètre caché demeld
, c'est-à-dire le$MERGED
fichier (que vous ne voyez même pas). Le$BASE
fichier ne pas contient aucun conflit ou se confond avec succès partiel , car il est pas le$MERGED
fichier .Dans l'édition visuelle, lorsque vous vous présentez, le
$BASE
fichier (au lieu du$MERGED
fichier)git
rejette fondamentalement toutes ses tentatives de fusion (ces tentatives sont visibles, si vous le souhaitez, dans le fichier $ MERGED) et vous permet d' effectuer 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
$MERGED
fichier).La correction manuelle des conflits se fait sur ,
$MERGED
cargit
n'a pas moyen de vous présenter trois fichiers, il écrase les informations des trois fichiers ($LOCAL
,$BASE
,$REMOTE
) dans ce$MERGED
fichier.Mais les outils visuels ont les moyens de vous montrer trois fichiers: ils vous montrent les
$LOCAL
,$BASE
, les$REMOTE
fichiers. Vous ramassez des changements$LOCAL
et des$REMOTE
fichiers et vous apportez ceux dans le$BASE
fichier, complètement re-construction et même la tentative avortée d' écraser la fusion qui est le$MERGED
fichier.la source
$LOCAL
,$REMOTE
,$BASE
et la sortie égale initialement$BASE
, mais qui est différent$MERGED
en ce sens qu'il n'a pas la tentative de git de fusionner les fichiers et les marqueurs de conflit et ainsi de suite. En fait, ce serait la façon d'utiliser ces outils qui est la plus similaire à l'approche à 3 volets de LOCAL / REMOTE / BASE + OUTPUT, qui ne montre pas fusionné. Le quatrième volet vous permet simplement de séparer la base de la sortie.La solution de Cosmin fonctionne, mais le fichier $ BASE est mis à jour - pas $ MERGED . Cela mettra à jour le fichier $ MERGED :
Fondre:
v1.8.4
la source
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
à la fin? pour moi sur 1.8.4, cela fonctionne très bien (pour autant que je puisse voir):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Avec Meld 1.7, la solution de Tomek Bury ne fonctionne plus.
Les paramètres par défaut ne m'ont pas satisfait:
Au lieu de cela pour Meld> = 1,7, je suggère l'une des deux autres solutions.
Première solution :
Deuxième solution :
.gitconfig
Copiez et collez ceci dans votre
.gitconfig
fichier pour obtenir les solutions décrites ci-dessus:Copiez et collez ceci dans un
.gitconfig.local
fichier pour définir meld17 ou meld16 uniquement pour cette machine au cas où vous utilisez votre .gitconfig sur plusieurs machines:la source
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
, le volet du milieu sera le $ BASE, et non le $ MERGE qui est réellement utilisé comme sortie de résolution de conflit.J'ai constaté qu'aucun des fichiers par défaut affichés n'était en cours d'enregistrement. meld montrait
$LOCAL
,$REMOTE
et$BASE
par défaut. Pour que cela fonctionne, j'avais besoin de faire un spectacle de fusion$MERGED
au lieu de$BASE
. Mettre ceci dans mon~/.gitconfig
fixe pour moi:J'utilise Arch, avec:
la source
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 devez installer meld v 1.3.3 ou une version antérieure.
la source
Veuillez consulter la réponse de Saad pour la bonne réponse.
Avec meld 1.8.1 sur Ubuntu, j'obtenais le
et en ajoutant le --output avant que $ MERGED ne le corrige pour moi:
la source