Affichage des validations Git non poussées

1752

Comment puis-je afficher les validations locales que j'ai effectuées et qui n'ont pas encore été transférées vers le référentiel distant? Occasionnellement, git statusimprimera que ma branche est X s'engage avant origin/master, mais pas toujours.

Est-ce un bug avec mon installation de Git, ou est-ce que je manque quelque chose?

Josh Buhler
la source
18
À partir de Git 2.5+ (T2 2015), la vraie réponse serait git log @{push}... Voir ce nouveau raccourci @{push}(référençant la branche de suivi à distance vers laquelle vous
poussez
59
@Torek - encore une autre tâche simple rendue difficile par Git. Chaque fois qu'une question Git apparaît avec des centaines ou des milliers de votes positifs et des millions de vues, alors quelqu'un devrait penser: Wow, nous avons vraiment foiré ce flux de travail. Hélas, les développeurs Git ont omis l'étape de rétroaction dans le cycle de vie du développement, de sorte que la rétroaction n'est pas incorporée. Au lieu de cela, ils continuent de faire les mêmes erreurs encore et encore. Pour cette question, git status --allaurait dû apparaître en 2010; ou git status -vdevrait en fait fournir la sortie détaillée qui inclut les informations supplémentaires.
2016 à 19h32
4
Je ne suis pas d'accord que "git status -v" devrait fournir ces informations car il est destiné à donner un statut sur l'arbre de travail, car il ne concerne que la branche extraite. Cependant, voir la réponse ci-dessous à propos de "git branch -v", qui je pense devrait être la réponse acceptée
JoelFan
13
Cette question StackOverflow particulière a le plus grand nombre de réponses correctes, mais toutes n'ont aucun sens.
Pete Alvin
@ josh-buhler Désolé, j'ai voté contre accidentellement ... alors que j'essayais de cliquer sur "STAR". Re-tenté d'augmenter le vote, mais, n'a pas fonctionné!
RafiAlhamd

Réponses:

1828
git log origin/master..HEAD

Vous pouvez également afficher le diff en utilisant la même syntaxe

git diff origin/master..HEAD
Peter B
la source
3
Cela l'a fait pour moi - pour une raison quelconque, l'origine du journal git .. en elle-même lançait une erreur. Il semble que j'ai également eu un problème avec la façon dont ma succursale locale a été configurée - une fois que j'ai apporté les modifications que j'ai trouvées ici: wincent.com/blog/…… le problème a été résolu et je pouvais utiliser à nouveau git status pour voir ce que je voulais .
Josh Buhler
6
Invaluable: Tellement que je l'ai fait git config --global alias.ahead "log origin/master..HEAD --oneline"pour pouvoir rapidement trouver où je suis. Encore plus de bonbons:for i in *; do echo $i && git ahead 2>/dev/null; done
Jamie
15
git log --stat origin/master..HEADpour un peu de génialité supplémentaire
Cory Danielson
141
Ce n'est pas la meilleure solution. L'origine / maître peut ne pas toujours être la branche en amont. Une meilleure solution consiste à utiliser @ {u} au lieu de "origin / master" pour indiquer la branche en amont. Puisque HEAD est implicite par défaut, on peut aussi laisser cela de côté. Voir la réponse de @Ben Ling. Modifications sortantes: git log @ {u} .. Modifications entrantes: git log .. @ {u}
PlagueHammer
12
@Nocturne Je veux juste souligner que lorsque cette réponse a été publiée, la @{u}syntaxe n'était pas encore disponible, elle n'est devenue disponible que le 12 février 2010 . De plus, @{u}ne fonctionnera pas si la branche locale n'est pas configurée avec un amont. Enfin, la @{u}prise en charge <remote>/<branch>de la tabulation n'est pas actuellement prise en charge, la complétion de la tabulation reste l'un des moyens les plus rapides d'obtenir ces informations, et cela fonctionnera si un amont est configuré ou non.
703

Si vous voulez voir tous les commits sur toutes les branches qui ne sont pas encore poussées, vous cherchez peut-être quelque chose comme ceci:

git log --branches --not --remotes

Et si vous voulez seulement voir le commit le plus récent sur chaque branche, et les noms de branche, ceci:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
cxreg
la source
8
C'est génial. Dans un scénario similaire, j'avais deux succursales locales avec deux succursales en amont, et une main locale a été fusionnée dans l'autre. Je voulais savoir quels commits étaient sûrs pour rebaser, mais la normale git log master..HEADne fonctionnerait pas car il y avait plusieurs amonts. Ce post m'a amené git log MyBranch --not --remotesà montrer tous les commits qui n'ont été poussés vers aucun amont en une seule branche.
pavon
C'était tellement utile que je l'ai aliasé dans ma configuration zsh. Merci.
Scotty C.
Je comprends que votre deuxième commande répertorie également les validations qui ne sont pas encore poussées, mais elle n'en affiche qu'une par branche.
Stephane
--decoratemontre également les branches. --graphle rend encore plus évident.
Ray
Notez que ces commandes listent uniquement les validations qui n'ont été poussées dans aucune branche. Exemple: supposons que vous développiez une branche avec la branche feat-NewThing. Vous apportez des modifications localement à feat-NewThing. (Le journal a des changements.) Vous poussez ensuite feat-newThing vers sa branche distante. (Le journal est vide). Vous fusionnez local feat-newThing pour développer localement. En supposant une avance rapide, le journal n'a toujours aucun changement.
Patrick W
325

Vous pouvez afficher tous les commits que vous avez localement mais pas en amont avec

git log @{u}..

@{u}ou @{upstream}désigne la branche amont de la branche actuelle (voir git rev-parse --helpou git help revisionspour plus de détails).

Ben Lings
la source
17
Sous Windows, je devais mettre l'argument final entre guillemets, comme: git log "@ {u} .."
Jon Schneider
git log @{u}.. -p Une des options les plus utiles est -p , qui montre les différences introduites dans chaque confirmation.
mQuiroz
Peut-être mieux git log @ {push} .., voir une autre réponse .
Hans-Peter Störr
183

Cela a fonctionné pour moi:

git cherry -v 

Comme indiqué chez Git: Voir tous les commits non poussés ou les commits qui ne sont pas dans une autre branche .

Christian Vielma
la source
21
Je pense que cela devrait être la réponse principale car celle-ci donne la liste la plus succincte des commits au lieu de, difficile à lire, la différence verbeuse dans tous les fichiers !!
ViFI
1
git-cherry - "Find commits encore à appliquer en amont", semble fournir ce que l'OP demandait, mais avec seulement un sujet de commit plutôt que le message de commit entier.
Eido95
2
Il convient de noter que cela ne vous indiquera que s'il y a des validations non poussées sur la branche que vous avez actuellement extraite. Il ne vous dira pas si vous avez une branche locale (non actuellement extraite) avec des validations non poussées.
Dave Yarwood
66

Vous pouvez le faire avec git log:

git log origin..

En supposant que originc'est le nom de votre amont, en laissant tout nom de révision après ..implique HEAD, qui répertorie les nouveaux commits qui n'ont pas été poussés.

Greg Hewgill
la source
1
Chaque fois que je vois une réponse avec git loget "2 points pas 3", cela me rappelle toujours stackoverflow.com/questions/53569/… ;)
VonC
1
Juste pour l'ajouter à la réponse - s'il n'y a pas de configuration en amont, cette commande a pour résultat de dire qu'aucune configuration en amont n'a été configurée. Exécutez la git branch --set-upstream master origin/<branch>configuration en amont si vous êtes enclin à utiliser cette commande pour voir les validations qui sont organisées.
asyncwait
Cela se comparera à la branche par défaut d'origine, pas à la branche distante actuelle.
greuze
43

