Git - créer automatiquement des fichiers distincts pour les versions sur les conflits
-
26-10-2019 - |
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
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.