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 pull
et les git fetch
commandes sont disponibles pour accomplir la tâche. Vous pouvez envisager
git fetch
la 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 pull
est l'alternative la plus agressive, il télécharge le contenu distant pour la branche locale active et s'exécute immédiatement git merge
pour 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 fetch
ce 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 git
commandes), 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.
heads
et remotes
. Utilisez aussi cd
pour vérifier à l'intérieur.
- Tout ce
git fetch
que vous faites mettra à jour les éléments du /.git/refs/remotes
répertoire. Il ne mettra rien à jour dans le /.git/refs/heads
répertoire.
- Tout le monde
git pull
fera d'abord la git fetch
mise à jour des éléments dans le /.git/refs/remotes
répertoire, puis fusionnera avec votre section locale et changera la tête dans le /.git/refs/heads
ré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 fetch
et que vous l'avez fait, git checkout master
votre 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 fetch
et 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 pull
partir 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