Toutes les autres réponses parlent de "amont" (la branche d'où vous tirez).
Mais une branche locale peut pousser vers une autre branche que celle dont elle tire.

masterpeut ne pas pousser vers la branche de suivi à distance " origin/master".
La branche amont pour masterpourrait être origin/master, mais elle pourrait pousser vers la branche de suivi à distance origin/xxxou même anotherUpstreamRepo/yyy.
Celles-ci sont définies par branch.*.pushremotepour la branche actuelle avec la global remote.pushDefaultvaleur.

C'est cette branche de suivi à distance qui compte lors de la recherche de commits non poussés: celle qui suit branch at the remoteoù la branche locale serait poussée.
Le branch at the remotepeut être, encore origin/xxxou même anotherUpstreamRepo/yyy.

Git 2.5+ (Q2 2015) introduit un nouveau raccourci pour cela: <branch>@{push}

Voir commit 29bc885 , commit 3dbe9db , commit adfe5d0 , commit 48c5847 , commit a1ad0eb , commit e291c75 , commit 979cb24 , engager 1ca41a1 , engager 3a429d0 , engager a9f9f8c , engager 8770e6f , engager da66b27 , engager f052154 , engager 9e3751d , engager ee2499f [tous du 21 mai 2015], et commit e41bf35 [01 mai 2015] par Jeff King ( peff) .
(Fusionné par Junio ​​C Hamano - gitster-dans commit c4a8354 , 05 juin 2015)

Commit adfe5d0 explique:

sha1_name: implémenter le @{push}raccourci

Dans un flux de travail triangulaire, chaque branche peut avoir deux points d'intérêt distincts: le point de départ @{upstream}habituel et la destination vers laquelle vous appuyez normalement. Il n'y a pas de raccourci pour ce dernier, mais c'est utile d'avoir.

Par exemple, vous voudrez peut-être savoir quels commits vous n'avez pas encore poussés :

git log @{push}..

Ou, à titre d'exemple plus compliqué, imaginez que vous tirez normalement les modifications de origin/master(que vous définissez comme votre @{upstream}) et que vous transférez les modifications vers votre propre fork personnel (par exemple, as myfork/topic).
Vous pouvez pousser vers votre fork depuis plusieurs machines, vous obligeant à intégrer les modifications à partir de la destination de push, plutôt qu'en amont .
Avec ce patch, vous pouvez simplement faire:

git rebase @{push}

plutôt que de taper le nom complet.

Le commit 29bc885 ajoute:

for-each-ref: accepter le %(push)format " "

Tout comme nous avons " %(upstream)" pour signaler le " @{upstream}" pour chaque référence, ce patch ajoute " %(push)" pour correspondre à " @{push}".
Il prend en charge les mêmes modificateurs de format de suivi qu'en amont (car vous souhaiterez peut-être, par exemple, quelles branches se sont engagées à pousser ).

Si vous voulez voir combien de commit vos succursales locales sont avance / en retard par rapport à la branche vers laquelle vous appuyez:

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
VonC
la source
42

Alias ​​git pratique pour rechercher des validations non poussées dans la branche actuelle :

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

Ce que cela fait essentiellement:

git log origin/branch..branch

mais détermine également le nom de la branche actuelle.

takhin
la source
8
C'est génial! Pour ceux qui ne connaissent pas les alias, ajoutez-les simplement à votre fichier ~ / .gitconfig dans la section [alias].
Gary Haran
1
Le copier / coller dans bash ne fonctionne pas, mais le script est assez utile et compréhensible
greuze
Ce n'est pas un alias bash, comme le souligne @GaryHaran. Il existe également une commande git pour ajouter des alias: git alias <alias-name> <command>dans ce cas, la commande doit être entourée de guillemets simples, pour échapper les caractères spéciaux du shell.
Dag Høidahl
4
Ce serait:git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
Ricky Levi
Cela semble fondamentalement la même chose que git log @ {u} .., voir une autre réponse .
Hans-Peter Störr
35

Tu pourrais essayer....

gitk

Je sais que ce n'est pas une option de ligne de commande pure, mais si vous l'avez installé et que vous êtes sur un système GUI, c'est un excellent moyen de voir exactement ce que vous recherchez et bien plus encore.

(Je suis en fait assez surpris que personne ne l'ait mentionné jusqu'à présent.)

Justin Ohms
la source
3
gitk --allpour voir toutes les branches.
Ray
3
tigest l'alternative ncurses.
Ray
@ justin-ohms gitkest génial! Je n'ai jamais su que cela existe! Pratique pour parcourir les changements dans une belle interface utilisateur.
RafiAlhamd
@ray tigest plus utile dans une situation de «terminal uniquement» - où vous n'avez pas accès à l'interface graphique du bureau. Je l'apprends pour la première fois! INTÉRESSANT: tigc'est INVERSE de git!
RafiAlhamd
30

git branch -v affichera, pour chaque branche locale, si elle est "en avance" ou non.

Aurelien
la source
2
Oui, en cas de commit non poussé sur la branche devel, la ligne correspondante sera * devel 8a12fc0 [ahead 1] commit msg( *sera uniquement sur la ligne correspondant à la branche extraite ). ahead 1signifie "avance d'un commit", c'est-à-dire qu'il y a un commit non poussé.
Aurelien
2
N'est-ce pas git branch -vv? Cf. docs: "Si donné deux fois, imprimez également le nom de la branche en amont (voir aussi git remote show <remote>)."
Dirty Henry
Il ne s'agit pas d'imprimer le nom de la branche amont, mais simplement d'imprimer behindet / ou aheadpour chaque branche locale, ce qui est suffisant pour résoudre le problème d'OP (détecter les validations non poussées). git branch -vest suffisant pour cela, juste testé à nouveau avec Git 2.16.2 :)
Aurelien
Le -vv est utile car il montre une différence entre les branches qui sont à jour avec la télécommande et celles qui n'ont pas du tout été poussées. (Avec un seul -v, ils s'affichent de manière identique à l'écran.)
RM
30

