Comment «afficher» une validation de fusion avec une sortie de combinaison combinée, même si chaque fichier modifié est compatible avec l’un des parents?

Après avoir fait une fusion “simple” (une sans conflit), git show ne montre généralement que quelque chose comme

 commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel  Date: Tue Feb 22 00:27:17 2011 +0100 Merge branch 'testing' into master 

En effet, pour les fusions, git show utilise le format diff combiné qui omet les fichiers correspondant à l’une des versions parentes.

Existe-t-il un moyen de forcer git à toujours afficher toutes les différences en mode diff combiné?

Faire git show -m affichera les différences (en utilisant les différences de paires entre les nouvelles versions et toutes les versions parentales respectivement), mais je préférerais que cela soit avec les différences marquées par +/- dans les colonnes respectives, comme en mode combiné.

Non, il n’y a pas moyen de faire ça avec git show . Mais ce serait certainement sympa de temps en temps, et il serait probablement relativement facile à implémenter dans le code source de git (après tout, il suffit de lui dire de ne pas supprimer ce qu’il pense être une sortie superflue), serait probablement accepté par les mainteneurs git.

Faites attention à ce que vous souhaitez, cependant; fusionner une twig avec un changement d’une ligne qui a été créé il y a trois mois aura toujours une énorme différence par rapport à la ligne principale, et une telle diff serait donc totalement inutile. C’est pourquoi git ne le montre pas.

Regardez le message de validation:

 commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel  Date: Tue Feb 22 00:27:17 2011 +0100 Merge branch 'testing' into master 

remarquez la ligne:

 Merge: fc17405 ee2de56 

prenez ces deux identifiants de validation et inversez-les. donc pour obtenir le diff que vous voulez, vous feriez:

 git diff ee2de56..fc17405 

pour afficher uniquement les noms des fichiers modifiés:

 git diff --name-only ee2de56..fc17405 

et pour les extraire, vous pouvez append ceci à votre gitconfig:

 exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"' 

puis utilisez-le en faisant:

 git exportfiles ee2de56..fc17405 /c/temp/myproject 

Une meilleure solution (mentionnée par @KrisNuttycombe):

 git diff fc17405...ee2de56 

pour la validation de la fusion:

 commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master) Merge: fc17405 ee2de56 Author: Tilman Vogel  Date: Tue Feb 22 00:27:17 2011 +0100 

pour afficher toutes les modifications sur ee2de56 accessibles depuis les commits sur fc17405 . Notez l’ordre des hachages de validation – c’est la même chose que dans les informations de fusion: Merge: fc17405 ee2de56

Notez également les 3 points ... au lieu de deux !

Pour une liste des fichiers modifiés, vous pouvez utiliser:

 git diff fc17405...ee2de56 --name-only 

Vous pouvez créer une twig avec HEAD définie sur une validation avant la fusion. Ensuite, vous pouvez faire:

 git merge --squash testing 

Cela va fusionner, mais pas commettre. Alors:

 git diff 

Je pense que vous avez juste besoin de ‘git show -c $ ref’. Essayer ceci sur le repository git sur a8e4a59 montre un diff combiné (caractères plus / moins dans l’une des deux colonnes). Comme le manuel de git-show le mentionne, les delegates à «git diff-tree» sont assez nombreux pour que ces options soient utiles.

On dirait que la réponse est ici: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

Donc, d’une manière similaire, en cours d’exécution

$ git diff –cc $ M $ M ^ 1 $ M ^ 2 $ (git merge-base $ M ^ 1 $ M ^ 2)

devrait montrer un patch combiné qui explique l’état à $ M par rapport aux états enregistrés dans ses parents et la base de fusion.

dans votre cas, vous avez juste besoin de

 git diff HEAD^ HEAD^2 

ou juste hash pour vous engagez:

 git diff 0e1329e55^ 0e1329e55^2 

J’ai construit une approche polyvalente pour effectuer diverses opérations sur les commits de fusion.

Première étape : Ajoutez un alias à git en éditant ~/.gitconfig :

 [alias] range = "!. ~/.githelpers && run_on_merge_range" 

Deuxième étape : Dans ~/.githelpers , définissez une fonction bash:

 run_on_merge_range() { cmd=$1; shift commit=$1; shift range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}') echo "git $cmd $range $@" if [ -z $range ]; then echo "No merge detected" exit 1 fi git $cmd $range $@ } 

Troisième étape : le profit!

 git range log  --oneline git range diff  --reverse -p git range diff  --name-only 

Il y a probablement BEAUCOUP de place pour l’amélioration ici, j’ai juste fouetté cela ensemble pour surmonter une situation ennuyeuse. N’hésitez pas à vous moquer de ma syntaxe et / ou de ma logique bash.

Vous pouvez utiliser la commande diff-tree avec l’indicateur -c. Cette commande vous montre quels fichiers ont été modifiés dans la validation de fusion.

 git diff-tree -c {merged_commit_sha} 

J’ai reçu la description du drapeau -c de Git-Scm :

Cet indicateur modifie la manière dont une validation de fusion est affichée (ce qui signifie qu’elle n’est utile que lorsque la commande en a donné une ou –stdin). Il montre les différences entre chacun des parents et le résultat de la fusion en même temps, au lieu de montrer les différences par paires entre un parent et le résultat un par un (ce que fait l’option -m). En outre, il ne répertorie que les fichiers modifiés de tous les parents.