Question

Lorsque Git détecte un conflit lors de la fusion, le comportement par défaut est de remplir le fichier avec des marqueurs de <<< >>> de ===.

Ceci est OK la plupart du temps, mais parfois je voudrais résoudre les conflits différemment et je voudrais tout comme Git pour créer des fichiers distincts:

  • version originale,
  • version modifiée A,
  • version modifiée B.

Comment y parvenir?


S'il n'y a pas de commande simple de créer ces fichiers en une seule fois (ce qui est un peu surprenant), peut-être il y a un moyen d'étendre Git pour qu'il le ferait? Un mergetool personnalisé ou quelque chose? Juste une idée.


Solution:

J'ai réglé pour une variante de réponse @Karl Bielefeldt :

savefiles.sh

#!bash
BASE=$1
LOCAL=$2
REMOTE=$3
MERGED=$4

cp "$BASE" "$MERGED.git_BASE"
cp "$LOCAL" "$MERGED.git_LOCAL"
cp "$REMOTE" "$MERGED.git_REMOTE"

# never mark the conflict as merged
exit 1 

config

mergetool.savefiles.cmd=/path/to/savefiles.sh $BASE $LOCAL $REMOTE $MERGED
mergetool.savefiles.trustexitcode=true
Était-ce utile?

La solution

Créez un fichier appelé savefiles.sh avec le contenu suivant:

#!/usr/bin/bash

cp $1 /path/to/BASE
cp $2 /path/to/LOCAL
cp $3 /path/to/REMOTE

Exécuter la commande suivante dans votre répertoire:

git config mergetool.savefiles.cmd "/path/to/savefiles.sh \$BASE \$LOCAL \$REMOTE"

Ajouter un --global si vous voulez changer pour autre que ce dépôt.

Ensuite, pour exécuter ce mergetool personnalisé, utilisez:

git mergetool --tool=savefiles

Autres conseils

Si vous voulez aller sans mergetool et afficher uniquement ou enregistrer les fichiers dans les états que vous mentionnez, l'indice contient les différents états du fichier conflictuel. Vous pouvez afficher (et rediriger vers un fichier si vous voulez) avec:

$ git show :1:file.txt  # the file in a common ancestor of both branches
$ git show :2:file.txt  # the version from HEAD.
$ git show :3:file.txt  # the version from MERGE_HEAD.

Cependant, en utilisant un outil de fusion graphique vous montre une vue 3 volet du fichier conflictuel. C'est généralement ce que les gens font, tellement juste votre outil préféré et voir comment lier avec appel git mergetool.

Résumé

git mergetool -y -t bogus <file>

Travaux pour moi avec git 1.7.9.5 / Ubuntu 12.04 et msysGit 1.9.4 / Windows 7 64 bits.

Explication

Je voudrais simplement Git pour créer des fichiers distincts

Je cherchais la même chose. Exemple: lors de l'appel git mergetool -t kdiff3, git ). Quand cela est arrivé et kdiff3 résolu le mauvais de conflits, je suis à la recherche de cela.

Quand je Invoke mergetool comme si (où bogus est une chaîne qui n'est pas un identificateur d'outil de fusion valide [par exemple pas dans la sortie de git mergetool --tool-help si votre version de GIT que]), ce qui suit se produit:

  • Elle indique "outil fusion inconnu bogus"

  • L'index et file ne sont pas touchées

  • Les fichiers suivants sont générés (où {num} est un nombre entier qui est le même dans tous les fichiers créés par cette invocation):

    file.BACKUP.{num}
    file.BASE.{num}
    file.LOCAL.{num}
    file.REMOTE.{num}
    

file.BACKUP.{num} est identique à file.

Remarques

Je pense que le -y devrait être inutile si mergetool.prompt est réglé sur false. Et, selon la documentation, il semble que dans les versions les plus récentes de -t git implique -y.

La partie -t peut encore être raccourcie, par exemple, -t x ou -t 0.

Si vous avez plusieurs fichiers non fusionnées, il ne semble pas être un moyen d'obtenir ce pour générer ces versions pour plus d'un fichier à la fois. Par exemple. si vous avez des fichiers et non fusionnées files/file1 files/file2, une des conditions suivantes généreront encore que ces versions (sauvegarde, base, locale, à distance) pour file1:

git mergetool -y -t x
git mergetool -y -t x files
git mergetool -y -t x files/file1 files/file2

Cependant, si vous résoudre à nouveau les conflits dans file1 de git mergetool et d'exécution, il va passer au fichier suivant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top