Pourquoi git status show branch est-il à jour lorsque des modifications existent en amont?

Les modifications existent en amont dans une twig suivie, mais lorsque je tape le git status cela indique que ma twig locale est à jour. Est-ce que ce nouveau comportement a été modifié, ou est-ce que quelque chose ne va pas?

Merci pour l’aide.

 ubuntu@host:/my/repo# git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean ubuntu@host:/my/repo# git pull remote: Counting objects: 11, done. remote: Compressing objects: 100% (11/11), done. remote: Total 11 (delta 6), reused 0 (delta 0) Unpacking objects: 100% (11/11), done. From bitbucket.org:my/repo 1234567..abcdefg master -> origin/master Updating 1234567..abcdefg Fast-forward file1 | 1 - file2 | 43 +++++++++++++++++++++++++++++++++++++++++++ file3 | 21 ++++++++++++--------- file4 | 21 ++++++++++++--------- 4 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 file5 

Ce que le statut vous dit, c’est que vous êtes derrière la référence appelée origin/master qui est une référence locale dans votre repo local . Dans ce cas, ref arrive à suivre une twig dans une télécommande, appelée origin , mais le statut ne vous dit rien sur la twig de la télécommande. Il vous parle de la ref, qui est juste un identifiant de validation stocké sur votre système de fichiers local (dans ce cas, il s’agit généralement d’un fichier appelé .git/refs/remotes/origin/master dans votre repo local).

git pull fait deux opérations; D’abord, il fait un git fetch pour se mettre à jour avec les commits dans le repo distant (qui met à jour la référence d’ origin/master dans votre repo local), puis il fait une git merge pour fusionner ces commits dans la twig courante.

Tant que vous ne faites pas l’étape de fetch (seule ou via git pull ), votre repo local n’a aucun moyen de savoir qu’il existe des validations supplémentaires en amont et que l’ git status ne prend en compte que votre référence d’ origin/master locale.

Lorsque l’ git status est mis à jour, cela signifie “mise à jour avec la twig que la twig actuelle suit”, ce qui signifie dans ce cas “mise à jour avec la référence locale appelée origin/master “. Cela équivaut à “être à jour avec le statut en amont qui a été récupéré la dernière fois que nous avons effectué une fetch “, ce qui n’est pas la même chose que “mis à jour avec le dernier statut en direct de l’amont”.

Pourquoi ça marche comme ça? Eh bien, l’étape d’ fetch est une opération réseau potentiellement lente et coûteuse. La conception de Git (et des autres systèmes de contrôle de version dissortingbués ) évite les opérations réseau lorsque cela est inutile et constitue un modèle complètement différent du système client-serveur habituel auquel de nombreuses personnes sont habituées. Il est tout à fait possible d’utiliser Git hors ligne, sans connexion à un serveur centralisé, et le résultat de l’ git status reflète cela.

La création et la commutation de twigs (et la vérification de leur statut) dans Git sont supposées être légères, et non effectuer une opération réseau lente vers un système centralisé. L’hypothèse lors de la conception de Git et de la sortie du git status était que les utilisateurs comprenaient cela. Avec l’adoption de Git par beaucoup et beaucoup d’utilisateurs qui ne sont pas familiers avec le DVCS, cette hypothèse n’est pas toujours valable.

En effet, votre repo local n’a pas été enregistré avec les télécommandes en amont. Pour que ce travail fonctionne comme vous le souhaitez, utilisez git fetch puis exécutez à nouveau un git status .

“origine / maître” fait référence à la référence à la validation HEAD de la twig “origine / maître”. Une référence est un nom d’alias convivial pour un object Git, généralement un object commit. La référence “origine / maître” n’est mise à jour que lorsque vous git push sur votre télécommande ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes ).

À partir de la racine de votre projet, exécutez:

 cat .git/refs/remotes/origin/master 

Comparez l’ID de validation affiché avec:

 cat .git/refs/heads/master 

Ils devraient être les mêmes, et c’est pourquoi Git dit que le master est à jour avec l’ origin/master .

Quand tu cours

 git fetch origin master 

Cela récupère les nouveaux objects Git localement sous le dossier .git / objects. Et Git met à jour .git / FETCH_HEAD pour que maintenant, il pointe vers la dernière validation de la twig récupérée.

Ainsi, pour voir les différences entre votre twig locale actuelle et la twig extraite en amont, vous pouvez exécuter

 git diff HEAD FETCH_HEAD