git: Voir les modifications apportées à un fichier spécifique par un commit
Je veux voir quels changements ont été apportés à cette du fichier à la ligne 147. J'ai donc demandé le fichier ligne par ligne pour les livraisons par:
git blame include/svl/itemset.hxx
Ici est taillée sortie de git blâmer:
4b3a535ae3 include/svl/itemset.hxx (Michael Stahl 2015-04-08 15:02:47 +0200 145) SfxItemPool* GetPool() const { return m_pPool; }
4b3a535ae3 include/svl/itemset.hxx (Michael Stahl 2015-04-08 15:02:47 +0200 146) const sal_uInt16* GetRanges() const { return m_pWhichRanges;
}
d210c6ccc3 svl/inc/svl/itemset.hxx (Xiaofei Zhang 2010-07-29 10:56:19 +0800 147) void SetRanges( const sal_uInt16 *pRanges );
d210c6ccc3 svl/inc/svl/itemset.hxx (Xiaofei Zhang 2010-07-29 10:56:19 +0800 148) void MergeRange( sal_uInt16 nFrom, sal_uInt16 nTo );
4b3a535ae3 include/svl/itemset.hxx (Michael Stahl 2015-04-08 15:02:47 +0200 149) const SfxItemSet* GetParent() const { return m_pParent; }
Maintenant, je veux voir quels changements ont fait que s'engager avec SHA d210c6ccc3
à ces lignes. Fondamentalement, je veux voir les modifications apportées par la présente s'engagent à le fichier. J'ai donc fait :
`git show d210c6ccc3 include/svl/itemset.hxx`
Mais cela ne semble pas me donner le droit de sortie, en fait il ne sort rien. Quelqu'un pourrait s'il vous plaît suggérer que pouvais-je être absent? Ou peut-être il y a une autre meilleure façon de savoir quelles modifications ont été apportées à un fichier par un commit?
d210c6ccc3
modifie svl/inc/svl/itemset.hxx
tandis que le fichier include/svl/itemset.hxx
est modifié par 4b3a535ae3
.... mais votre livraison+le fichier combinaison n'est pas la faute du journal. Peut-être il ya un changement de nom ou un lien ou quelque chose dans le milieu?si les auteurs de ne pas modifier le fichier, alors pourquoi est-il dans la sortie de git-le blâme? Autant que j'en ai lu git blâmer donne les lignes et s'engage, qui a modifié ces lignes.
Ma conjecture est que le
include/svl
répertoire a été renommé en svl/inc/svl
(ou de l'autre manière autour. Utilisez simplement l'autre nom pour voir votre diff.
OriginalL'auteur Rohan Kumar | 2017-05-29
Vous devez vous connecter pour publier un commentaire.
eftshift0 réponse est correcte (et j'ai upvoted). Voici pourquoi, mais avec une autre chose qui peut aller mal ici.
Dans plus cas,
git show commit -- path
serait de corriger et de vous montrer:Le patch serait le même que celui produit par les
git diff commit^1 commit -- path
. (Notez que le^1
suffixe voici le texte littéral, tandis que lecommit
partie est un hash ID que vous devez remplacer. Le suffixe de la syntaxe signifie "trouver le premier parent". Vous pouvez ajouter ce suffixe à la plupart commettre des sélecteurs, mais pas pour les sélecteurs que l'utilisation de certains modèles de recherche. Voir le gitrevisions documentation.)Il y a deux exceptions importantes. Un seul de ces s'applique ici, parce que
git blame
normalement ne les blâme pas d'une fusion, il tente de retracer l' source de la modification de la fed en de la fusion. Tout de même, je tiens à le mentionner, parce quegit show
comportement sur fusionne est ... intéressant. 🙂Si vous regardez une fusion s'engager avec
git show
, vous verrez, par défaut, un combiné diff ("tous les parents" contre la fusion de commettre de contenu). Dans ce cas, vous pourriez retomber directement surgit diff
, de sorte que vous pouvez spécifier le parent que vous souhaitez comparer (^1
,^2
, et encore plus si c'est une pieuvre de fusion). La raison en est que le total combiné des diff omettre délibérément n'importe quel fichier qui correspond à la version de l'un des parent s'engage à: cela signifie que tout ce qui est dans le référentiel à partir de ce moment, il est venu de un des deux (ou N si N > 2) des "côtés" de la fusion.Avec
git blame
, vous êtes à la recherche de "qui a changé quoi". La personne qui a fait la fusion n'est souvent pas la personne qui a effectué le changement—de sorte que vous devriez continuer "derrière la fusion" pour trouver qui vraiment changé.La deuxième exception est celui qui a causé un problème pour vous ici, et c'est vraiment plus un cas de la façon
git blame
fonctionne lorsque des fichiers sont renommé au cours du développement.Quand
git blame
est d'analyser les modifications apportées à un fichier, telles queinclude/svl/itemset.hxx
, il se recule un commit à la fois, depuis la validation que vous spécifiez. Si vous ne sélectionnez pas votre propre point de départ, il commence à partir deHEAD
, c'est à dire, le commit courant. Il examine ensuite le parent commit(s) (comme si pargit show
par exemple). Par exemple, si le courant de commettre922e935c8812
est ordinaire à s'engager et à son parent est22c6554c98e2
, il compare commettre922e935c8812
à22c6554c98e2
. Si22c6554c98e2
a un fichier de la même nom, c'est probablement la même fichier ... mais si pas, Git, essaie de comprendre fichier dans22c6554c98e2
est le même fichier queinclude/svl/itemset.hxx
.Dans ce cas, la même chose arrive à commettre
b9337e22ce1d
. Il existe un fichier nomméinclude/svl/itemset.hxx
en commettreb9337e22ce1d
, mais en commettreb9337e22ce1d^
ouf4e1642a1761
, le fichier est nommésvl/inc/svl/itemset.hxx
. Git détecte cette renommer en faisant un pas en arrière de commettreb9337e22ce1d
de commettref4e1642a1761
, etgit blame
porte alors l' nouveau nom de retour avec de commettref4e1642a1761
de commettred210c6ccc3
.Lorsque vous exécutez
git show d210c6ccc3
, cependant, Git saute directement àd210c6ccc3
(et son parent7f0993d43019
). Il ne sait plus que le fichier nomméinclude/svl/itemset.hxx
dansHEAD
est nommésvl/inc/svl/itemset.hxx
dansd210c6ccc3
. Donc vous doit découvrir cela, et passer le plus tôt le nom de Git.Vous pourriez vous demander comment vous pouvez en trouver un. La réponse est d'utiliser
git log --follow
. Le--follow
code pourgit log
n'est pas grand,1 mais c'est la même codegit blame
utilise, donc il produit les mêmes réponses, au moins. Voici ce que j'ai fait:Il y a un deuxième renommer même plus tôt. En voici un autre, plus court chemin pour trouver seulement le renomme:
Si
d210c6ccc3
est venu "avant"e6b4345c7f40
, vous devez utiliser le même-plus tôt le nom de chemin d'accès—mais s'engagerd210c6ccc3
est un descendant de (vient après)e6b4345c7f40
, pas un ancêtre.1Lorsque des changements se produisent à des fusions, c'est vraiment, dans un sens fondamental, nécessite suivantes les deux (ou la totalité) d'entrée s'engage simultanément. Cependant, Git n'est pas (pour l'instant?) capable de le faire: à la fois
git log --follow
etgit blame
vraiment que traverse selon la mère de la version finale du fichier "viens". C'est, si l'on regarde un typique de fusion s'engagerM
contenant le fichier fusionnéF
, il y a deux entréesM^1:F
etM^2:F
, et une sortie,M:F
. SiM:F
est le même queM^1:F
, nous devrions ignorerM^2:F
entièrement: tout le contenu deM:F
sont ceux de la personne qui a fourniM^1:F
. SiM:F
est le même queM^2:F
, nous devrions ignorerM^1:F
entièrement: tout le contenu deM:F
sont ceux de la personne qui a fourniM^2:F
.Notez que cela ne fonctionne que pour un fichier à la fois, et même alors, il ne fonctionne que si le fichier correspond exactement à l'une des deux entrées. Sinon, il faut regarder le combiné diff de voir comment le fichier s'est modifié à partir de les deux entrées. C'est la logique derrière les deux combinés de diff et de l'Histoire de la Simplification. Mais c'est simplifiée dans certains cas rares, et donc parfois des choses mauvaises.
OriginalL'auteur torek
Vous devez fournir le chemin d'accès dans le cadre de cette révision:
Qui devrait faire
non, Edmundo est correcte (essayer de cloner le dépôt, bien que c'est un peu grand). Vous seriez généralement droit si
d210c6ccc3
étaient une fusion s'engager, mais il ne l'est pas.Si c'était un commit de fusion et le contenu viendrait de l'un des parents, vous souhaitez tout voir pas la fusion de révision, mais le véritable révision de l'endroit où les lignes ont été ajoutées.... ou si les lignes ont été ajoutées sur la fusion (par exemple, pour corriger une situation de conflit ou de corriger un code qui n'était pas après la fusion.... ce qui se passe sur certaines situations) la fusion de révision sous le blâme de sortie et puis, certaines de sortie pour le fichier sur la fusion de révision lors de l'utilisation de spectacle.
droit, j'ai été un peu trop laconique ici. On peut trouver une fusion pas par
git blame
et souhaitezgit show
un fichier qui s'engagent, mais si elle ne fait pas partie de la combinaison de diff,git show
n'affiche pas le fichier. Si l'on vient à travers la fusion pargit blame
, le changement sera de la partie pour la combinaison de diff de sorte quegit show
afficher le fichier après tout.Assez juste, ne peut pas upvote, sauf si une modification est faite.
OriginalL'auteur eftshift0
Vous pouvez utiliser
pour afficher les modifications apportées à un fichier d'en commettre (
d210c6ccc3
) par rapport à son prédécesseur (d210c6ccc3^
).Où
d210c6ccc3^
est la "base" etd210c6ccc3
est le commit que vous voulez comparer à la base.Si, comme mentionné dans les commentaires sur votre question, vous cherchez au mauvais commit puis remplacez le SHA-dessus.
Cela donnera un
diff
sortie du contenu des fichiers, lagit show
commande vous a donné affichera le message de commit - uniquement si le fichier a été modifié dans le commit spécifié.OriginalL'auteur Peter Reid