79 votes

Exécuter l'algorithme de fusion git sur deux fichiers individuels

Je veux tirer parti de l'algorithme de fusion git sur deux fichiers arbitraires dans un dépôt git. Voici mon répertoire de travail :

folder/
    file1
    file2

file1 et file2 sont similaires, mais je veux voir comment git les fusionnerait comme s'ils étaient différentes versions du même fichier. En d'autres termes, je veux quelque chose comme ceci :

git merge-files file1 file2 > merge_of_file1_file2

Y a-t-il un moyen de faire cela ?

73voto

Jefromi Points 127932

Cela n'a pas vraiment de sens, car vous ne fournissez pas un ancêtre commun. Si vous en avez un, cependant, vous pouvez utiliser :

git merge-file   

Cela place les résultats dans le fichier de la version actuelle ; si vous voulez les mettre ailleurs, utilisez :

git merge-file -p    > 

Il faut l'ancêtre commun pour fournir quelque chose par rapport à quoi considérer les changements. Vous pourriez bidouiller en fournissant un fichier vide ou une copie d'une version plus ancienne de l'un d'eux provenant de l'historique de votre dépôt, mais la qualité des résultats dépendra de la façon dont vous sélectionnez un ancêtre commun, car il fusionne les deux différences, entre cela et chacune des nouvelles versions. Un fichier vide ne fonctionnera bien que si les deux sont très similaires (beaucoup de séquences d'au moins trois lignes identiques).

Sans cela, tout ce que vous pouvez vraiment faire est de regarder les différences :

git diff --no-index file1 file2

61voto

manojlds Points 96599

Pour ce que vous essayez de faire:

touch file3  #vide
git merge-file file1 file3 file2

Cela fera une fusion à trois voies de file1 et file2 avec file3 (fichier vide) comme base.

Notez que cela écrit sur file1. Vous pouvez bien sûr faire ce qui suit si cela n'est pas souhaité:

touch file3
cp file1 fusion_de_file1_file2
git merge-file fusion_de_file1_file2 file3 file2

4 votes

J'ai vérifié que cela fonctionne (via Git Bash). Voici la fonction bash que j'ai écrite pour encapsuler cela dans une seule commande : ``` function merge() { touch merge_result git merge-file $1 merge_result $2 rm merge_result } ```

2 votes

Cela montre le fichier complet tel qu’il a changé au lieu des lignes modifiées

5voto

Luke Davis Points 840

Juste pour ajouter à la réponse de manojlds, voici une fonction complète que vous pouvez ajouter à votre .bashrc qui fait le travail. Il a l'avantage d'identifier correctement les noms de vos deux fichiers dans les blocs de "conflit de fusion".

merge() {
  local ext
  [ $# -ne 2 ] && echo "Erreur : Besoin exactement de deux arguments." && return 1
  [[ ! -r $1 || ! -r $2 ]] && echo "Erreur : Un des fichiers n'est pas lisible." && return 1
  if [[ ${1##*/} =~ '.' || ${2##*/} =~ '.' ]]; then
    [ ${1##*.} != ${2##*.} ] && echo "Erreur : Les fichiers doivent avoir la même extension." && return 1
     ext=.${1##*.}
  fi
  touch tmp$ext # utilisez un fichier vide comme 'racine' de la fusion
  cp $1 backup$ext
  git merge-file $1 tmp$ext $2 # écrira dans le fichier 1
  mv $1 merge$ext
  mv backup$ext $1
  rm tmp$ext
  echo "Fichiers fusionnés dans \"merge$ext\"."
}

1voto

dominic Points 149

Vous pouvez également utiliser KDiff3 pour cela.

  • Sélectionnez le fichier un
  • Sélectionnez le fichier deux

Et fusionnez :)

http://kdiff3.sourceforge.net/

1 votes

Il semble que ce lien pointe vers la version archivée, vérifiez download.kde.org/stable/kdiff3 pour des versions plus récentes. Il y a une version pour votre système d'exploitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X