J'avais fait un commit précédemment, pas poussé vers une branche, ni distant ni local. Juste le commit. Rien des autres réponses n'a fonctionné pour moi, mais avec:

git reflog

Là, j'ai trouvé mon engagement.

Olaia
la source
Comme indiqué dans ce lien git-scm.com/docs/git-reflog , journaux de référence ou "reflogs", enregistrez quand les pointes des branches et autres références ont été mises à jour dans le référentiel local. Dans mon cas, j'ai cloné un dépôt, créé une nouvelle branche, supprimé la branche, créé une nouvelle, créé une validation et modifié la validation. Toutes ces étapes ont été enregistrées comme HEAD @ {0}: commit (modifier): .. HEAD @ {1}: commit: ... HEAD @ {2}: checkout: passage de ... à ... HEAD @ { 3}: checkout: passage de ... à ... HEAD @ {4}: clone: ​​de #sorry pour le format SO n'autorise apparemment pas les multilignes dans les commentaires
vélocité
cela inclut également les validations d'origine, la meilleure solution serait d'utiliser la commande fournie par @PlagueHammer ( stackoverflow.com/a/2016954/624048 )
Lincoln
20

J'utilise l'alias suivant pour obtenir uniquement la liste des fichiers (et le statut) qui ont été validés mais qui n'ont pas été poussés (pour la branche actuelle)

