Comment prévisualiser git-pull sans faire de fetch?

204

Est-ce même possible?

Fondamentalement, il existe un référentiel distant à partir duquel je tire en utilisant simplement:

git pull

Maintenant, je voudrais prévisualiser ce que cette traction changerait (un diff) sans rien toucher de mon côté. La raison en est que ce que je tire n'est peut-être pas "bon" et je veux que quelqu'un d'autre le répare avant de rendre mon dépôt "sale".

Milan Babuškov
la source
4
Votre montage est bizarre. Faire un "git fetch" ne modifie en rien votre arbre de travail, donc peu importe si vous avez des modifications locales non validées. Et il est difficile de savoir quelle partie de l'extraction vous souhaitez annuler, car elle ne touche pas votre arbre de travail.
dkagedal
Merci dkagedal, j'ai écrit ceci avant de bien comprendre comment fonctionne Git. J'ai supprimé cette modification.
Milan Babuškov

Réponses:

234

Après avoir fait un git fetch, faites un git log HEAD..origin/masterpour afficher les entrées de journal entre votre dernier commit commun et la branche principale d'origine. Pour afficher les diff, utilisez soit git log -p HEAD..origin/masterpour afficher chaque patch, soit git diff HEAD...origin/master(trois points et non deux) pour afficher un seul diff.

Il n'est normalement pas nécessaire d'annuler une extraction, car effectuer une extraction ne met à jour que les branches distantes et aucune de vos branches. Si vous n'êtes pas prêt à effectuer un pull and merge dans toutes les validations à distance, vous pouvez utiliser git cherry-pickpour accepter uniquement les validations à distance spécifiques que vous souhaitez. Plus tard, lorsque vous êtes prêt à tout obtenir, une git pullvolonté fusionnera dans le reste des validations.

Mise à jour: je ne sais pas vraiment pourquoi vous voulez éviter l'utilisation de git fetch. Tout ce que git fetch fait est de mettre à jour votre copie locale des branches distantes. Cette copie locale n'a rien à voir avec aucune de vos succursales et n'a rien à voir avec les modifications locales non validées. J'ai entendu parler de gens qui exécutent git fetch dans un travail cron parce que c'est tellement sûr. (Je ne recommanderais pas normalement de faire cela, cependant.)

Greg Hewgill
la source
Je suppose que j'ai raté cette partie de «rien à voir avec MES branches» en lisant les documents. Merci.
Milan Babuškov
1
Pour une raison quelconque, cela ne fonctionne pas pour moi. J'ai essayé git diff HEAD ... origin / master et il n'a pas encore répertorié les changements quand je fais "pull origin master" il récupère et fusionne les changements. Est-ce parce que j'ai configuré le référentiel distant à l'aide de git remote add?
screenm0nkey
@ screenm0nkey: Je ne sais pas (sans en savoir plus). Je recommande d'ouvrir une nouvelle question à poser à ce sujet si vous n'êtes toujours pas sûr.
Greg Hewgill
1
Ce qui fonctionne pour moi (après le git fetch): git log origin / master
slaman
2
git diff ...@{u}est le même que git diff HEAD...origin/mastersi origine / maître est la branche amont
cambunctious
47

Je pense que git fetch est ce que vous cherchez.

Il tirera les modifications et les objets sans les valider dans l'index de votre dépôt local.

Ils peuvent être fusionnés plus tard avec git merge .

Page de manuel

Edit: Explication supplémentaire

Directement de l' accident Git- SVN Cours lien

Maintenant, comment obtenez-vous de nouvelles modifications à partir d'un référentiel distant? Vous les récupérez:

git fetch http://host.xz/path/to/repo.git/ 

À ce stade, ils se trouvent dans votre référentiel et vous pouvez les examiner en utilisant:

git log origin 

Vous pouvez également différencier les modifications. Vous pouvez également utiliser git log HEAD..origin pour voir uniquement les changements que vous n'avez pas dans votre branche. Si vous souhaitez les fusionner, faites simplement:

git merge origin

Notez que si vous ne spécifiez pas de branche à récupérer, elle sera par défaut la télécommande de suivi.

La lecture de la page de manuel va honnêtement vous donner la meilleure compréhension des options et comment l'utiliser.

J'essaie simplement de le faire par des exemples et de la mémoire, je n'ai pas actuellement de boîte à tester. Vous devriez regarder:

git log -p //log with diff

