Après avoir effectué 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 <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
Merge branch 'testing' into master
Cela est dû au fait que, pour les fusions, git show
utilise le format de diff combiné qui omet les fichiers qui correspondent à 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 des différences par paires entre la nouvelle et toutes les versions parentes respectivement) mais je préférerais avoir cela avec les différences marquées par +/- dans les colonnes respectives comme en mode combiné.
Réponses:
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 lui dire de ne pas supprimer ce qu'il pense être une sortie étrangère), donc le patch pour le faire serait probablement accepté par les responsables de git.Faites attention à ce que vous souhaitez, cependant; fusionner une branche avec un changement d'une ligne qui a été fourché il y a trois mois aura toujours un énorme diff par rapport à la ligne principale, et donc un tel diff complet serait presque totalement inutile. C'est pourquoi git ne le montre pas.
la source
Regardez le message de validation:
remarquez la ligne:
prenez ces deux identifiants de validation et inversez-les. donc pour obtenir le diff que vous voulez, vous feriez:
pour afficher uniquement les noms des fichiers modifiés:
et pour les extraire, vous pouvez ajouter ceci à votre gitconfig:
puis utilisez-le en faisant:
la source
git diff fc17405...ee2de56
- cela montrera tous les changements sur ee2de56 qui sont accessibles à partir de commits sur fc17405, ce que je crois est ce que vous voulez. Notez les 3 points au lieu de deux.git log
, qui montre toujours tous les commits, comme la..
variante...
et...
faites de même pourlog
, mais pourdiff
ils sont différents !? Comment obtenir une liste des commits qui ont été fusionnés dans cette branche?Une meilleure solution (mentionnée par @KrisNuttycombe):
pour le commit de fusion:
pour afficher toutes les modifications
ee2de56
qui sont accessibles à partir des validationsfc17405
. Notez l'ordre des hachages de validation - c'est le même que 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:
la source
Vous pouvez créer une branche avec HEAD défini sur un commit avant la fusion. Ensuite, vous pouvez faire:
Cela fusionnera, mais ne validera pas. Ensuite:
la source
On dirait une réponse ici: https://public-inbox.org/git/[email protected]/
la source
Je pense que vous avez juste besoin de 'git show -c $ ref'. Essayer cela sur le référentiel git sur a8e4a59 montre un diff combiné (caractères plus / moins dans l'une des 2 colonnes). Comme le mentionne le manuel de git-show, il délègue à peu près «git diff-tree», donc ces options semblent utiles.
la source
git show -c $ref
affiche le même résultat que celui que j'ai cité, c'est-à-dire aucune différence.-c
sélectionne un mode de diff combiné très similaire au mode par défaut pour les validations de fusion qui est «--cc», voirgit help show
etgit help diff-tree
. Les deux omettent complètement les fichiers qui correspondent à l'une des versions parentes de ce fichier.a8e4a59
en effet, ne rentre pas dans la catégorie des commits de fusion, je veux dire. Ce commit de fusion contient en effet un fichier qui diffère de ses deux versions parentes.Documentation/git-fast-import.txt
a des choses ajoutées d'un parent et d'autres de l'autre. Cela entraîne une sortie non vide degit diff-tree --cc
. Cependant, seuls les changements dans ce cas «conflictuel» sont affichés. Tous les résultats de fusion "propres", regardezgit show -m a8e4a59
, ne sont pas affichés du tout.git show -c
sortie. (man git-diff-tree
dit "En outre, il ne répertorie que les fichiers qui ont été modifiés par tous les parents." mais pour ma part, je n'avais certainement pas repéré cela.)dans votre cas, il vous suffit de
ou simplement hacher pour vous commit:
la source
git merge-base HEAD^ HEAD^2
etHEAD^
etHEAD^2
dans le même style que pour les fichiers qui ont été fusionnés avec des conflits.Si votre validation de fusion est la validation 0e1329e5, comme ci-dessus, vous pouvez obtenir le diff contenu dans cette fusion en:
J'espère que ça aide!
la source
Si vous êtes assis à la validation de fusion, cela montre les différences:
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 la plus simple et la plus intuitive.
la source
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 de fusion.
J'ai obtenu la description de l'indicateur -c de Git-Scm :
la source
J'ai construit une approche polyvalente pour effectuer diverses opérations sur les commits d'une fusion.
Première étape : ajoutez un alias à git en éditant
~/.gitconfig
:Deuxième étape : dans
~/.githelpers
, définissez une fonction bash:Troisième étape : profitez!
Il y a probablement BEAUCOUP de marge d'amélioration ici, je viens de fouetter cela ensemble pour surmonter une situation ennuyeuse. N'hésitez pas à vous moquer de ma syntaxe et / ou de ma logique bash.
la source