Aller au contenu

git fetch

Définition

La commande git fetch est utilisée pour télécharger des commits, des objets et des références depuis un dépôt distant vers le dépôt local. Elle sert à voir sur quoi les autres membres de l’équipe ont travaillé.

git fetch

Comment cela fonctionne avec les branches distantes

Git stocke les commits locaux et distants et les sépare à l’aide des références de branches. Les références des branches locales sont stockées dans /.git/refs/heads/. Pour voir la liste des références de branches locales, exécutez la commande git branch.

git branch

bash
git branch
* master
  crossword
  solver

L’exploration du contenu du répertoire /.git/refs/heads/ produira la sortie suivante :

ls ./.git/refs/heads/

bash
ls ./.git/refs/heads/
master
crossword
solver

Les références des branches distantes sont stockées dans le répertoire ./.git/refs/remotes/. Pour voir les branches distantes, utilisez l’option -r avec git branch. Voici la sortie après la récupération d’un dépôt distant :

git branch -r

bash
git branch -r
  origin/master
  origin/crossword
  origin/solver
  remote-repo/master
  remote-repo/other-feature

La sortie montre les branches distantes préfixées par origin/. Vous pouvez examiner les branches distantes avec les commandes git checkout et git log. Après avoir approuvé les changements de la branche distante, vous pouvez la fusionner dans la branche locale avec la commande git merge. Utilisez plutôt la commande git pull pour raccourcir le processus.

Options courantes

--allRécupère toutes les branches distantes.
-k or --keepConserve le pack téléchargé.
-p or --pruneSupprime les références de suivi distantes qui n’existaient pas sur le distant avant la récupération.
--depth=<depth>Limite le nombre de commits à récupérer depuis la pointe de l’historique de chaque branche distante.

Pour supprimer les références de suivi des branches qui n’existent plus sur le distant, utilisez --prune :

bash
git fetch --prune

Comment faire un git fetch de la branche distante

Ici, nous allons montrer les étapes pour récupérer une branche distante et mettre à jour l’état de travail local avec le contenu distant. Dans l’exemple suivant, nous avons un dépôt central origin à partir duquel le dépôt local a été cloné avec la commande git clone. Il existe un autre dépôt distant nommé test_repo contenant feature_branch qui doit être configuré et récupéré.

La première étape consiste à configurer le dépôt distant avec git remote :

git remote

bash
git remote add test_repo git@hostname:test/test_repo.git

En utilisant l’URL du dépôt du collègue, nous avons créé une référence vers celui-ci. Pour télécharger le contenu, git fetch la branche de test feature_branch :

git fetch

bash
git fetch test_repo feature_branch
From hostname:test/test_repo
* [new branch]      feature_branch -> test_repo/feature_branch

Cela intégrera le contenu de test/feature_branch dans le dépôt local. Maintenant, utilisez la commande git checkout pour extraire la branche distante téléchargée :

git checkout test_repo/feature_branch

bash
git checkout test_repo/feature_branch
Note: checking out 'test_repo/feature_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can drop all the commits you make in this
state without influencing branches by executing another checkout.

If you want to generate a new branch for maintaining commits you create, you may
do so (now or later) if you use -b with the checkout command again. Example:

git checkout -b &lt;new-branch-name&gt;

La sortie montre que nous sommes dans l’état detached HEAD, ce qui signifie que la référence HEAD pointe directement vers un commit au lieu d’une branche.

Avec la commande git checkout, une nouvelle branche locale à partir de la référence test/feature_branch peut être créée :

git checkout -b local_feature_branch test_repo/feature_branch

bash
git checkout -b local_feature_branch test_repo/feature_branch

La nouvelle branche locale est créée, mettant à jour HEAD pour pointer vers le contenu distant le plus récent.

Synchronisation de origin avec git fetch

L’exemple suivant montre comment synchroniser le dépôt local avec la branche master du dépôt central :

git fetch origin

bash
git fetch origin

