À l'aide de Git comment puis-je trouver les changements entre le local et à distance
Ici sont deux questions différentes, mais je pense qu'ils sont liés.
-
Lors de l'utilisation de Git, comment puis-je trouver les changements que j'ai commis localement, mais n'ont pas encore poussé à une branche distante? Je suis à la recherche de quelque chose de similaire à l'Mercurial commande
hg outgoing
. -
Lors de l'utilisation de Git, comment puis-je trouver ce que les modifications d'une branche à distance a avant de faire un pull? Je suis à la recherche de quelque chose de similaire à l'Mercurial commande
hg incoming
.
Pour la deuxième: est-il un moyen de voir ce qui est disponible et puis de choisir les changements que je veux tirer?
- En regardant les réponses, il semble y avoir une certaine confusion quant à ce que
hg incoming
ethg outgoing
réellement faire. Le plus proche Git équivalent que j'ai trouvé est le--dry-run
option. Justegit pull --dry-run
et vous verrez une liste de toutes les choses qui doivent arriver.
Vous devez vous connecter pour publier un commentaire.
Git ne pouvez pas envoyer ce genre d'informations sur le réseau, comme le Hg peut. Mais vous pouvez l'exécuter
git fetch
(ce qui est plus commehg pull
quehg fetch
) pour aller chercher de nouvelles validations de vos serveurs distants.Donc, si vous avez une branche appelée
master
et d'une distance appeléeorigin
, après l'exécution degit fetch
, vous devriez également avoir une branche appeléeorigin/master
. Ensuite, vous pouvez obtenir legit log
de tous les commits quemaster
doit être un sur-ensemble deorigin/master
en faisantgit log master..origin/master
. Inverser les deux pour obtenir le contraire.Un de mes amis, David Dollar, a créé un couple de git scripts shell pour simuler
hg incoming/outgoing
. Vous pouvez les trouver à http://github.com/ddollar/git-utils.De départ avec Git 1.7.0, il y a une syntaxe spéciale qui vous permet de manière générique, reportez-vous à l'amont de la direction de la
@{u}
ou@{upstream}
.Pour imiter
hg incoming
:Pour imiter
hg outgoing
:J'utilise la suite
incoming
etoutgoing
alias pour vous au-dessus de la plus facile à utiliser:git branch --set-upstream foo origin/foo
.git log @{u}..
les listes de tous les changements dans le repo pour moi. Il n'y a aucun moyen qu'ils n'existent pas encore.git rev-parse --symbolic-full-name @{u}
imprime la distance approprié de référence. Aussi,git log @{u}..
montre les commits qui ne sont pas accessibles par l'amont de la branche, qui peuvent inclure des commits qui sont déjà dans le dépôt distant (si elles sont accessibles par une référence différente). Ce sera le cas à droite après la fusion de dans une déjà poussé la branche.checkout <somebranch>
etmerge <otherbranch>
. À ce stade, j'ai fait lalog @{u}..
et vu tous les changements énumérés.<otherbranch>
, alors c'est prévu. Parce que vous avez juste fait de la fusion, les commits sur<otherbranch>
sont maintenant accessibles à partir de votre local<somebranch>
mais ne sont pas encore accessible à partir de la télécommandeorigin/<somebranch>
. Ainsi, ces révisions sont "sortant" de la télécommandeorigin/<somebranch>
branche. Même si elles ne seront pas de nouvelles pour le dépôt distant, ils seront de nouveau pour que la branche distante.hg outgoing
ne pas le faire. Il vient de listes s'engage à ce que doit être envoyé à la télécommande repo. Je pense quegit push --dry-run
est beaucoup plus proche de l'esprit deshg outgoing
.git fetch
toutes les modifications avant l'exécution degit log ..@{u}
pour que cela fonctionne.git remote update -p
, qui extrait des changements. Mais je préfèregit fetch
au lieu de cela, à la seule extraction des changements pour la branche amont:git config --global alias.incoming '!git fetch && git log ..@{u}'
Pas une réponse complète, mais git fetch va tirer la distance de pensions et de ne pas faire une fusion.
Vous pouvez ensuite faire un
git diff origin/master master
Utilisez "git log origine..TÊTE"
Utilisez "git fetch", suivi par "git log TÊTE..origine". Vous pouvez choisir individu s'engage à l'aide de la liste de commettre id.
Ci-dessus suppose, bien sûr, cette "origine" est le nom de votre suivi à distance de la branche (qui il est, si vous avez utilisé clone avec les options par défaut).
Il y a aussi cette, pour la comparaison de toutes les branches:
C'est ce que la commande git log page de man dit à ce propos:
Ci-dessus est pour
outgoing
.Pour
incoming
, il suffit de le remplacer:Je ne
pour
hg incoming
etpour
hg outgoing
.git-out est un script qui émule
hg outgoing
assez précisément. Il analyse sur "push -n" de sortie, de sorte qu'il produit de sortie précise si vous avez besoin de spécifier d'autres arguments pour pousser.git entrant
git sortant
Lorsque le "git log" et @{u} réponses initialement m'a donné des "inconnus " révision" des erreurs, j'ai essayé Chris/romkyns suggestion de
git push --dry-run
.Vous permettra d'obtenir un résultat comme "5905..4878 maître->maître". 5905 est le dernier commit que la distance de a et s'engage à (et y compris) 4878 sera appliqué à la télécommande.
Vous pouvez ensuite utiliser 5905..4878 comme des arguments de plusieurs autres commandes git pour obtenir plus de détails:
Lorsque vous ne git fetch, tout le contenu, y compris les succursales,les balises ( refs) sont stockés temporairement dans .git/FETCH_HEAD dont le contenu peut être affiché avec la commande:
la commande git log FETCH_HEAD
Si vous n'utilisez pas le suffixe -a avec git fetch par défaut, FETCH_HEAD du contenu sera écrasé par le nouveau contenu.
À partir de ces matières, vous pouvez consulter et décider de la direction que vous souhaitez les fusionner si vous voulez ou vous pouvez simplement choisir si vous voulez seulement quelques commits de ce qui a été apporté par fetch.