git avant / arrière info entre le maître et la branche?

201

J'ai créé une branche pour les tests dans mon repo ( test-branch) local vers lequel j'ai poussé Github.

Si je vais sur mon Githubcompte et le sélectionne, test-branchil affiche les informations:

This branch is 1 commit ahead and 2 commits behind master

Mes questions sont:

  1. Comment puis-je afficher ces informations localement (c'est-à-dire: une commande qui les affiche sur le terminal, plutôt que d'avoir à les ouvrir Githubpour les voir)?
  2. Je sais que je peux voir les différences entre les branches en utilisant:

    git diff master..test-branch
    

    ou en utilisant Meld(que je préfère):

    git difftool master..test-branch
    

    mais je me demandais s'il y avait un moyen de voir les engagements avant et arrière séparément. IE: existe-t-il un moyen de montrer que 1 s'engage à l'avance par lui-même, puis que ces 2 s'engagent derrière eux-mêmes?

Gabriel
la source
1
Git 2.5+ (Q2 2015) sera présenté git for-each-ref --format="%(push:track)" refs/heads. Voir ma réponse ci
VonC
1
Parce que je n'ai pas pu trouver cette question en utilisant les mots-clés que je m'apprête à écrire, je veux juste noter que cela revient à prendre le complément relatif (ou "set difference") entre les ensembles de commits qui composent ces branches (et puis comptage des éléments). Espérons que cela en fasse des index de moteurs de recherche.
pmos

Réponses:

309

Voici une astuce que j'ai trouvée pour comparer deux branches et montrer combien de validations chaque branche est en avance sur l'autre (une réponse plus générale à votre question 1):

Pour les succursales locales : git rev-list --left-right --count master...test-branch

Pour les succursales éloignées : git rev-list --left-right --count origin/master...origin/test-branch

Cela donne une sortie comme celle-ci:

1 7

Cette sortie signifie: "Par rapport à master, test-branchest 7 commits en avance et 1 commit en arrière."

Vous pouvez également comparer les succursales locales avec les succursales distantes, par exemple origin/master...masterpour savoir combien de validations la mastersuccursale locale est devant / derrière sa contrepartie distante.

user1834095
la source
1
C'est une excellente solution pour moi de savoir si je peux supprimer une branche ou si elle est encore en avance sur le développement.
Maverick1st
1
@ Maverick1st, oui, cette commande est particulièrement utile lorsque vous suivez le workflow gitflow (que je suis)
user1834095
2
C'est le meilleur pour mon cas d'utilisation de trouver si votre branche de fonctionnalité actuelle est derrière le maître distant ( git rev-list --left-right --count origin/master...@) - à condition que l'utilisateur le fasse git fetchavant; utile pour empêcher les demandes d'extraction de branches obsolètes.
jakub.g
9
Pour vérifier combien de commits se git rev-list --left-right --count origin/master...@ | cut -f1
trouvent
8
@ jakub.g vous n'avez pas besoin de couper si vous utilisez --left-onlyou--right-only
jasonkarns
39

Tout d'abord pour voir combien de révisions vous êtes en retard localement, vous devriez faire un git fetchpour vous assurer que vous avez les dernières informations de votre télécommande.

La sortie par défaut de git statusvous indique combien de révisions vous êtes en avance ou en retard, mais généralement je trouve cela trop détaillé:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Je préfère git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

En fait, je l'alias simplement git s, et c'est la commande principale que j'utilise pour vérifier l'état.

Pour voir la différence dans les "révisions à venir" de master, je peux exclure les "révisions à venir " deorigin/master :

git diff master..origin/master^

Pour voir la différence dans les "révisions" de origin/master, je peux exclure les "révisions" de master:

git diff origin/master..master^^

S'il y a 5 révisions devant ou derrière, il pourrait être plus facile d'écrire comme ceci:

git diff master..origin/master~5
git diff origin/master..master~5

METTRE À JOUR

Pour voir les révisions avant / arrière, la branche doit être configurée pour suivre une autre branche. Pour moi, c'est le comportement par défaut lorsque je clone un référentiel distant et après avoir poussé une branche avec git push -u remotename branchname. Ma version est la 1.8.4.3, mais ça fonctionne comme ça depuis aussi longtemps que je me souvienne.

Depuis la version 1.8, vous pouvez définir la branche de suivi comme ceci:

git branch --track test-branch

Depuis la version 1.7, la syntaxe était différente:

git branch --set-upstream test-branch
janos
la source
Quelle version gitutilisez-vous? Je ne peux pas reproduire ce que vous obtenez avec ou git statusavec git status -sb. Si j'essaie l'une ou l'autre des commandes (après l'avoir fait git fetch), je n'obtiens aucune information sur les validations avant / arrière.
Gabriel
8
Votre façon de voir commits avant et en arrière est appliquée masteret origin/masterje veux voir les diffs pour masteret une autre branche test-branch. Pourriez-vous reformater votre réponse pour résoudre ce problème?
Gabriel
La différence dans les révisions "derrière" et "avant" ne fonctionne pour moi que si j'utilise 3 points entre les noms de branche (pas 2). Et les ^ et ^^ ne semblaient pas avoir d'importance ici Par exemple: git diff master ... origin / master git diff origin / master ... master Quoi qu'il en soit, "git status -sb" était très utile.
Vituel
10

Avec Git 2.5+, vous avez maintenant une autre option pour voir en avant / en arrière pour toutes les branches qui sont configurées pour pousser vers une branche.

git for-each-ref --format="%(push:track)" refs/heads

En savoir plus sur " Affichage des validations Git non poussées "

VonC
la source
Pourriez-vous le faire uniquement pour la branche actuelle et sa branche de suivi à distance?
spex
@spex yes: complet refs/headsavec le nom de la branche actuelle ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Vous pouvez également utiliser awkpour le rendre un peu plus joli:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Vous pouvez même créer un alias qui récupère toujours l'origine en premier, puis compare les branches

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
la source
1

Après avoir effectué une extraction git, vous pouvez exécuter l'état git pour afficher le nombre de validations de la branche locale devant ou derrière la version distante de la branche.

Cela ne vous montrera cependant pas combien de validations il est devant ou derrière une branche différente. Vos options sont le diff complet, en regardant github, ou en utilisant une solution comme Vimhsa liée ci-dessus: Statut Git sur tous les repo

Wade Williams
la source