Comment obtenir les modifications sur une branche dans Git

266

Quelle est la meilleure façon d'obtenir un journal des validations sur une branche depuis le moment où elle a été branchée à partir de la branche actuelle? Jusqu'à présent, ma solution est la suivante:

git log $(git merge-base HEAD branch)..branch

La documentation de git-diff indique que git diff A...Bc'est équivalent à git diff $(git-merge-base A B) B. D'un autre côté, la documentation de git-rev-parse indique qu'elle r1...r2est définie comme r1 r2 --not $(git merge-base --all r1 r2).

Pourquoi sont-ils différents? Notez que cela git diff HEAD...branchme donne les différences que je veux, mais la commande git log correspondante me donne plus que ce que je veux.

En images, supposons ceci:

         x --- y --- z --- branche
        /
--- a --- b --- c --- d --- e --- TETE

Je voudrais obtenir un journal contenant les commits x, y, z.

  • git diff HEAD...branch donne ces commits
  • cependant, git log HEAD...branchdonne x, y, z, c, d, e.
Greg Hewgill
la source
Vous utilisez "git log" de manière incorrecte à vos fins d'après ce que je peux voir. J'ai ajouté ma réponse ci-dessous.
PlagueHammer

Réponses:

187

Dans le contexte d'une liste de révision, voici A...Bcomment la git-rev-parsedéfinit. git-log prend une liste de révision. git-diffne prend pas de liste de révisions - il prend une ou deux révisions et a défini la A...Bsyntaxe pour signifier comment elle est définie dans la git-diffpage de manuel. Si elle git-diffn'était pas explicitement définie A...B, cette syntaxe serait invalide. Notez que la git-rev-parsepage de manuel décrit A...Bdans la section "Spécification des plages" et que tout dans cette section n'est valide que dans les situations où une plage de révision est valide (c'est-à-dire lorsqu'une liste de révision est souhaitée).

Pour obtenir un journal contenant uniquement x, y et z, essayez git log HEAD..branch(deux points, pas trois). Ceci est identique à git log branch --not HEAD, et signifie que tous les commits sur une branche qui ne sont pas sur HEAD.

Lily Ballard
la source
31
Wow, c'est déroutant. Il s'avère que l'utilisation de "git diff HEAD..branch" affiche tous les commits (x, y, z, c, d, e), mais "git log HEAD..branch" fait exactement ce que je veux et n'affiche que x, y , z! C'est exactement le contraire de l'utilisation de "...".
Greg Hewgill
22
git diff HEAD..branchest identique à git diff HEAD branch. L'essentiel à retenir ici est que le journal prend une liste / plage de révisions, contrairement à diff. C'est pourquoi ils traitent leurs arguments différemment.
Lily Ballard
4
Semble que git diff HEAD...branch(trois points) correspond à la sortie degit log HEAD..branch
jchook
72
git cherry branch [newbranch]

fait exactement ce que vous demandez, lorsque vous êtes dans la mastersuccursale.

J'aime aussi beaucoup:

git diff --name-status branch [newbranch]

Ce qui n'est pas exactement ce que vous demandez, mais est toujours très utile dans le même contexte.

skiphoppy
la source
8
'git cherry' affiche une liste d'ID de validation. Puis-je les convertir en un seul diff combinant toutes les modifications dans chaque commit?
Jonathan Hartley
1
git cherryest très utile en effet. Merci :)
jkp
2
@JonathanHartley Prenez la première et la dernière comme des cartes d' identité et les commettre jeté à gif-diff: git diff x..zou pour mon propre exemple , il est git diff 13bc4d..8eda3a.
towi
3
Il est difficile de comprendre quel code doit être remplacé dans votre commande car dans lequel branche ou newbranch est un mot clé et qui doit être remplacé par un nom de branche personnalisé
pal4life
37

Ce que vous voulez voir, c'est la liste des validations sortantes. Vous pouvez le faire en utilisant

git log master..branchName 

ou

git log master..branchName --oneline

Où je suppose que "branchName" a été créé en tant que branche de suivi de "master".

De même, pour voir les modifications entrantes, vous pouvez utiliser:

git log branchName..master
PlagueHammer
la source
1
@ABB, si branchName est omis, sa valeur par défaut est "head", qui est en fait branchName dans l'exemple ci-dessus.
PlagueHammer
25

Ceci est similaire à la réponse que j'ai postée sur: Aperçu d'un push Git

Déposez ces fonctions dans votre profil Bash:

  • gbout - branche git sortante
  • gbin - git branch entrant

Vous pouvez utiliser ceci comme:

  • Si sur master: gbin branch1 <- cela vous montrera ce qui est dans branch1 et pas dans master
  • Si sur le maître: gbout branch1 <- cela vous montrera ce qui est dans le maître qui n'est pas dans la branche 1

Cela fonctionnera avec n'importe quelle branche.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
Clintm
la source
16

Semblable à plusieurs réponses comme Alex V et NDavis, mais aucune d'entre elles n'est tout à fait la même.

Déjà dans la branche en question

En utilisant:

git diff master...

Qui combine plusieurs fonctionnalités:

  • c'est super court
  • montre les changements réels

Mettre à jour:

Cela devrait probablement être le cas git diff master, mais cela montre aussi le diff, pas les commits comme la question spécifiée.

Michael Durrant
la source
2
Si vous l'avez git co master; git pulldepuis que vous avez créé la branche, git diff masteril ne sera pas très utile d'obtenir les différences introduites UNIQUEMENT par des validations dans la branche spécifiée.
guival
1
Ou pour spécifier explicitement les branches: git diff <branch1>...<branch2>affichera les changements introduits par branch2.
Alex
10

Ajoutez un -p pour voir des changements de fichiers

git log -p master..branch

Faites quelques alias:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Voir les engagements uniques d'une succursale:

gbl
Alex V
la source
6

Pour voir le journal de la branche actuelle depuis la dérivation du maître:

git log master...

Si vous êtes actuellement sur le maître, pour voir le journal d'une branche différente depuis qu'il a dérivé du maître:

git log ...other-branch

NDavis
la source
4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) mais parfois il montre '+' au lieu de '='

nopsoft
la source
3 points montre le premier commit sur la branche deux fois alors que deux ne le font pas.
TJ Biddle
2

j'ai trouvé

git diff <branch_with_changes> <branch_to_compare_to>

plus utile, car vous obtenez non seulement les messages de commit, mais l'ensemble du diff. Si vous êtes déjà sur la branche dont vous souhaitez voir les modifications et (par exemple) pour voir ce qui a changé pour le maître, vous pouvez utiliser:

git diff HEAD master
Dominik Ehrenberg
la source