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:
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}')
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é
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:
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:
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.
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.
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:
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:
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".
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:
Réponses:
Une alternative à la réponse de @Marco Ponti, et en évitant le paiement:
Si votre shell particulier ne comprend pas la construction $ (), utilisez plutôt des ticks arrière.
la source
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.).<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 legit merge-base
prévoit deux arguments - il n'y a pas de raccourci, du moins dans la version actuelle.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}'
)Tout ce que vous avez à faire est le suivant:
Cela ne vous montrera que les noms de fichiers qui sont différents entre les deux branches.
la source
<mainDev>
depuis la divergence des branches. Vous voudrez peut-être utiliser à lagit diff --name-only <sha-of-branch-point>
place, ou voir la réponse alternative que j'ai publiée qui évite le paiement.notMainDev
serait tenu à jour avec les commits mainDev ... Je trouve généralement utile de voir ces différences aussi bien.<sha-of-branch-point>
avecgit rev-parse <branch-name>
étonné que cela n'ait pas été dit jusqu'à présent!
Donc, voyez les changements uniquement sur
branch
Pour vérifier l'utilisation de la branche actuelle
Merci à jqr
C'est la main courte pour
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é
la source
git diff --name-only master..
si vous voulez juste les noms de fichiers différents entre les deux branches.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:
Cela répertorie simplement les noms de fichiers et uniquement ceux qui ont changé sur la branche actuelle.
la source
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.
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:
la source
git diff master... --name-only
lorsqu'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?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éponsegit whatchanged
semble être une bonne alternative.la source
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.
auquel nous voulons comparer.
la source
Et si ça pouvait être aussi simple que ça?
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
~/.gitconfig
fichier pour le rendre aussi simple: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 .la source
Cela vous donnera une liste des fichiers qui ont été ajoutés ou modifiés sous cette branche.
la source
Pour une raison quelconque, personne n'a mentionné
git-tree
. Voir https://stackoverflow.com/a/424142/1657819git-tree
est 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
)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
:On peut également utiliser
--name-status
au lieu de--name-only
pour voir l'état des fichiers (A
/M
/D
et ainsi de suite)la source
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
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:
la source
En étendant ce que @twalberg et @iconoclast avaient, si vous utilisez cmd pour une raison quelconque, vous pouvez utiliser:
la source
Le fichier de commandes suivant est basé sur la réponse de twalberg mais fonctionnera sous Windows:
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:
la source
J'utilise grep donc je n'ai que les lignes avec diff --git qui sont le chemin des fichiers:
la source