web-dev-qa-db-fra.com

Utilisation de Git, comment trouver les changements entre le local et le distant

Voici deux questions différentes mais je pense qu'elles sont liées.

  1. 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.

  2. 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?

149
ejunker

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 .

97
Jordi Bunster

À 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}..'
110
Richard Hansen

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
42
Martin Redmond
  1. Utilisez "git log Origin..HEAD"

  2. 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).

32
Greg Hewgill

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
22
robinst

Je ferais

$ git fetch --dry-run

pour hg incoming et

$ git Push --dry-run

pour hg outgoing.

8
chris

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.

1
stepancheg

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
0
pierce.jason

git entrant

$ git fetch && git log ..Origin/master --stat
OR
$ git fetch && git log ..Origin/master --patch

git sortant

$ git fetch && git log Origin/master.. --stat
OR
$ git fetch && git log Origin/master.. --patch
0
prayagupd