Voici deux questions différentes mais je pense qu'elles sont liées.
Lorsque j'utilise Git, comment trouver les modifications que j'ai validées localement, mais que je n'ai pas encore poussées vers une branche distante? Je recherche quelque chose de similaire à la commande Mercurial
hg outgoing
.Lors de l'utilisation de Git, comment trouver les modifications apportées à une branche distante avant de faire un pull? Je recherche quelque chose de similaire à la commande Mercurial
hg incoming
.
Pour la seconde: y a-t-il un moyen de voir ce qui est disponible, puis de choisir les changements que je souhaite apporter?
hg incoming
et àhg outgoing
faire réellement. L'équivalent Git le plus proche que j'ai trouvé est l'--dry-run
option. Justegit pull --dry-run
et vous verrez une liste de toutes les choses qui doivent arriver.Réponses:
Git ne peut pas envoyer ce genre d'informations sur le réseau, comme le peut Hg. Mais vous pouvez exécuter
git fetch
(ce qui ressemble plushg pull
àhg fetch
) pour récupérer de nouveaux commits depuis vos serveurs distants.Donc, si vous avez une branche appelée
master
et une télécommande appeléeorigin
, après l'exécutiongit fetch
, vous devriez également avoir une branche appeléeorigin/master
. Vous pouvez alors obtenir legit log
de tous les commits quimaster
doivent être un sur-ensemble deorigin/master
en faisantgit log master..origin/master
. Inversez ces deux pour obtenir le contraire.Un de mes amis, David Dollar, a créé quelques scripts shell git à simuler
hg incoming/outgoing
. Vous pouvez les trouver sur http://github.com/ddollar/git-utils .la source
À 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 amont:
@{u}
ou@{upstream}
.Pour imiter
hg incoming
:Pour imiter
hg outgoing
:J'utilise ce qui suit
incoming
et lesoutgoing
alias pour rendre ce qui précède plus facile à utiliser:la source
git branch --set-upstream foo origin/foo
.git log @{u}..
répertorie chaque changement dans le repo pour moi. Il n'y a aucun moyen qu'ils n'existent pas encore.git rev-parse --symbolic-full-name @{u}
imprimer la référence distante appropriée. Aussi,git log @{u}..
les commits qui ne sont pas accessibles par la branche en amont, qui peuvent inclure des commits qui sont déjà dans le référentiel distant (s'ils sont accessibles par une référence différente). Cela se produira juste après la fusion dans une branche déjà poussée.checkout <somebranch>
etmerge <otherbranch>
. À ce stade, j'ai fait lelog @{u}..
et j'ai vu tous les changements répertoriés.Ce n'est pas une réponse complète, mais git fetch tirera le dépôt distant et ne fera pas de fusion. Vous pouvez alors faire un
la source
git diff origin/master master
Utilisez "git log origin..HEAD"
Utilisez "git fetch" suivi de "git log HEAD..origin". Vous pouvez sélectionner des validations individuelles à l'aide des ID de validation répertoriés.
Ce qui précède suppose, bien sûr, que "origin" est le nom de votre branche de suivi à distance (ce qui est le cas si vous avez utilisé le clonage avec les options par défaut).
la source
Il y a aussi ceci, pour comparer toutes les branches:
Voici ce que dit la page de manuel de git log à ce sujet:
Ce qui précède est pour
outgoing
. Pourincoming
, échangez simplement:la source
je ferais
pour
hg incoming
etpour
hg outgoing
.la source
git-out est un script qui émule
hg outgoing
assez précisément. Il analyse la sortie "push -n", donc il produit une sortie précise si vous avez besoin de spécifier des arguments supplémentaires à pousser.la source
git entrant
git sortant
la source
Lorsque les réponses "git log" et @ {u} m'ont 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 le dernier commit de la télécommande et les validations via (et y compris) 4878 seront appliquées à la télécommande.
Vous pouvez ensuite utiliser 5905..4878 comme arguments pour plusieurs autres commandes git pour obtenir plus de détails:
la source
Lorsque vous faites git fetch, tout le contenu, y compris les branches, les balises (refs) sont stockés temporairement dans .git / FETCH_HEAD dont le contenu peut être visualisé avec la commande: git log FETCH_HEAD Si vous n'utilisez pas le suffixe -a avec git fetch alors par défaut , Le contenu de FETCH_HEAD sera écrasé par un nouveau contenu. À partir de ces contenus, vous pouvez afficher et décider dans quelle branche vous souhaitez les fusionner si vous le faites ou vous pouvez simplement choisir en cerise si vous ne voulez que quelques commits de ce qui a été apporté par fetch.
la source