Une récupération peut être annulée avec git reset --hard ( lien ), mais toutes les modifications non validées dans votre arborescence seront perdues ainsi que les modifications que vous avez récupérées.

Brian Gianforcaro
la source
Si vous expliquez deux choses, cela pourrait être bien: 1. comment annuler git-fetch? 2. Comment puis-je voir le diff?
Milan Babuškov
1
1) Annuler git-fetch? 2) git diff HEAD..origin
Chris Vest
La différence se fait comme Christian l'a dit, une récupération peut être annulée avec git reset --hard, cependant toutes les modifications non validées dans votre arborescence seront perdues ainsi que les modifications que vous avez récupérées.
Brian Gianforcaro
Cherchez-vous git reset --softou --mixed? Consultez la page de manuel.
Aristote Pagaltzis
1
Si je comprends bien, il n'est pas nécessaire d'annuler un "git fetch" car il ne touche pas à votre copie de travail ni à votre référentiel. "git fetch" stocke les objets et les références dans .git / FETCH_HEAD
Thorsten Niehues
21

Vous pouvez récupérer à partir d'un référentiel distant, voir les différences, puis extraire ou fusionner.

Voici un exemple pour un référentiel distant appelé originet une branche appelée mastersuivi de la branche distante origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Antonio Bardazzi
la source
8

J'ai créé un alias git personnalisé pour le faire pour moi:

alias.changes=!git log --name-status HEAD..

avec cela, vous pouvez le faire:

$git fetch
$git changes origin

Cela vous donnera un moyen agréable et facile de prévisualiser les modifications avant de faire un merge.

Matthias
la source
tu es Dieu. cela devrait
relever de
3

J'utilise ces deux commandes et je peux voir les fichiers à modifier.

  1. En exécutant d'abord git fetch , il donne une sortie comme celle-ci (une partie de la sortie):

    ...
    72f8433..c8af041 développer -> origine / développer
    ...

Cette opération nous donne deux ID de validation, le premier est l'ancien et le second sera le nouveau.

  1. Comparez ensuite ces deux validations à l'aide de git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Cette commande listera les fichiers qui seront mis à jour:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Par exemple, app / controller / xxxx.php et app / view / yyyy.php seront mis à jour.

La comparaison de deux validations à l'aide de git diff affiche tous les fichiers mis à jour avec des lignes modifiées, mais avec grep, il recherche et obtient uniquement les lignes contenant diff --git à partir de la sortie.

cowboycb
la source
3

Je suis peut-être en retard à la fête, mais c'est quelque chose qui m'a dérangé trop longtemps. D'après mon expérience, je préférerais voir quelles modifications sont en attente plutôt que de mettre à jour ma copie de travail et de gérer ces modifications.

Cela va dans le ~/.gitconfigfichier:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Il récupère la branche actuelle, puis fait une différence entre la copie de travail et cette branche extraite. Vous ne devriez donc voir que les changements qui en découleraient git pull.

Andy P
la source
1
Pourriez-vous échanger la chaîne de référence pour HEAD..@{u}? C'est plus simple et n'exige pas que la télécommande soit nommée "origine" ou que votre branche soit nommée de la même manière que sur la télécommande.
Michael - Où est Clay Shirky le
C'est un alias bien fait, mais je ne sais pas pourquoi vous voudriez le faire en premier lieu. Vous allez devoir faire face aux changements un jour, non? Vous devriez être en mesure d'interrompre la partie de fusion git pullsi vous n'aimez pas ce qu'elle fait ... donc je ne sais pas quel est le cas d'utilisation pour cela.
Marnen Laibow-Koser
Je sais que je dois faire face aux changements à un moment donné, mais comme je l'ai écrit, parfois je ne veux pas. Je veux juste savoir si quelque chose va se casser et je dois réserver un peu plus de temps pour cela - ou si je peux juste faire un git pullaprès. Je pense aussi que c'était la question de l'op.
Andy P
-1

Si vous ne voulez pas que git-fetch mette à jour votre .git local, copiez simplement votre dépôt local dans un répertoire temporaire et faites-y un pull. Voici une petite main:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
AX Labs
la source
'gtp' doit être exécuté à la racine du dépôt local, où se trouve .git.
AX Labs
-2

Qu'en est-il du clonage du dépôt ailleurs, et de faire git log à la fois sur la vraie caisse et sur le nouveau clone pour voir si vous avez la même chose.

Ed Greenberg
la source
Une copie locale reflète mieux l'état qu'un autre clone. Voir mon post principal pour plus de détails .
AX Labs