Comment puis-je voir les différences de validation entre les branches dans git?

341

Je suis sur la branche X et j'ai ajouté quelques commits supplémentaires. Je veux voir toutes les différences entre MASTER et la branche sur laquelle je suis en termes de commits. Je pourrais juste faire un

git checkout master
git log

puis un

git checkout branch-X
git log

et diff visuellement ceux-ci, mais j'espère une méthode plus facile et moins sujette aux erreurs.

Avery
la source

Réponses:

324

Vous pouvez obtenir une sortie visuelle très agréable de la façon dont vos branches diffèrent avec ceci

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X
à M
la source
13
Cela ne vous montrera pas les différences entre les branches, mais c'est ce qui est demandé.
Pablo Fernandez talon crochet
48
git log --oneline --graph --all --decorate --abbrev-commitvous donnera une sortie similaire dans une commande plus courte / plus lisible
talon crochet Pablo Fernandez
4
J'aime ça:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery
6
Extrêmement compliqué.
Shawn Erquhart
12
git log --oneline --graph --all --decorateest suffisant, --abbrev-commitn'est pas requis, --onelineest l'abréviation de--pretty=oneline --abbrev-commit
avmohan
722

Vous pouvez facilement le faire avec

git log master..branch-X

Cela vous montrera que la branche X a un commit mais pas le master.

Crochet talon Pablo Fernandez
la source
9
Existe-t-il une option si les deux branches contiennent des commits que l'autre ne contient pas? À l'heure actuelle, vous devez retourner les arguments et l'exécuter dans les deux sens pour voir les validations que l'autre branche ne contient pas.
Elliott Slaughter
38
Si vous êtes déjà passé à, branch-Xvous pouvez utilisergit log master..
Dave
8
@ElliottSlaughter: Si vous voulez trouver des commit qui sont soit dans master soit dans branch-X mais pas les deux, vous pouvez utiliser git log master...branch-X(trois points au lieu de deux). Voir man gitrevisionspour plus d'informations.
Xavier T.
3
Ce n'est vraiment que la moitié de la réponse. Tout commit dans master qui fait diverger les branches
n'apparaîtra
9
Si les commits ont été sélectionnés à partir de la branche-X pour les maîtriser, cela ne les filtrera pas. Ils seront toujours sur la liste des commits "Dans la branche X mais pas sur le maître" même s'ils sont en fait dans les deux ..
Tuffwer
88

Je pense que c'est une question de choix et de contexte. Je préfère utiliser

git log origin/master..origin/develop --oneline --no-merges

Il affichera les validations dans develop qui ne sont pas dans la branche master.

Si vous voulez voir quels fichiers sont réellement modifiés, utilisez

git diff --stat origin/master..origin/develop --no-merges

Si vous ne spécifiez pas d'arguments, il affichera le diff complet. Si vous voulez voir des différences visuelles, installez meldsur Linux ou WinMergesur Windows. Assurez-vous que ce sont les outils diff par défaut. Ensuite, utilisez quelque chose comme

git difftool -y origin/master..origin/develop --no-merges

Dans le cas où vous souhaitez le comparer avec la branche actuelle. Il est plus pratique d'utiliser HEAD au lieu du nom de branche comme use:

git fetch
git log origin/master..HEAD --oneline --no-merges

Il vous montrera tous les commits, sur le point d'être fusionnés

zainengineer
la source
1
Si vous comparez une branche de publication qui pourrait avoir des fusions. Vous aimerez peut-être supprimer les commits de fusion (qui n'ajoutent aucune valeur) à l'aide des --no-mergesgit log origin/master..HEAD --oneline --no-merges
paramètres
15

Si vous êtes sous Linux, gitgc'est le chemin à parcourir pour le faire très rapidement et graphiquement.

Si vous insistez sur la ligne de commande, vous pouvez utiliser:

git log --oneline --decorate

Pour rendre git logplus agréable par défaut, je règle généralement ces préférences globales:

git config --global log.decorate true
git config --global log.abbrevCommit true
mvp
la source
14

Je suggère ce qui suit pour voir la différence "dans les commits". Pour une différence symétrique, répétez la commande avec des arguments inversés:

git cherry -v master [your branch, or HEAD as default]
mmaruska
la source
Est-ce différent de git master..branch-X?
ilmirons
2
Bien sûr, "git cherry" est intelligent: il se traduit par "commits" en "patches / diffs" et peut éviter de signaler un "patch" qui est sur les deux branches mais appliqué dans un ordre différent.
mmaruska
8

si vous souhaitez utiliser gitk:

gitk master..branch-X

il a une belle GUI old school

snowcamel
la source
4

Pas la réponse parfaite mais fonctionne mieux pour les personnes utilisant Github:

entrez la description de l'image ici

Accédez à votre repo: Insights -> Network

AIon
la source
En outre, la création d'une demande d'extraction affichera également les différences de branche.
pkamb
OMG, je veux te faire un câlin.
esseara
@esseara Je suis aussi un gros câlin :)) Vous êtes les bienvenus: D
AIon
2

Si vous souhaitez comparer en fonction des messages de validation, vous pouvez effectuer les opérations suivantes:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)
Maroun
la source
1
Au lieu d'utiliser --onelineet de la tuyauterie, cutvous pouvez utilisergit log --format='%s'
opticyclic
0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Contribuer à cela car il permet de différer visuellement les journaux a et b, côte à côte, si vous avez un outil de diff visuel. Remplacez la commande diff à la fin par la commande pour démarrer l'outil de diff visuel.

Kim Briggs
la source
0

J'ai utilisé certaines des réponses et trouvé celle qui correspond à mon cas (assurez-vous que toutes les tâches sont dans la branche de publication).

D'autres méthodes fonctionnent également mais j'ai trouvé qu'elles pourraient ajouter des lignes dont je n'ai pas besoin, comme les commits de fusion qui n'ajoutent aucune valeur.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

ou vous pouvez comparer votre courant avec le maître

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch est là pour vous assurer que vous utilisez les informations mises à jour.

De cette façon, chaque commit sera sur une ligne et vous pouvez copier / coller cela dans un éditeur de texte et commencer à comparer les tâches avec les commits qui seront fusionnés.

claudiu.f.marginean
la source