Comment puis-je afficher les commits locaux que j'ai faits et qui n'ont pas encore été placés dans le référentiel distant? De temps en temps, git status
indiquera que ma branche est X valide avant Origin/master
, mais pas toujours.
Est-ce un problème avec mon installation de Git ou est-ce que quelque chose me manque?
git log Origin/master..HEAD
Vous pouvez également afficher le diff en utilisant la même syntaxe
git diff Origin/master..HEAD
Si vous voulez voir tous les commits sur toutes les branches qui ne sont pas encore poussées, vous pouvez rechercher 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
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 en amont de la branche actuelle (voir git rev-parse --help
ou git help revisions
pour plus de détails).
Cela a fonctionné pour moi:
git cherry -v
Comme indiqué à la rubrique Git: voir tous les commits non compressés ou qui ne font pas partie d'une autre branche .
Vous pouvez le faire avec git log
:
_git log Origin..
_
En supposant que Origin
soit le nom de votre amont, laisser n'importe quel nom de révision après _..
_ implique HEAD
, qui répertorie les nouveaux commits qui n'ont pas été poussés.
Pratique alias git pour rechercher les commits non envoyés 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 fondamentalement:
git log Origin/branch..branch
mais détermine également le nom de la branche en cours.
Toutes les autres réponses parlent d '"amont" (la branche d'où vous tirez).
Mais une branche locale peut pousser vers un branche différente de celle dont elle tire.
master
pourrait ne pas transmettre à la branche de suivi à distance "_Origin/master
_".
La branche en amont de master
pourrait être _Origin/master
_, mais elle pourrait transmettre à la branche de suivi distante _Origin/xxx
_ ou même _anotherUpstreamRepo/yyy
_.
Ceux-ci sont définis par _branch.*.pushremote
_ pour la branche actuelle avec la valeur _global remote.pushDefault
_.
C’est que branche de télé-suivi qui compte lorsqu’on cherche des commits non contus: celle qui suit le _branch at the remote
_ où la branche locale serait poussé vers.
Le _branch at the remote
_ peut être, encore une fois, _Origin/xxx
_ ou même _anotherUpstreamRepo/yyy
_.
<branch>@{Push}
Voir commit 29bc885 , commit 3dbe9db , commit adfe5d , commit 48c5847 , commit a1ad0eb , commit e291c75 , commit 979cb24 , commit 1ca41a1 , commit 3a429d , commit a9f9f8c , commit 8770e6f , commit da66b27 , commit f052154 , commit 9e3751d , commit ee2499f [tous à partir du 21 mai 2015], et commit e41bf35 [01 mai 2015] par Jeff King (peff
) .
(Fusion de Junio C Hamano - gitster
- dans commit c4a8354 , 5 juin 2015)
Commit adfe5d explique:
_
sha1_name
_: implémenter _@{Push}
_ sténographieDans un flux de travail triangulaire, chaque branche peut avoir deux points d’intérêt distincts: le _
@{upstream}
_ à partir duquel vous extrayez normalement 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é :
_git log @{Push}..
_
Ou, à titre d'exemple plus compliqué, imaginez que vous extrayiez normalement les modifications de _
Origin/master
_ (que vous définissiez comme votre _@{upstream}
_) et que vous transmettiez les modifications à votre propre fork (par exemple, en tant que _myfork/topic
_). .
Vous pouvez appuyer sur votre fork depuis plusieurs machines, ce qui vous oblige à intégrer les modifications à partir de la destination Push plutôt que vers l’amont .
Avec ce patch, vous pouvez simplement faire:
_git rebase @{Push}
_
plutôt que de taper le nom complet.
Commit 29bc885 ajoute:
_
for-each-ref
_: accepte le format "%(Push)
"Tout comme nous avons "
%(upstream)
" pour signaler le "_@{upstream}
_" pour chaque ref, ce patch ajoute "%(Push)
" pour correspondre à "_@{Push}
_".
Il supporte les mêmes modificateurs de format de suivi qu'en amont (parce que vous voudrez peut-être savoir, par exemple, quelles branches ont des commits à Push ) .
Si vous voulez voir combien de commissions vos branches locales sont devant/derrière par rapport à la branche que vous souhaitez pousser:
_git for-each-ref --format="%(refname:short) %(Push:track)" refs/heads
_
Tu pourrais essayer....
gitk
Je sais que ce n'est pas une option de ligne de commande pure, mais si vous l'avez installée et que vous utilisez un système d'interface graphique, 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.)
git branch -v
indiquera, pour chaque branche locale, si elle est "en avance" ou non.
J'utilise l'alias suivant pour obtenir uniquement la liste des fichiers (et le statut) qui ont été validés mais 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 juste faire:
git unpushed
J'avais 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 commit.
Je crois que la manière la plus typique de faire est de faire quelque chose comme:
git cherry --abbrev=7 -v @{upstream}
Cependant, je préfère personnellement courir:
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
qui montre les commits de tous branches qui ne sont pas fusionnées en amont, plus le dernier commit en amont (qui apparaît sous forme de nœud racine pour tous les autres commits). Je l’utilise si souvent que j’ai créé le pseudonyme noup
.
git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
git cherry -v
Ceci listera votre historique de commentaires local (pas encore poussé) avec le message correspondant
Ce n'est pas un bug. Ce que vous voyez probablement est le statut git après une fusion automatique ayant échoué, où les modifications de la télécommande sont récupérées mais pas encore fusionnées.
Pour voir les commits 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 modifications, git status
affichera X commits ahead of Origin/master
.
Vous pouvez maintenant afficher le journal des commits qui se trouvent dans la télécommande mais pas dans la locale:
git log HEAD..Origin
Je vous suggère d'aller voir le script https://github.com/badele/gitcheck , j'ai codé ce script pour qu'il vérifie en un seul passage tous vos référentiels git et qu'il montre qui ne s'est pas engagé et qui n'a pas poussé/tiré.
Voici un exemple de résultat
Il existe un outil nommé non compressé 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 ucommited et des validations non corrigées. L'installation est simple sous Linux:
$ easy_install --user unpushed
ou
$ Sudo easy_install unpushed
installer à l'échelle du système.
L'utilisation est simple aussi:
$ 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 --help
ou description officielle pour plus d'informations. Il comporte également un script cronjob unpushed-notify
pour la notification à l'écran des modifications non validées et non validées.
Cela a mieux fonctionné pour moi:
git log --oneline @{upstream}..
ou:
git log --oneline Origin/(remotebranch)..
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
Pour lister tous les commit non-pressés dans toutes les branches vous pouvez facilement utiliser cette commande:
git log --branches @{u}..
Si le nombre de validations qui n'ont pas été repoussées est un nombre à un chiffre, ce qui est souvent le cas, la méthode la plus simple consiste à:
$ git checkout
git répond en vous disant que vous êtes "en avance de N commits" par rapport à votre origine. Alors maintenant, gardez ce numéro à l’esprit lorsque vous consultez des journaux. Si vous êtes "en avance de 3 commits", les 3 meilleurs commits de l'historique sont toujours privés.
une façon de faire est de lister les commits disponibles sur une branche mais pas sur une autre.
git log ^Origin/master master
Voici ma solution portable (script Shell qui fonctionne aussi sous Windows sans installation supplémentaire) qui montre les différences par rapport à Origin 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
Paramètres transmis pour le journal, par exemple --oneline
ou --patch
peuvent être utilisés.