Voici deux questions différentes mais je pense qu'elles sont liées.
Lorsque j'utilise Git, comment puis-je identifier les modifications que j'ai validées localement, mais que je n'ai pas encore appliquées à une branche distante? Je cherche quelque chose de similaire à la commande Mercurial hg outgoing
.
Lorsque j'utilise Git, comment puis-je connaître les modifications apportées par une branche distante avant d'effectuer un pull? Je cherche quelque chose de similaire à la commande Mercurial hg incoming
.
Pour le second: y a-t-il un moyen de voir ce qui est disponible et ensuite de choisir les changements que je veux effectuer?
Git ne peut pas envoyer ce type d'informations sur le réseau, comme Hg le peut. Mais vous pouvez courir git fetch
(qui ressemble plus à hg pull
que hg fetch
) pour récupérer les nouveaux commits de vos serveurs distants.
Donc, si vous avez une branche appelée master
et une télécommande appelée Origin
, après avoir exécuté git fetch
, vous devriez aussi avoir une branche appelée Origin/master
. Vous pouvez alors obtenir le git log
de tous les engagements que master
doit être un sur-ensemble de Origin/master
en faisant git log master..Origin/master
. Inverser ces deux pour obtenir le contraire.
Un de mes amis, David Dollar, a créé deux scripts git Shell pour simuler hg incoming/outgoing
. Vous pouvez les trouver à http://github.com/ddollar/git-utils .
À partir de Git 1.7.0, il existe une syntaxe spéciale qui vous permet de faire référence de manière générique à la branche en amont: @{u}
ou @{upstream}
.
Imiter hg incoming
:
git log ..@{u}
Imiter hg outgoing
:
git log @{u}..
J'utilise les alias incoming
et outgoing
suivants pour faciliter l'utilisation de ce qui précède:
git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
Pas une réponse complète, mais git fetch va extraire le dépôt distant et ne pas faire de fusion. Vous pouvez ensuite faire un
git diff master Origine/maître
Utilisez "git log Origin..HEAD"
Utilisez "git fetch" suivi de "git log HEAD..Origin". Vous pouvez sélectionner des commits individuels à l'aide des identifiants de validation répertoriés.
Ce qui précède suppose, bien sûr, que "Origine" est le nom de votre branche de suivi à distance (ce qui est le cas si vous avez utilisé le clonage avec des options par défaut).
Il y a aussi ceci, pour comparer toutes les branches:
git log --branches --not --remotes=Origin
Voici ce que dit la page de manuel de git log:
Affiche tous les commits qui se trouvent dans l’une des branches locales, mais pas dans une des branches de suivi distantes pour Origin (ce que vous avez avec cette origine ne l’a pas).
Ce qui précède est pour outgoing
. Pour incoming
, il suffit d’échanger:
git log --remotes=Origin --not --branches
Je ferais
$ git fetch --dry-run
pour hg incoming
et
$ git Push --dry-run
pour hg outgoing
.
git-out est un script qui émule hg outgoing
assez exactement. Il analyse la sortie "Push -n" afin de produire une sortie précise si vous devez spécifier des arguments supplémentaires pour Push.
Lorsque les réponses "git log" et @ {u} m'avaient initialement donné des erreurs de "révision inconnue", j'ai essayé la suggestion de Chris/romkyns de git Push --dry-run
.
Vous obtiendrez une sortie telle que "5905..4878 master-> master". 5905 est la dernière validation de la télécommande et les validations par le biais (et y compris) 4878 seront appliquées à la télécommande.
Vous pouvez ensuite utiliser 5905..4878 comme arguments de plusieurs autres commandes git pour obtenir plus de détails:
git diff 5905..4878 # Gives full code changes in diff style
git log --online 5905..4878 # Displays each commit's comment
$ git fetch && git log ..Origin/master --stat
OR
$ git fetch && git log ..Origin/master --patch
$ git fetch && git log Origin/master.. --stat
OR
$ git fetch && git log Origin/master.. --patch