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é.
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.
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
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
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
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.
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.
dans votre cas il vous suffit de
git diff HEAD^ HEAD^2
ou juste du hachage pour vous engager:
git diff 0e1329e55^ 0e1329e55^2
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!
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.
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.
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.