2010-06-29 8 views

Répondre

41

C'est le meilleur que je pouvais venir avec:

git log --name-only --pretty=oneline --full-index HEAD^^..HEAD | grep -vE '^[0-9a-f]{40} ' | sort | uniq 

Remplacer HEAD ^^ et la tête avec les commits que vous souhaitez comparer.

Ma tentative utilise git log avec --name-only pour lister tous les fichiers de chaque validation entre ceux spécifiés. --pretty=oneline fait que la partie au-dessus de la liste de fichiers se compose uniquement du SHA de validation et du titre du message. --full-index fait au SHA les 40 caractères complets. grep filtre tout ce qui ressemble à un SHA suivi d'un espace. Sauf si vous avez des fichiers commençant par un SHA suivi d'un espace, le résultat devrait être précis.

+0

Quand je lance cette commande contre HEAD^et la tête, je reçois une liste de ce qui ressemble chaque fichier dans le référentiel; même ceux qui n'ont pas changé. –

+0

Mon mauvais, le format est " .. " au lieu de "". – igorw

+0

Merci, un peu gênant mais ça ira. – Andrew

27

Je pense que cette commande est votre réponse:

git diff --stat abc123 xyz123 #where abc123 and xyz123 are SHA1 hashes of commit objects 

droite de la git community book

Si vous ne voulez pas voir l'ensemble patch, vous pouvez ajouter le « --stat » option, qui limitera la sortie aux fichiers qui ont changé avec un petit graphique texte indiquant combien de lignes ont changé dans chaque fichier.

+2

Plus précisément, 'git diff --stat '. –

+3

Non, ce n'est pas exactement ce qu'il voulait. Git diff fait un diff direct entre les arbres, il ne considère pas les commits. Si vous créez un nouveau fichier avec le contenu "A", changez le contenu en "B", puis changez-les en "A", "git diff --stat HEAD ^^ HEAD" vous donnera une sortie vide. – igorw

+2

'git diff --name-only' est probablement meilleur que' git diff --stat' mais comme souligné, 'git diff' ne fait pas ce que l'OP voulait. – nnutter

1

Celui-ci est similaire à igorw « s, mais elle évite la suppression du CSA via grep:

git log --pretty='format:' --name-only HEAD^^..HEAD | sort -u 

Si vous voulez plus de voir comment les fichiers ont été modifiés, remplacer --name-only avec --name-status.

+0

Je viens de tester cette commande. Il a fallu environ 10 secondes pour traiter puis a commencé à cracher une énorme liste de fichiers. –

+0

@ ostler.c: Avez-vous passé dans la plage de révision dans '" $ @ "'? Sinon, cela montrera les changements existants, ce qui est beaucoup :-) J'ai révisé ma réponse pour utiliser un exemple, comme dans les autres réponses. –

+0

D'accord, cela a du sens. Je suis surpris que je ne connaissais pas "$ @". Bien que, je ne le trouve pas très utile pour la plupart des commandes. –

4

Si vous voulez juste voir les noms de fichiers où commettent b est chronologiquement après a:

git diff <a commit sha1>...<b commit sha2> --name-only # b is after a in time 

Si vous voulez voir tous les noms de fichiers et ce qui a changé de commettre un à commettre b puis déposez la dernière argument.

git diff <a commit sha1>...<b commit sha2> # shows file names and what changed in each file 

Un exemple de <commit sha1> sont les commettras id comme 675ee6860d2c273bcc6c6a0536634a107e2a3d9f. En règle générale, les 8 à 10 premiers chiffres fonctionneront sur la plupart des projets, mais peuvent nécessiter davantage si le projet comporte des tas de validations. Typiquement, j'utilise la sortie de l'ID de git log --oneline. Lorsque vous obtenez une différence de a ... b et b est plus tard que dans le temps, il est facile de voir ce qui a été changé dans chaque fichier chronologiquement.

1

Je voudrais utiliser; prendre les 8 premiers du hash de commit. Si vous vouliez vous redirigez pourrait dans un fichier selon le ci-dessous:

git log 12345678..87654321 > C:\GitChanges.txt 
Questions connexes