git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

alors faites juste:

git unpushed
CCC
la source
semble intéressant, mais $ (git name-rev --name-only HEAD) est "indéfini" dans mon cas
vak
13

Je pense que la façon la plus courante de procéder consiste à exécuter quelque chose comme:

git cherry --abbrev=7 -v @{upstream}

Cependant, je préfère personnellement exécuter:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

qui montre les validations de toutes les branches qui ne sont pas fusionnées en amont, plus la dernière validation en amont (qui apparaît comme un nœud racine pour toutes les autres validations). Je l'utilise si souvent que je lui ai créé un alias noup.

git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
Giorgos Kylafas
la source
11

Je vous suggère d'aller voir le script https://github.com/badele/gitcheck , j'ai codé ce script pour vérifier en un seul passage tous vos dépôts git, et il montre qui n'a pas commis et qui n'a pas poussé / tiré.

Voici un exemple de résultat entrez la description de l'image ici

Bruno Adelé
la source
1
Pourriez-vous expliquer comment faire fonctionner ce plugin sur une machine Windows? J'essaie d'exécuter pip, mais la commande est manquante en ligne de commande. J'ai installé Python, mais je ne sais pas si cela suffit.
Konrad Szałwiński
@ KonradSzałwiński Je n'ai pas de machine Windows, mais dans ce sujet ( stackoverflow.com/questions/4750806/… ), l'utilisateur semble répondre à votre question :). Mais je n'ai pas testé sous Windows et je ne suis pas sûr que ça marche.
Bruno Adelé
@ KonradSzałwiński le contributeur ChristianTremblay github a ajouté un support Windows. Maintenant, le gitcheck fonctionne sur les fenêtres. Vous pouvez le télécharger sur github.com/badele/gitcheck
Bruno Adelé
Maintenant, vous pouvez également utiliser gitcheck directement à partir d'un conteneur docker (avec vos fichiers dans votre hôte) Pour plus d'informations, voir le projet gitcheck github
Bruno Adelé
Merci d'avoir posté cela, cela semble vraiment utile. J'ai essayé d'installer, mais après l'installation, je ne trouve pas l'emplacement du script pour l'exécuter. $ pip install git + git: //github.com/badele/gitcheck.git Collecte de git + git: //github.com/badele/gitcheck.git Clonage git: //github.com/badele/gitcheck.git en c : \ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build Installation des packages collectés: gitcheck Exécution de l'installation de setup.py pour gitcheck: début Exécution de l'installation de setup.py pour gitcheck: terminé avec le statut 'terminé' Installation réussie de gitcheck-0.3 .22
Lauren Fitch
9

