J'ai un dossier a.txt
.
cat a.txt
> hello
Le contenu de a.txt
est "bonjour".
Je fais un engagement.
git add a.txt
git commit -m "first commit"
Je passe ensuite a.txt
dans un test
dir.
mkdir test
mv a.txt test
Je fais alors mon deuxième commit.
git add -A
git commit -m "second commit"
Enfin, je modifie a.txt
pour dire "au revoir" à la place.
cat a.txt
> goodbye
Je fais mon dernier engagement.
git add a.txt
git commit -m "final commit"
Voici maintenant ma question:
Comment est-ce que je diffère le contenu a.txt
entre mon dernier commit et mon premier commit?
J'ai essayé:,
git diff HEAD^^..HEAD -M a.txt
mais cela n'a pas fonctionné. git log --follow a.txt
détecte correctement le changement de nom, mais je ne trouve pas d'équivalent pour git diff
. Est-ce qu'il y a un?
Réponses:
Le problème avec la différence entre
HEAD^^
etHEAD
est que vous avez una.txt
dans les deux commits, donc juste en considérant ces deux commits (ce que fait diff), il n'y a pas de changement de nom, il y a une copie et un changement.Pour détecter les copies, vous pouvez utiliser
-C
:Résultat:
Incidemment, si vous limitez votre diff à un seul chemin (comme vous le faites dans,
git diff HEAD^^ HEAD a.txt
vous n'allez jamais voir les renommages ou les copies parce que vous avez tout exclu d'un seul chemin et que les renommages ou les copies - par définition - impliquent deux chemins.la source
-- <old-path> <new-path>
... voir ma réponse.git show -C [commit]
et il a reconnu le fichier renommé et m'a montré le diffèrent entre les fichiers. Parfait.Pour différencier le changement de nom d'un fichier spécifique, utilisez
-M -- <old-path> <new-path>
(-C
fonctionne également).Donc, si vous avez à la fois renommé et modifié un fichier lors du dernier commit, vous pouvez voir les changements avec:
Cela produit:
(
// a.txt
lignes ajoutées pour aider git à détecter le changement de nom)Si git ne détecte pas le changement de nom, vous pouvez spécifier un seuil de similitude faible avec
-M[=n]
, disons 1%:À partir de la documentation git diff :
la source
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Vous pouvez également faire:
git diff rev1:file1 rev2:file2
qui, pour votre exemple, serait
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Notez l'explicite
./
- ce format suppose sinon que les chemins sont relatifs à la racine du dépôt. (Si vous êtes à la racine du repo, vous pouvez bien sûr l'omettre.)Cela ne dépend pas du tout de la détection de changement de nom, car l'utilisateur indique explicitement ce qu'il faut comparer. (Par conséquent, il est également utile dans d'autres circonstances, telles que la comparaison de fichiers entre différentes branches svn dans un environnement git-svn.)
la source
Si votre validation de changement de nom est préparée mais pas encore validée, vous pouvez utiliser:
la source