Quelle version du fichier git sera finalement utilisée: locale, de BASE ou distante?

quand il y a un collison pendant git merge , j'ouvre un mergetool appelé Meld . Il ouvre trois fichiers LOCAL, BASE et REMOTE. Comme J'ai lu LOCAL est ma branche locale, BASE est ancêtre commun et distant est la branche à fusionner.

Maintenant à ma question: quelle version du fichier sera finalement utilisé? Est-il à DISTANCE? Si c'est le cas, puis-je l'éditer comme je le veux, indépendamment de ce qu'il y a dans la branche de BASE par exemple?

152
demandé sur kenorb 2012-06-21 11:15:04
la source

8 ответов

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 fichier sur le haut de la fenêtre d'édition de fusion.

voir la capture d'écran ici

meld base

vous pouvez modifier le fichier BASE que vous voulez avec ou sans commandes de fusion.

Vous pouvez également vous débarrasser de fondre, il suffit d'éditer le fichier avec votre éditeur de texte favori.

  • 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.
125
répondu Fabien Quatravaux 2012-06-21 18:31:22
la source

a une fonction de fusion cachée activée en passant dans le quatrième paramètre:

meld $LOCAL $BASE $REMOTE $MERGED

les vitres droite et gauche sont ouvertes en mode Lecture seule, de sorte que vous ne pouvez pas accidentellement fusionner le mauvais chemin. Le volet du milieu montre le résultat de la fusion. Pour les conflits, il montre la version de base de sorte que vous pouvez voir tous les bits importants: texte original au milieu, et les modifications contradictoires des deux côtés. Enfin, lorsque vous appuyez sur le bouton" Enregistrer", le fichier $fusionné 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

ouvre la fusion avec 3 onglets, premier et deuxième onglets contenant les diffs simples que j'essaie de fusionner, et le troisième onglet, ouvert par défaut, montre la vue de la fusion à 3 voies.

maintenant, la raison pour laquelle la fonctionnalité est cachée est qu'elle n'est pas encore assez polie. Il est très utile comme elle l'est maintenant, mais Kai Willadsen, l'auteur de la fusion, a souligné peu de rides qui doivent être aplanies. 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 floue, et ainsi de suite. Si vous parlez python et que vous avez un peu de temps libre, vous savez quoi faire.

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

Le meld commande maintenant utilise 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
103
répondu Tomek Bury 2014-06-27 15:58:23
la source

il y a 4 fichiers impliqués:

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

  2. $REMOTE le fichier sur la branche d'où 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 branches 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 conflits; c'est le seul fichier touché par la fusion processus et, en fait, jamais montré à vous dans meld


le fichier $MERGED est celui qui contient <<<<<< , >>>>>> , ===== (et, peut-être, |||||| ) marqueurs (qui délimitent les conflits). Ce est le fichier que vous éditez manuellement pour résoudre les conflits.

les conflits manuels l'édition et les conflits visuels l'édition se fait sur différents fichiers et différentes informations présentées.

Lorsqu'on utilise mergetool( supposons meld ), les fichiers qui s'y trouvent sont:: $LOCAL , $BASE , $REMOTE . Notez que vous ne voyez pas le fichier $MERGED , bien qu'il soit passé comme paramètre caché à meld pour y écrire le résultat de l'édition.

en d'autres termes, meld , vous éditez le fichier au milieu, le fichier $BASE , et vous sélectionnez tous les changements à gauche ou à droite manuellement . C'est un fichier sain, pas touchée par le processus de fusion. Le seul problème est que, lorsque vous enregistrez, vous n'enregistrez pas dans le $BASE fichier, mais dans le quatrième paramètre caché de meld , c'est le $MERGED fichier (que tu ne vois même pas). Le fichier $BASE ne pas contiennent des conflits ou fusion partielle réussie parce que il n'est pas le $MERGED fichier .

dans l'édition visuelle, en vous présentant le fichier $BASE (au lieu du fichier $MERGED ) git écarte fondamentalement toutes ses tentatives de faire la fusion (ces tentatives sont visibles, si vous voulez, dans le fichier $fusionné) et vous permet de complètement faire la fusion à partir de zéro .

le résultat est que 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 (qui est le fichier $MERGED ).

la correction manuelle des conflits se fait sur $MERGED parce que git n'a pas de moyen pour vous présenter trois fichiers, de sorte qu'il écrase les informations des trois fichiers ( $LOCAL , $BASE , $REMOTE ) dans ce dossier $MERGED .

mais les outils visuels ont les moyens pour vous montrer trois fichiers: ils vous montrent le $LOCAL , $BASE , $REMOTE des dossiers. Vous êtes en train de sélectionner des modifications à partir des fichiers $LOCAL et $REMOTE et vous les apportez dans le fichier $BASE , en reconstruisant complètement et même en écrasant la tentative ratée de fusion qui est le fichier $MERGED .

47
répondu user1284631 2015-12-18 00:14:56
la source

Cosmin la solution fonctionne, mais le $BASE le fichier est mis à jour-pas de $FUSIONNÉ . Cela mettra à jour le $fusionné fichier:

Fusion: 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
répondu Saad Malik 2014-03-06 11:28:15
la source

avec soudure 1.7 la Solution de Tomek Bury ne fonctionne plus.

Le paramètres par défaut ne me satisfont pas:

Default settings

au lieu de Fusion >=1,7 je suggère une de 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 et 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 et collez ceci dans un fichier .gitconfig.local pour définir meld17 ou meld16 seulement pour cette machine dans le cas où vous utilisez votre .gitconfig sur machines multiples:

# 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
répondu lumbric 2015-12-01 23:23:47
la source

j'ai trouvé qu'aucun des fichiers par défaut était d'être sauvé. par défaut, $LOCAL , $REMOTE et $BASE . Pour que ça marche, il fallait que je fasse $MERGED au lieu de $BASE . Mettre ceci 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
11
répondu Thomas Leonard 2013-03-22 21:11:34
la source

Pour une raison quelconque nouvelles versions de meld ne pas afficher les lignes ajoutées pour les conflits (<<<<<<<, =======, >>>>>>>) . Si vous voulez voir ces lignes, vous devez installer fondre v 1.3.3 ou précédente.

2
répondu wnasich 2013-09-04 23:02:26
la source

s'il vous Plaît voir Saad réponse à la réponse correcte.

Avec meld 1.8.1 sur Ubuntu j'ai fait le

nombre erroné d'arguments fournis à --diff

et l'ajout de la sortie --avant $ fusionné fixe pour moi:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
2
répondu cosmin 2014-03-14 13:51:14
la source

Autres questions sur git git-merge meld