Récupère tous les fichiers qui ont été modifiés dans la branche git

209

Existe-t-il un moyen de voir quels fichiers ont changé dans une branche?

Raif
la source
2
Ce ne sont pas mes employés, ce sont mes collègues et ce n'est pas eux en particulier autant que les gens en général. Mais oui, en relisant ce post, cela semble un peu agro. :)
Raif
3
Pouvez-vous utiliser github ou bitbucket, gitlab? Il existe des outils pour gérer exactement cette situation. Le développeur fait une demande d'extraction. Vous obtenez la demande et vous aurez accès à une très bonne interface qui vous montrera un diff de toutes les modifications apportées à chaque fichier. Vous pouvez même commenter, demander des modifications, etc. Lorsque les modifications sont bonnes, vous pouvez accepter la demande qui fusionnera les modifications dans la branche demandée (généralement développée). C'est la meilleure façon de gérer cette situation.
Scott Wright

Réponses:

168

Une alternative à la réponse de @Marco Ponti, et en évitant le paiement:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Si votre shell particulier ne comprend pas la construction $ (), utilisez plutôt des ticks arrière.

Twalberg
la source
1
ah! c'est très amusant, maintenant que diriez-vous si je veux dire <notMainDev> être la branche actuelle sur laquelle je suis. qui n'est pas obligé de le préciser?
Raif
29
git diff --name-only <some-other-branch>vous montrera quels fichiers sont différents entre votre branche actuelle et <some-other-branch>. Il est donc essentiellement la même commande, mais notez que vous pouvez utiliser pour trouver les fichiers qui sont différents entre les deux branches, même si elles ne sont pas à distance liés. L'utilité ou non de cette comparaison dépend de la topologie de vos branches ... Notez également <some-other-branch>qu'il pourrait s'agir de n'importe quel commit, ou de tout ce qui se résout en un (tags, etc.).
twalberg
hmmm, eh bien, je suppose que ce que je veux dire, c'est que je voudrais faire git diff --nom uniquement <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) où MY_CURRENT_CO_BRANCH serait bien sûr ma branche actuelle extraite
Raif
Vous pouvez également le faire. Cela trouvera le point où <notMainDev>et <MY_CURRENT_CO_BRANCH>plus récemment avait un ancêtre commun, et se comparera <notMainDev>à cet ancêtre. Vous devrez cependant fournir le nom de votre branche actuelle, comme le git merge-baseprévoit deux arguments - il n'y a pas de raccourci, du moins dans la version actuelle.
twalberg
1
D'accord! J? ai compris. Avec l'aimable autorisation de mon collègue, quel est son nom. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' qui obtiendra le commit de la branche entre <notMainDev> et ma branche actuelle. Je peux alors faire git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif
147

Tout ce que vous avez à faire est le suivant:

git checkout <notMainDev>
git diff --name-only <mainDev>

Cela ne vous montrera que les noms de fichiers qui sont différents entre les deux branches.

Marco Ponti
la source
wow rapide et trop le point. Merci. btw j'aime git. c'est toujours rapide et
pertinent
23
Je pense que cela montrera également des choses qui ont changé <mainDev>depuis la divergence des branches. Vous voudrez peut-être utiliser à la git diff --name-only <sha-of-branch-point>place, ou voir la réponse alternative que j'ai publiée qui évite le paiement.
twalberg
Oui, c'est vrai @twalberg, il montrerait ces changements si les branches étaient divergentes. Je supposais que le notMainDevserait tenu à jour avec les commits mainDev ... Je trouve généralement utile de voir ces différences aussi bien.
Marco Ponti
ne pouvez-vous pas simplement spécifier --right-only pour afficher uniquement les fichiers qui ont été modifiés sur le côté droit?
TheZenker
vous obtenez le <sha-of-branch-point>avecgit rev-parse <branch-name>
fc9.30
69

étonné que cela n'ait pas été dit jusqu'à présent!

git diff master...branch

Donc, voyez les changements uniquement sur branch

Pour vérifier l'utilisation de la branche actuelle

git diff master...

Merci à jqr

C'est la main courte pour

git diff $(git merge-base master branch) branch

donc la base de fusion (le commit le plus récent entre les branches) et la pointe de branche

Utiliser également origin / master au lieu de simplement master aidera dans le cas où votre master local est daté

exussum
la source
4
Bien que cela montre ce qui a changé, il montre TOUS les changements, plutôt qu'un résumé des fichiers modifiés ... c'est ce qui m'a amené à cette page en premier lieu :)
Chris Rutledge
1
puis ajoutez le drapeau --name-only à cela. ou --short-stat
exussum
2
git diff --name-only master..si vous voulez juste les noms de fichiers différents entre les deux branches.
Adam
1
Cela ne fonctionnera pas correctement si votre maître a effectué des validations après avoir créé votre branche latérale.
simplylizz
2
@simplylizz oui c'est le cas. C'est exactement ce que cela résout
Exussum
45

Je ne peux pas croire qu'il y ait tant de façons de le faire. J'utilise ce qui a changé comme quelqu'un a déjà posté, juste avec les arguments suivants:

git whatchanged --name-only --pretty="" origin..HEAD

