En termes simples, si vous étiez sur le point de monter dans un avion sans connexion Internet ... avant de partir, vous pouvez simplement le faire git fetch origin <master>. Il récupérerait toutes les modifications dans votre ordinateur, mais le garderait séparé de votre développement / espace de travail local.
Dans l'avion, vous pouvez apporter des modifications à votre espace de travail local, puis le fusionner avec ce que vous avez récupéré et résoudre les conflits de fusion potentiels sans connexion à Internet. Et à moins que quelqu'un n'ait apporté de nouvelles modifications contradictoires au référentiel distant, une fois arrivé à destination, vous ferez git push origin <branch>votre café.
De ce formidable tutoriel Atlassian :
le git fetch commande télécharge les validations, les fichiers et les références d'un référentiel distant dans votre référentiel local.
La récupération est ce que vous faites lorsque vous voulez voir sur quoi tout le monde a travaillé. Elle est similaire à la mise à jour SVN en ce qu'elle vous permet de voir comment l'historique central a progressé, mais elle ne vous oblige pas à fusionner réellement les modifications dans votre référentiel. Git isole le contenu récupéré en tant que contenu local existant , il n'a absolument
aucun effet sur votre travail de développement local . Le contenu récupéré doit être explicitement extrait à l'aide dugit checkout commande. Cela rend la récupération d'un moyen sûr de réviser les validations avant de les intégrer à votre référentiel local.
Lorsque le téléchargement de contenu à partir d' un référentiel à distance, git pullet les git fetchcommandes sont disponibles pour accomplir la tâche. Vous pouvez envisager
git fetchla version «sûre» des deux commandes. Il téléchargera le contenu distant, mais ne mettra pas à jour l'état de fonctionnement de votre référentiel local, laissant votre travail actuel intact. git pullest l'alternative la plus agressive, il télécharge le contenu distant pour la branche locale active et s'exécute immédiatement git mergepour créer un commit de fusion pour le nouveau contenu distant. Si des modifications sont en cours, cela entraînera des conflits et déclenchera le flux de résolution des conflits de fusion.
Avec git pull:
- Vous n'obtenez aucun isolement.
- Cela affecte votre développement local.
- Il n'a pas besoin d'être explicitement extrait. Parce qu'il fait implicitement a
git merge.
- Ce n'est PAS sûr. C'est agressif.
- Contrairement à
git fetchce qui n'affecte que votre .git/refs/remotes, git pull affectera à la fois votre .git/refs/remotes et .git/refs/heads/
Hmmm ... donc si je ne mets pas à jour la copie de travail avec git fetch, alors où dois-je faire les changements? Où Git Fetch stocke-t-il les nouveaux validations?
Grande question. Il le place quelque part isolé de votre copie de travail. Mais encore une fois où? Découvrons-le.
Dans le répertoire de votre projet (c'est-à-dire où vous exécutez vos gitcommandes), procédez comme suit:
ls. Cela montrera les fichiers et répertoires. Rien de bien, je sais.
Maintenant ls -a. Cela montrera les fichiers de points , à savoir, les fichiers commençant par .Vous pourrez alors voir un répertoire nommé: .git.
- Faites
cd .git. Cela va évidemment changer votre répertoire.
- Maintenant vient la partie amusante; faire
ls. Vous verrez une liste de répertoires. Nous recherchons refs. Faites cd refs.
- Il est intéressant de voir ce qu'il y a dans tous les répertoires, mais concentrons-nous sur deux d'entre eux.
headset remotes. Utilisez aussi cdpour vérifier à l'intérieur.
- Tout ce
git fetch que vous faites mettra à jour les éléments du /.git/refs/remotesrépertoire. Il ne mettra rien à jour dans le /.git/refs/headsrépertoire.
- Tout le monde
git pull fera d'abord la git fetchmise à jour des éléments dans le /.git/refs/remotesrépertoire, puis fusionnera avec votre section locale et changera la tête dans le /.git/refs/headsrépertoire.
Une très bonne réponse connexe peut également être trouvée dans Où se place «git fetch»? .
Recherchez également la «notation Slash» dans le post sur les conventions de dénomination de la branche Git . Il vous aide à mieux comprendre comment Git place les choses dans différents répertoires.
Pour voir la différence réelle
Faites juste:
git fetch origin master
git checkout master
Si le maître distant a été mis à jour, vous obtiendrez un message comme celui-ci:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Si vous ne l'avez pas fait fetchet que vous l'avez fait, git checkout mastervotre git local ne saurait pas qu'il y a 2 commits ajoutés. Et cela dirait simplement:
Already on 'master'
Your branch is up to date with 'origin/master'.
Mais c'est obsolète et incorrect. C'est parce que git vous donnera des commentaires uniquement basés sur ce qu'il sait. Il est inconscient des nouveaux commits qu'il n'a pas encore baissé ...
Existe-t-il un moyen de voir les nouvelles modifications apportées à distance tout en travaillant sur la branche localement?
Certains IDE (par exemple Xcode) sont super intelligents et utilisent le résultat d'un git fetchet peuvent annoter les lignes de code qui ont été modifiées dans la branche distante de votre branche de travail actuelle. Si cette ligne a été modifiée à la fois par des modifications locales et une branche distante, cette ligne est annotée en rouge. Ce n'est pas un conflit de fusion. Il s'agit d'un conflit de fusion potentiel . C'est un headsup que vous pouvez utiliser pour résoudre le futur conflit de fusion avant de le faire à git pullpartir de la branche distante.

Conseil amusant:
Si vous avez récupéré une branche distante, par exemple:
git fetch origin feature/123
Ensuite, cela irait dans votre répertoire télécommandes. Il n'est toujours pas disponible dans votre répertoire local. Cependant, cela simplifie votre paiement vers cette branche distante par DWIM (Faites ce que je veux dire):
git checkout feature/123
vous n'avez plus besoin de faire:
git checkout -b feature/123 origin/feature/123
Pour en savoir plus, lisez ici