Ce n'est pas un bug. Ce que vous voyez probablement, c'est l'état git après une fusion automatique échouée où les modifications de la télécommande sont récupérées mais pas encore fusionnées.

Pour voir les validations entre le dépôt local et distant, procédez comme suit:

git fetch

Ceci est 100% sûr et ne simulera pas votre copie de travail. S'il y avait des changements, cela se git statusverrait X commits ahead of origin/master.

Vous pouvez maintenant afficher le journal des validations qui sont dans le distant mais pas dans le local:

git log HEAD..origin
Igor Zevaka
la source
8

Cela a mieux fonctionné pour moi:

git log --oneline @{upstream}..

ou:

git log --oneline origin/(remotebranch)..
VaTo
la source
2
Pour quiconque se pose la question, @{upstream}est littéral ( upstreamest un mot magique), tandis que remotebranchn'est que le nom de votre branche.
Steve Bennett
7

Il existe un outil nommé non poussé qui analyse tous les dépôts Git, Mercurial et Subversion dans le répertoire de travail spécifié et affiche la liste des fichiers non validés et des validations non poussées. L'installation est simple sous Linux:

$ easy_install --user unpushed

ou

$ sudo easy_install unpushed

pour installer à l'échelle du système.

L'utilisation est également simple:

$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)

Voir unpushed --helpou description officielle pour plus d'informations. Il dispose également d'un script cronjob unpushed-notifypour la notification à l'écran des modifications non validées et non poussées.

cloueuse
la source
5

Pour répertorier facilement toutes les validations non poussées dans toutes les branches, vous pouvez utiliser cette commande:

 git log --branches  @{u}..
Mohsen Kashi
la source
4

Similaire: pour afficher les branches non fusionnées:

git branch --all --no-merged

Ceux-ci peuvent être suspects mais je recommande la réponse de cxreg

Christophe Roussy
la source
3

Si le nombre de validations qui n'ont pas été repoussées est un nombre à un chiffre, ce qui est souvent le cas, la manière la plus simple est:

$ git checkout

git répond en vous disant que vous êtes "en avance N s'engage" par rapport à votre origine. Alors maintenant, gardez ce chiffre à l'esprit lorsque vous consultez les journaux. Si vous êtes "en avance de 3 commits", les 3 premiers commits de l'histoire sont toujours privés.

Kaz
la source
2

une façon de procéder consiste à répertorier les validations disponibles sur une branche mais pas sur une autre.

git log ^origin/master master
Alex
la source
Que fait le caractère «^»?
Aran Mulholland
@AranMulholland cela signifie pas ici.
Alex
1

Comme dit ci-dessus:

git diff origine / master..HEAD

Mais si vous utilisez git gui

Après avoir ouvert l'interface graphique, sélectionnez "Référentiel" -> Sous " Visualiser l'historique "

Remarque: Certaines personnes aiment utiliser l'invite / le terminal CMD tandis que d'autres aiment utiliser l'interface graphique Git (pour plus de simplicité)

vrnair24
la source
l'option de visualisation dans git gui est celle-là.
Rajesh Kolhapure
-2

Voici ma solution portable (script shell qui fonctionne aussi sur Windows sans installation supplémentaire) qui montre les différences d'origine pour toutes les branches: git-fetch-log

Un exemple de sortie:

==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <[email protected]>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

==== test [ahead 1, behind 1]

< commit 83a3161 (test)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 22:50:00 +0100
|
|     Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/  Author: BimbaLaszlo <[email protected]>
|   Date:   2016-03-14 10:34:28 +0100
|
|       Pushed remote
|
o commit 0fccef3
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

Les paramètres passés pour log, par exemple --onelineou --patchpeuvent être utilisés.

bimlas
la source
-3
git show

affichera toutes les différences dans vos commits locaux.

git show --name-only

affichera l'ID de validation local et le nom de la validation.

user2387567
la source
3
git showne montre que le commit le plus récent, qu'il ait été poussé vers la télécommande ou non, il ne vous montrera pas tous vos commits non poussés.
-6
git diff origin

En supposant que votre branche est configurée pour suivre l'origine, cela devrait vous montrer les différences.

git log origin

Vous donnera un résumé des commits.

mopoke
la source
3
git log originvous montrera les validations qui ont déjà été poussées , mais il ne montrera pas les validations qui n'ont pas été poussées , ce qui correspond davantage à ce que l'affiche originale demandait.