La sortie affichera les branches qui ont été téléchargées :

git fetch origin output

bash
b341bc3..32a45b1  master     -> origin/master
b341bc3..7a52a22  develop    -> origin/develop
* [new branch]      some-feature -> origin/some-feature

Exécutez git log en utilisant origin/master comme filtre pour afficher les commits ajoutés à master en amont :

git log --oneline master..origin/master

bash
git log --oneline master..origin/master

Vérifiez les changements et fusionnez-les dans la branche master locale :

git checkout master && git log origin/master

bash
git checkout master
git log origin/master

Exécutez git merge origin/master pour synchroniser avec les développements en amont :

git merge

bash
git merge origin/master

Exemple de scénario courant :

Voici un scénario pour vous aider à mieux comprendre ce concept :

Supposons qu’il existe une petite équipe de développement composée de deux développeurs, Alice et Bob. Ils travaillent sur un projet hébergé dans un dépôt Git distant appelé origin. Alice clone le dépôt sur sa machine locale et commence à travailler sur la branche main, tandis que Bob travaille sur une branche séparée appelée feature-branch.

1- Alice crée un nouveau fichier appelé README.md et y apporte quelques modifications. Elle valide ensuite ses changements et les pousse vers la branche main du dépôt origin :


bash
$ git add README.md
$ git commit -m "Add README file"
$ git push origin main

2- Pendant ce temps, Bob a apporté quelques modifications à feature-branch et les a poussées vers le dépôt origin :


bash
$ git add some_file.txt
$ git commit -m "Add new feature"
$ git push origin feature-branch

3- Alice réalise qu’elle doit intégrer les changements de Bob dans son propre travail, alors elle récupère les changements depuis le dépôt origin :


bash
$ git fetch origin

4- Après la récupération, Alice peut voir qu’il y a de nouveaux changements dans feature-branch :


bash
$ git branch -r
  origin/HEAD -> origin/main
  origin/main
  origin/feature-branch

5- Alice peut maintenant fusionner les changements de Bob dans sa branche main :


bash
$ git merge origin/feature-branch

6- Alice résout les éventuels conflits de fusion, puis pousse ses changements vers le dépôt origin :


bash
$ git push origin main

7- Bob peut maintenant récupérer les changements effectués par Alice :


bash
$ git fetch origin

8- Bob peut maintenant voir qu’il y a de nouveaux changements dans la branche main :


bash
$ git branch -r
  origin/HEAD -> origin/main
  origin/main
  origin/feature-branch

9- Bob peut fusionner les changements effectués par Alice dans sa branche feature-branch :


bash
$ git merge origin/main

10- Bob résout les éventuels conflits de fusion, puis pousse ses changements vers le dépôt origin :


bash
$ git push origin feature-branch

Et ainsi le cycle continue, Alice et Bob utilisant tous deux git fetch pour suivre les changements effectués par l’autre et pousser leurs propres changements vers le dépôt origin. En utilisant git fetch, ils peuvent maintenir leur dépôt local à jour avec les changements apportés par leurs coéquipiers, ce qui aide à éviter les conflits et à garantir un processus de collaboration fluide.

git fetch vs git pull

git fetch et git pull sont tous deux utilisés pour télécharger du contenu depuis le dépôt distant. La commande git fetch ne fusionne pas automatiquement les changements dans vos branches locales ; elle met simplement à jour vos branches de suivi distantes. Le contenu récupéré n’affecte pas votre répertoire de travail local, ce qui vous permet d’examiner les commits en toute sécurité avant de les fusionner. La commande git pull télécharge du nouveau contenu et le fusionne automatiquement dans votre branche actuelle. Cela peut provoquer des conflits de fusion, il est donc recommandé d’exécuter git pull uniquement lorsque votre copie de travail est propre.

Practice

Quelles sont les affirmations correctes à propos de la commande `git fetch` telle que décrite dans le tutoriel Git de W3Docs ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.