J'utilise git diff pour obtenir les différences entre un commit et son parent pour un fichier spécifique. J'utilise cette commande:
diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c06acb9..0000000 --- a/yarn.lock +++ /dev/null @@ -1,10383 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"7zip-bin@~4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-4.1.0.tgz#33eff662a5c39c0c2061170cc003c5120743fff0" - integrity sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA== - -"@angular-devkit/architect@0.11.4": - version "0.11.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.11.4.tgz#f0cc3b4f1dd0128f6b41d3bb760bcf4c324cd063" - integrity sha512-2zi6S9tPlk52vyqN67IvFoeNgd0uxtrPlwl3TdvJ3wrH7sYGJnkQ+EzAE7cKUGWAV989BbNtx2YxhRDHnN21Fg==
Voici mon problème: avec cette commande, je peux obtenir des fichiers ajoutés, supprimés et modifiés pour un commit spécifique. Mais quand je l'essaye sur mon commit actuel, je ne peux obtenir que des fichiers modifiés / supprimés. Je cherche un moyen d'obtenir des fichiers supprimés et ajoutés pour le commit actuel (par rapport à son parent).
Par exemple, voici mes modifications non validées:
Si j'exécute git diff HEAD - yarn.lock
j'obtiens ceci p >
git diff parent-sha child-sha -- file/to/path
Mais rien sur git diff - src / app / models / DiffFileInformation.ts
3 Réponses :
git diff HEAD - path
vous montrera vos modifications locales.
Le fichier src / app / models / DiffFileInformation.ts
n'est ni suivi ni mis en scène, il n'apparaîtra donc pas dans votre diff.
Pour le voir dans le diff, vous devrez d'abord le mettre en scène (l'ajouter).
Je ne peux pas l'obtenir avec des options?
Non, pas pour autant que je sache. Fondamentalement, le diff du fichier est le fichier entier lui-même. Qu'essayez-vous de réaliser exactement? Mettre en scène quelque chose de spécifique à partir du fichier?
Les 3 commandes suivantes ne sont pas les mêmes:
diff --git a/a.txt b/a.txt index ce01362..e69de29 100644 --- a/a.txt +++ b/a.txt @@ -1 +0,0 @@ -hello diff --git a/b.txt b/b.txt index ce01362..e69de29 100644 --- a/b.txt +++ b/b.txt @@ -1 +0,0 @@ -hello
Supposons que nous ayons initialisé un dépôt et effectué deux validations et quelques modifications supplémentaires non validées.
diff --git a/a.txt b/a.txt index e69de29..ce01362 100644 --- a/a.txt +++ b/a.txt @@ -0,0 +1 @@ +hello diff --git a/b.txt b/b.txt index e69de29..ce01362 100644 --- a/b.txt +++ b/b.txt @@ -0,0 +1 @@ +hello
La réponse d'ElpieKay est correcte (et je l'ai votée pour), mais cela pourrait vous aider à réfléchir au problème si vous prenez du recul et réfléchissez aux commits et au fonctionnement de Git.
Chaque commit contient plusieurs éléments, que nous pouvons diviser en deux grandes catégories, données et métadonnées . Les données d'un commit sont l'instantané du code source, et les métadonnées sont des informations supplémentaires sur les données, telles que qui a créé l'instantané, quand , et ainsi de suite (et surtout, l ' ID de hachage parent pour le parent de ce commit, ou s'il s'agit d'un commit de fusion, tous ses ID de hachage parent, mais je pense que vous avez cette partie bien sous contrôle maintenant). Notez que tout ce qui se trouve dans le commit est figé pour toujours . Vous ne pouvez modifier aucune partie des données ou des métadonnées.
En fait, c'est le cas pour tous les objets internes de Git. L'ID de hachage de l'objet Git est une somme de contrôle cryptographique du contenu de cet objet. C'est génial pour l'archivage - chaque commit, une fois fait, ne peut jamais être changé - mais c'est complètement inutile pour effectuer un nouveau travail . Pour effectuer un nouveau travail, Git doit fournir des emplacements où les fichiers peuvent être modifiés .
Chaque système de contrôle de version a ce problème, et en général, ils le résolvent tous de la même manière: l'endroit où vous travaillez sur votre fichier est votre arbre de travail . Les fichiers de l'arbre de travail sont malléables. Les fichiers dans les validations ne le sont pas. Cela signifie qu'il y a quelque chose de fondamentalement différent dans un arbre de travail que dans un commit. L'arbre de travail pourrait être un commit proposé , mais il est toujours malléable, donc ce n'est pas un commit réel . (Il n'a pas non plus de métadonnées.)
Ainsi, dans Git, un arbre de travail n'a pas d'ID de hachage . Mais pour une raison quelconque, Git va encore plus loin. Au lieu d'avoir simplement l'arbre de travail comme prochain commit proposé, Git ajoute une troisième entité, située entre HEAD
- le commit actuel - et l'arbre de travail. Cette troisième entité est appelée l ' index , ou la zone de préparation , voire parfois le cache . (Vous verrez les trois noms dans la documentation Git. Ils font tous référence à la même chose.) Cet index est l'endroit où Git stocke le prochain commit proposé. Git fournit ensuite des commandes comme git add
qui copient de l'arbre de travail (où vous avez vos fichiers et pouvez travailler dessus) vers l'index (pour mettre à jour le prochain commit proposé).
Cela signifie que git diff
doit pouvoir:
Il propose quatre manières différentes de le faire, en fonction des arguments et du drapeau --cached
que vous passez à git diff
: p>
git diff hash1 hash2
compare commit et commit git diff --cached hash
compare commit et index git diff hash
compare commit et work-tree git diff
compare index et work-tree Choisissez celui que vous voulez, ajoutez -
pour restreindre la sortie de diff, et vous êtes prêt.
Avez-vous exécuté
git diff HEAD ^ HEAD
?Non,
diff
a le même comportement avec HEAD ou tout autre ref. Peut-être n'y a-t-il aucun fichier supprimé / ajouté ici?@ElpieKay (ou même simplement
git diff HEAD ^
)Ok, je pense que j'ai mal compris. Je cherche un moyen d'obtenir des différences entre le commit actuel et son parent. HEAD n'est peut-être pas le commit actuel. Je veux dire, si je supprime un fichier maintenant et que j'essaie d'obtenir la sortie de git diff (sans valider les modifications), que dois-je exécuter?
Oui j'ai essayé avec les deux commandes et je ne reçois que les fichiers modifiés (je vais éditer par exemple)