Cela répertorie simplement les noms de fichiers et uniquement ceux qui ont changé sur la branche actuelle.

lukiller
la source
3
Cela semble être la réponse la plus simple ici car elle ne nécessite aucune information supplémentaire. La sortie semble correcte et c'est beaucoup plus facile à retenir que la réponse acceptée!
RickMeasham
1
Merci, c'est intéressant, plus verbeux. Il fournit une sortie pour chaque commit, dans l'ordre inverse. git-whatchanged - Afficher les journaux avec la différence à chaque validation introduit git-scm.com/docs/git-whatchanged
nealmcb
Du git docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
21

J'ai vraiment aimé la réponse de @ twalberg mais je ne voulais pas avoir à taper le nom de la branche actuelle tout le temps. J'utilise donc ceci:

git diff --name-only $(git merge-base master HEAD)
Yep_It's_Me
la source
1
Votre solution fonctionne pour moi et j'obtiens la liste des fichiers que je m'attends à voir. Je suis un novice Git et j'ai utilisé git diff master... --name-onlylorsqu'il est exécuté sur la branche cible et obtenez le même résultat. Pourriez-vous avoir la gentillesse de fournir des commentaires sur ce qui est bon ou mauvais entre votre réponse et la commande que j'ai fournie?
Hungerstar
Votre commande fonctionnera exactement de la même manière, si master n'a pas de nouveau commit depuis la création de votre branche. Je pense que ma commande sera équivalente à git diff master.. --name-only(notez qu'il n'y a que 2 points au lieu de 3). Pour comprendre ce que signifient les points, consultez cette réponse
Yep_It's_Me
Impressionnant! Merci pour la réponse rapide et la perspicacité. Très appréciée.
Hungerstar
12

git whatchanged semble être une bonne alternative.

chalasr
la source
1
Qu'est-ce que je cherchais exactement.
Sild
Du git docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
9
git diff --name-only master...branch-name

auquel nous voulons comparer.

Rajesh Dusa
la source
Semble comme une partie d'une réponse existante, stackoverflow.com/a/41486181/11912
James Skemp
Cette variation compare la tête de maître à une branche actuelle. La réponse acceptée compare l'état du maître au point que vous avez bifurqué . L'un ou l'autre peut avoir la réponse que vous cherchez, selon ce que vous voulez savoir.
Mark Stosberg
8

Et si ça pouvait être aussi simple que ça?

git changed

Si vous êtes prêt à supposer que la branche principale est appelée "master" et que vous créez vos autres branches à partir de master, vous pouvez ajouter cet alias à votre ~/.gitconfigfichier pour le rendre aussi simple:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Ces hypothèses fonctionneront pour la plupart des gens dans la plupart des situations, mais vous devez savoir que vous les faites.

En outre, vous devez utiliser un shell qui prend en charge $(). Il est très probable que votre shell le supporte .

iconoclaste
la source
3
git show --stat origin/branch_name

Cela vous donnera une liste des fichiers qui ont été ajoutés ou modifiés sous cette branche.

Badari
la source
2
C'est faux, cela montre seulement les fichiers modifiés dans le commit principal de cette branche, pas la branche entière.
davidtbernal
2

Pour une raison quelconque, personne n'a mentionné git-tree. Voir https://stackoverflow.com/a/424142/1657819

git-treeest préféré car c'est une plomberie commande de ; censé être programmatique (et, probablement, plus rapide)

(en supposant que la branche de base est master)

git diff-tree --no-commit-id --name-only -r master..branch-name

Cependant, cela vous montrera tous les fichiers qui ont été affectés dans la branche, si vous voulez voir uniquement les fichiers modifiés explicitement , vous pouvez utiliser --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

On peut également utiliser --name-statusau lieu de --name-onlypour voir l'état des fichiers ( A/ M/ Det ainsi de suite)

Le parrain
la source
C'était exactement ce dont j'avais besoin pour peloter les fichiers modifiés tout en excluant ceux qui avaient été supprimés. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel
1

La réponse acceptée - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- est très proche, mais j'ai remarqué que le statut était incorrect pour les suppressions. J'ai ajouté un fichier dans une branche, et pourtant cette commande (en utilisant --name-status) a donné au fichier j'ai supprimé le statut "A" et le fichier j'ai ajouté le statut "D".

J'ai dû utiliser cette commande à la place:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)
Connor Clark
la source
0

En étendant ce que @twalberg et @iconoclast avaient, si vous utilisez cmd pour une raison quelconque, vous pouvez utiliser:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y
Lunyx
la source
0

Le fichier de commandes suivant est basé sur la réponse de twalberg mais fonctionnera sous Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

Ce qui précède suppose que la branche principale est origin / master et que git bash a été inclus lors de l'installation de Git (et que son emplacement est dans l'environnement de chemin). J'avais en fait besoin de montrer les différences réelles en utilisant un outil de configuration configuré (kdiff3), j'ai donc remplacé la commande bash suivante ci-dessus:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"
Steve Chambers
la source
0

J'utilise grep donc je n'ai que les lignes avec diff --git qui sont le chemin des fichiers:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
T04435
la source