113 votes

fichier renommé git diff

J'ai un fichier a.txt.

cat a.txt
> hello

Le contenu de a.txt est "bonjour"

Je fais un commit.

git add a.txt
git commit -m "first commit"

J'ai ensuite déplacer a.txt dans un test dir.

mkdir test
mv a.txt test

Je puis faire mon deuxième commettre

git add -A
git commit -m "second commit"

Enfin, j'ai modifier a.txt pour dire au revoir à la place

cat a.txt
> goodbye

Je fais mon dernier commit

git add a.txt
git commit -m "final commit"

Maintenant, voici ma question:

Comment puis-je diff du contenu de a.txt entre mon dernier commit et mon premier commit?

J'ai essayé: git diff HEAD^^..HEAD -M a.txt, mais cela ne fonctionne pas. git log --follow a.txt correctement détecte le changement de nom, mais je ne peux pas trouver un équivalent pour git diff. Est-il un?

108voto

Charles Bailey Points 244082

La question de la différence entre HEAD^^ et HEAD , c'est que vous avez un a.txt dans les deux commits, il suffit donc de considérer ces deux commits (qui est ce qui diff?), il n'y a pas de renommer, il y a une copie et un changement.

Pour détecter les copies, vous pouvez utiliser -C:

git diff -C HEAD^^ HEAD

Résultat:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

D'ailleurs, si vous limitez votre diff à un seul chemin (comme vous le faites en git diff HEAD^^ HEAD a.txt vous n'êtes pas va jamais voir le renomme ou des copies parce que vous avez exclu le tout en dehors à partir d'un seul chemin d'accès et le renomme ou copies - par définition - associer les deux chemins.

88voto

Nolan Points 1347

Du diff sur un changement de nom d'un fichier spécifique, utilisez -M -- <old-path> <new-path> (-C marche aussi).

Donc, si vous avez à la fois renommé et modifié un fichier dans le dernier commit, vous pouvez voir les changements:

git diff HEAD^ HEAD -M -- a.txt test/a.txt

Ce produit:

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

(// a.txt lignes ajoutées à l'aide de git détecter le changement de nom)


Si git n'est pas détecter le changement de nom, vous pouvez spécifier un faible seuil de similarité avec -M[=n], disons 1%:

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

Depuis le git diff docs:

-M[<n>] - trouvez-renomme[=<n>]

Détecter les renomme. Si n est spécifié, il est un seuil sur l'indice de similarité (c'est à dire la quantité de ajout/suppressions par rapport à la taille du fichier). Par exemple, -M90% moyen Git doit envisager de supprimer/ajouter une paire à un changement de nom si plus de 90% du fichier n'a pas changé. Sans un % signe, le numéro est à lire comme un fraction, avec un point décimal avant. I. e., -M5 devient 0,5 et est ainsi le même que -M50%. De même, -M05 est le même que -M5%. Pour la limite de détection exacte renomme, utilisez -M100%. La valeur par défaut de similitude l'indice est de 50%.

-2voto

Dave G Points 4442

Utilisez le test git mv a.txt pour accomplir cette tâche, il renommera correctement l’objet auquel vous pourrez suivre l’historique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X