web-dev-qa-db-fra.com

Comment "git show" un commit de fusion avec une sortie de diff combinée même lorsque chaque fichier modifié est en accord avec l'un des parents?

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

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
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 compatibles avec l’une des versions parent.

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

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

171
Tilman Vogel

Non, il n'y a aucun moyen de faire cela avec git show. Mais ce serait certainement bien parfois, et ce serait probablement relativement facile à implémenter dans le code source de git (après tout, il suffit de le dire à et non supprime ce qu'il pense être une sortie superflue), donc le correctif à faire serait probablement accepté par les mainteneurs de git.

Faites attention à ce que vous souhaitez, cependant; La fusion d'une branche avec un changement d'une ligne créé il y a trois mois aura toujours un énorme diff par rapport à la ligne principale. être presque complètement inutile. C'est pourquoi Git ne le montre pas.

4
apenwarr

Regardez le message de validation:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
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 commit et inversez-les. afin d'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 ajouter 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 l'utiliser en faisant:

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

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

git diff fc17405...ee2de56

pour le commit de fusion:

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

pour afficher tous les changements sur ee2de56 qui sont accessibles depuis les commits sur fc17405. Notez l'ordre des hachages de validation - il est identique à celui indiqué 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
65
CoDEmanX

Vous pouvez créer une branche avec HEAD défini sur un commit avant la fusion. Ensuite, vous pouvez faire:

git merge --squash testing

Cela va fusionner mais pas commettre. Ensuite:

git diff
11
side2k

On dirait qu'on a répondu ici: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

Donc, de la même manière, en cours d'exécution

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (base de fusion git $ 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.

4
max630

Je pense que vous avez juste besoin de 'git show -c $ ref'. Essayer ceci dans le dépôt git sur a8e4a59 montre un diff combiné (les caractères plus/moins dans l’une des 2 colonnes). Comme le mentionne le manuel de git-show, les délégués de "git diff-tree" sont très utiles, de sorte que ces options semblent utiles.

4
patthoyts

dans votre cas il vous suffit de

git diff HEAD^ HEAD^2

ou juste du hachage pour vous engager:

git diff 0e1329e55^ 0e1329e55^2
3
gurugray

Si votre commit de fusion est commit 0e1329e5, comme ci-dessus, vous pouvez obtenir le diff contenu dans cette fusion par:

git diff 0e1329e5^..0e1329e5

J'espère que ça aide!

2
hesham_EE

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

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

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

Deuxième étape: In ~/.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: Bénéfice!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

Il y a probablement BEAUCOUP d'améliorations à faire ici, je viens de combiner cela pour surmonter une situation ennuyeuse. N'hésitez pas à vous moquer de ma syntaxe et/ou de ma logique bash.

1
Nerdmaster

Si vous êtes assis au commit de la fusion, cela montre les diffs:

git diff HEAD~1..HEAD

Si vous n'êtes pas à la validation de fusion, remplacez simplement HEAD par la validation de fusion. Cette méthode semble être la plus simple et la plus intuitive.

1
Bruce Dawson

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

git diff-tree -c {merged_commit_sha}

J'ai eu la description du drapeau -c de Git-Scm :

Cet indicateur modifie le mode d'affichage d'une validation de fusion (ce qui signifie qu'il n'est utile que lorsque la commande en reçoit une, ou --stdin). Il montre simultanément les différences entre les parents et le résultat de la fusion au lieu d'afficher différemment les différences entre un parent et le résultat (ce que fait l'option -m). En outre, il ne répertorie que les fichiers modifiés par tous les parents.

1
Ehsan Mirsaeedi