La terminologie déroutante de Git
(jvns.ca)- Même après des années d’usage, Git reste déroutant à cause de nombreux doublons et réemplois de termes, ce qui rend difficile de prévoir son comportement réel en se contentant de mémoriser les commandes
- Des termes et symboles comme
HEAD,heads, detached HEAD,ours/theirs,../...changent de sens selon le contexte index,stagedetcachedsont tous liés à.git/index, maisreset,revertetrestore, malgré des noms proches, n’ont pas le même effet sur l’historique des commits, l’arbre de travail et les pointeurs de branche- Le fait que
mainsuive un dépôt distant est distinct d’une remote-tracking branch commeorigin/main, etcheckoutregroupe dans une seule commande le changement de branche et la restauration de fichiers - Pour comprendre Git, il faut regarder non seulement les commandes individuelles, mais aussi le modèle interne où s’articulent branches, références, commits, index et état du suivi distant
HEAD, branches et detached HEAD
- Dans Git, les heads désignent les branches, qui sont stockées en interne dans le répertoire
.git/refs/heads- Le glossaire officiel de Git distingue branch, qui inclut tous les commits au-dessus, et head, qui désigne le commit le plus récent, mais on peut aussi voir cela comme deux façons de regarder le même objet
HEADpointe vers la branche courante et est stocké dans.git/HEAD- La formule «
headest une branche, etHEADest la branche courante » illustre bien à elle seule la confusion de la terminologie Git
- La formule «
- L’état detached HEAD correspond au cas où
HEADne pointe pas vers une branche, mais directement vers un identifiant de commit- Si l’on fait un checkout d’un tag, on peut se retrouver en detached HEAD, car un tag n’est pas une branche
- Dans cet état,
git pullne fonctionne pas, etgit pushnon plus sauf dans des cas particuliers git commit,git merge,git rebaseetgit cherry-pickrestent possibles, mais les nouveaux commits ne sont rattachés à aucune branche et peuvent devenir difficiles à retrouver- Créer une nouvelle branche ou revenir sur une branche existante permet de sortir de l’état detached HEAD
ours et theirs changent entre merge et rebase
- Lors de la résolution de conflits,
git checkout --ours file.txtchoisit la version “ours”, mais la référence de merge et de rebase n’est pas la même - Avec merge, la branche courante est
ours, et la branche que l’on fusionne esttheirs- Exemple : après
git checkout merge-into-ours, si l’on exécutegit merge from-theirs, la branche courante estours
- Exemple : après
- Avec rebase, la branche courante est
theirs, et la branche cible du rebase estours- Exemple : après
git checkout theirs, si l’on exécutegit rebase ours, la branche cible devientours
- Exemple : après
- Cette différence est liée au fait que
git rebase mainconsiste en interne à fusionner de façon répétée les commits de la branche courante sur une copie de la branchemain- Voir à ce sujet ce script shell qui implémente
git rebaseavecgit merge
- Voir à ce sujet ce script shell qui implémente
- ourstheirs explique brièvement la terminologie
oursettheirs- Dans VSCode, “current change” et “incoming change” peuvent prêter à la même confusion
Messages d’état distant et fast-forward
Your branch is up to date with 'origin/main'ne veut pas dire que la branche courantemainreflète nécessairement le dernier état du dépôt distant- Cela signifie seulement que la branche locale est identique à
origin/maintel qu’il était au moment du derniergit fetchougit pull - Si le dernier fetch date d’il y a 5 jours, cela veut dire qu’elle est « à jour selon l’état d’il y a 5 jours »
- Cela signifie seulement que la branche locale est identique à
- Git enregistre dans le reflog des informations sur le moment du dernier fetch, mais le message d’état n’indique pas « à la date du dernier fetch »
can be fast-forwardedsignifie que la branche distante est en avance sur la branche locale et qu’il n’y a aucun commit local supplémentaire, si bien qu’il suffit de déplacer le pointeur vers l’avant- Exemple : si
mainvautA-B-Cetorigin/mainvautA-B-C-D-E, alors aprèsgit pull, les deux deviennentA-B-C-D-E - Dans ce cas, il ne peut pas y avoir de conflit de fusion
- Exemple : si
- Si le fast-forward est impossible, c’est que les deux branches ont divergé
- Exemple : si
maincontient un commitXabsent deorigin/main, tandis queorigin/maincontientDetEabsents demain, le fast-forward n’est pas possible - Git indique alors que les deux branches ont divergé et précise le nombre de commits propres à chacune
- Exemple : si
Syntaxe de sélection de commits : ^, ~, .., ...
HEAD^etHEAD~pointent tous deux vers le commit précédent d’un cranHEAD^^^,HEAD~~~etHEAD~3désignent tous le commit situé trois niveaux plus haut
- Pour un merge commit, c’est-à-dire un commit à plusieurs parents,
HEAD^2etHEAD^3ont un sens différentHEAD^désigne le premier parentHEAD^2désigne le deuxième parentHEAD^3désigne le troisième parentHEAD~3signifie le parent du parent du parent, ce qui est différent deHEAD^3
git log main..testetgit log main...testse comportent eux aussi différemmentmain..testaffiche les commits présents uniquement danstesttest..mainaffiche les commits présents uniquement dansmainmain...testaffiche les commits présents d’un côté ou de l’autre, mais pas communs aux deux
- Dans
git diff,..et...sont interprétés autrement que dansgit loggit diff test..maincompare en incluant à la fois les changements detestet ceux demaingit diff test...maincompare l’ancêtre commun avec l’extrémité demain, et n’affiche donc qu’un diff unilatéral
- Cette confusion autour de la notation par points est aussi abordée dans pain in dots
reference, refspec, tree-ish
- Dans Git, reference est employé avec plusieurs sens
- des branches et tags comme
mainouv0.2 HEAD, qui pointe vers la branche courante- des expressions comme
HEAD^^^, interprétées comme des identifiants de commit
- des branches et tags comme
- La documentation Git appelle plus rigoureusement des expressions comme
HEAD^^^des “revision parameters”, mais dans l’usage courant elles peuvent être traitées comme des références - Une symbolic reference est une référence qui pointe vers une autre référence, comme
HEADHEADest une notion centrale, qui influence fortement le comportement des commandes de base de Git
- La configuration des remotes dans
.git/configcontient des refspec- Exemple :
+refs/heads/main:refs/remotes/origin/main - Dans la pratique, on utilise souvent telle quelle la valeur créée automatiquement par
git cloneougit remote add
- Exemple :
tree-ishdésigne ce qui peut être utilisé commeTHINGdansgit checkout THING .- un identifiant de commit
- une référence de commit comme
main,HEAD^^ouv0.3.2 - un sous-répertoire dans un commit, comme
main:./docs - En pratique, on peut souvent le comprendre comme « un commit ou une référence vers un commit »
index, staged, cached
index,stagedetcachedsont tous liés à.git/index.git/indexest le fichier utilisé lorsquegit addplace des modifications en staging
- Plusieurs formulations pour le même objet sont dispersées dans différentes commandes
git diff --cachedgit rm --cachedgit diff --staged.git/index
- En revanche, les options
--indexet--cachedn’ont pas toujours exactement le même sens- Un article de Junio Hamano, mainteneur principal de Git, en explique les détails
- Pour des raisons de performance, l’index répertorie aussi les untracked files, mais on ne considère généralement pas que la staging area inclut les untracked files
reset, revert, restore
reset,revertetrestoresont des mots proches, mais ils n’agissent pas sur les mêmes éléments dans Gitgit revert COMMITcrée sur la branche courante un nouveau commit qui annule les effets deCOMMIT- Si
COMMITa ajouté 3 lignes, le nouveau commit supprimera ces 3 lignes
- Si
git reset --hard COMMITramène de force la branche courante à l’état du commitCOMMIT- C’est une opération très dangereuse, car elle supprime les changements apparus après
COMMIT
- C’est une opération très dangereuse, car elle supprime les changements apparus après
git restore --source=COMMIT PATHrétablit les fichiers dePATHdans l’état où ils étaient dansCOMMIT- Cela ne modifie ni les autres fichiers ni l’historique des commits
- Utilisés seuls,
git reset --hardetgit restore .ont souvent un comportement proche, maisgit reset --hard COMMITetgit restore --source COMMIT .font en réalité des choses totalement différentes
track, remote-tracking branch, untracked files
- Git emploie le mot track de trois manières différentes
- Dans
git status,Untracked files:désigne les fichiers que Git ne gère pas et qui ne font partie d’aucun commit - Une remote-tracking branch comme
origin/mainest une référence locale qui contient l’identifiant du commit pointé parmainsur le remoteoriginau moment du derniergit pullougit fetch - Une branche locale peut être configurée pour track une branche distante, comme dans “branch foo set up to track remote branch bar from origin”
- Dans
- Dire que
mainest une branche qui suit un remote et dire queorigin/mainest une remote-tracking branch, ce n’est pas la même chose mainest une vraie branche : on peut y créer des commits et y faire des merge- Si
.git/configest configuré pour suivre lemaindistant, alorsgit pulletgit pushdeviennent plus simples à utiliser
- Si
origin/main, malgré son nom de “remote-tracking branch”, n’est pas une branche ordinaire- On ne peut pas y commit directement
- Elle n’est mise à jour que lorsque
git pullougit fetchrapatrie le dernier état dumaindistant
checkout, reflog, merge/rebase/cherry-pick
git checkoutregroupe deux opérations différentes dans une seule commandegit checkout BRANCHchange de branchegit checkout file.txtabandonne les modifications non indexées defile.txt
- Pour réduire cette confusion, Git a séparé ces fonctions en
git switchetgit restore, mais l’ancienne commandecheckoutreste toujours disponible reflogsignifie reference log et enregistre ce qu’une référence pointait dans le passé- reference est un terme générique qui inclut branches, tags et
HEAD - Le reflog peut aider à se sortir de situations Git très mauvaises, par exemple si l’on a supprimé par erreur une branche importante
- reference est un terme générique qui inclut branches, tags et
- merge, rebase et cherry-pick diffèrent par leur façon de combiner des commits
- merge crée un nouveau commit qui fusionne deux branches
- rebase copie un par un les commits de la branche courante au-dessus de la branche cible
- cherry-pick ressemble à rebase, mais avec une syntaxe différente, et copie des commits sur la branche courante
git rebase --onto main otherbranch mybranchpeut servir à déplacer seulement une partie des commits demybranchau-dessus demain- Dans la structure d’exemple, cela peut s’utiliser si l’on veut rebaser seulement
FetGsurmain - La syntaxe, avec trois noms de branche, est difficile à mémoriser
- Dans la structure d’exemple, cela peut s’utiliser si l’on veut rebaser seulement
commit et autres termes déroutants
- Dans Git,
commits’emploie à la fois comme verbe et comme nom- Verbe : « faites des commit fréquents »
- Nom : le commit le plus récent de
main
- Un commit Git peut se comprendre de trois façons
- comme un snapshot de l’état courant de tous les fichiers
- comme un diff par rapport au commit parent
- comme une history de tous les commits précédents
- Selon la commande, Git traite le commit différemment
git showtraite un commit comme un diffgit logtraite un commit comme de l’historiquegit restoretraite un commit comme un snapshot
blob,tree,origin,upstream,downstream, la relation entrefetchetpull, ainsi questash,worktree,subtreeetsubmodulefont aussi partie des termes Git souvent source de confusion- Côté GitHub, “pull request”, “squash and merge” et “rebase and merge” sont aussi souvent cités comme terminologie déroutante
Les trois grands axes de confusion récurrents
- Les termes Git particulièrement déroutants se résument surtout à trois points
headest une branche, etHEADest la branche courante- “remote tracking branch” et “branch that tracks a remote” sont deux choses différentes
index,stagedetcacheddésignent tous le même objet
- L’article de 2012 the most confusing git terminology explique aussi comment la terminologie Git se rattache à celle de CVS et Subversion
- La confusion terminologique dans Git ne concerne pas seulement quelques fonctions rares, mais revient dans l’ensemble de ses fonctionnalités centrales
- En particulier, quand on parle de branches, le mot “tracking” est utilisé de plusieurs façons, ce qui rend la différence difficile à percevoir au premier abord
- Certaines explications incluent des recoins peu utilisés de Git, avec la réserve qu’il peut donc subsister quelques erreurs
1 commentaires
Avis de Hacker News
Les noms de branches,
HEADet les tags sont tous des pointeurs.HEADpointe vers le commit que l’on est en train de regarder, et un nom de branche commemy-featurepointe vers le dernier commit de cette branche. Si l’on faitgit checkout -b my-featuredepuismain, alorsmain,my-featureetHEADpointent tous vers le dernier commit demain.Chaque fois que l’on commit sur
my-branch,HEADetmy-branchse déplacent pour pointer vers le nouveau commit. Un detached HEAD signifie qu’aucune branche ne pointe vers le commit vers lequelHEADpointe. La différence entre un tag et une branche, c’est qu’un tag pointe vers un commit précis et ne bouge pas.Une autre chose qui m’a dérouté, c’est que beaucoup de commandes semblent incohérentes parce que Git suppose des arguments par défaut.
git checkout file.txtéquivaut àgit checkout HEAD -- file.txt, et quand on est surmy-branch,git rebase mainéquivaut àgit rebase main my-branch. La seconde forme peut toutefois être exécutée depuis une autre branche.Enfin, quand tout part de travers, la commande qui permet de sortir de n’importe quel état bizarre, c’est
git reflog. Elle montre tous les commits vers lesquelsHEADa pointé. Cela dit, c’est agréable de voir Git reconnaître cette confusion et créer des commandes avec une interface moins surprenante et plus simple.reflog.Autre point auquel beaucoup d’utilisateurs de Git ne pensent pas forcément : les refs de branches ou de tags distants récupérés sont aussi toutes des refs, et on peut donc les référencer partout où un nom de ref est accepté.
Par exemple, si l’on veut dire « peu m’importe ce qu’il y a dans cette branche, ne fais ni fast-forward, ni merge, ni rebase, écrase simplement la branche locale avec le contenu distant », on peut faire ceci :
git checkout foo,git reset --hard origin/foo.HEADne pointe pas directement vers un commit ; en général, il pointe vers un pointeur de branche commemy-branch, et ce pointeur de branche pointe vers le commit. L’état detached HEAD est l’exception.Quand on commit sur
my-branch,HEADetmy-branchne se déplacent pas tous les deux vers le nouveau commit :HEADcontinue de pointer vers le pointeurmy-branch, et seulmy-branchse déplace pour pointer vers le nouveau commit. Bien sûr, si l’on suitHEADpuismy-branchjusqu’au commit, on arrive bien au nouveau commit.Un detached HEAD est un état dans lequel
HEADpointe directement vers un commit au lieu d’un pointeur de branche. Même en detached HEAD,HEADet le pointeur de branche peuvent tous deux pointer vers le commit le plus récent. Avecgit log --decorate, au lieu du classique(HEAD -> my-branch), on voit alors généralement quelque chose comme(HEAD, my-branch)sur le commit le plus récent.En revanche, les tags annotés peuvent contenir un message, un timestamp, un SHA, etc. Ce sont de véritables objets Git et ils se comportent assez comme des objets commit, mais ils référencent généralement tout de même un autre objet Git, le plus souvent un commit.
git rev-parse HEADet de copier la chaîne obtenue dans un endroit sûr avant de commencer une procédure délicate avec beaucoup de conflits ou plusieurs déplacements.On a alors l’assurance d’avoir marqué précisément le dernier état dont on est sûr qu’il était correct. On peut généralement revenir au dernier état correct, et non à un point déjà situé plusieurs étapes dans le chaos. À condition, bien sûr, de ne pas avoir utilisé sans précaution des choses comme
git gcougit filter-branch.Cela sonne comme une blague, mais ce n’en est pas vraiment une : dire qu’il faut vraiment un diplôme d’informatique pour utiliser Git n’est pas complètement faux. Je suis d’accord pour dire que les arguments par défaut de Git produisent une expérience utilisateur très incohérente.
git checkout .,git reset --hard/soft,git cleanupont tous l’air très similaires, mais en réalité ils sont très différents. Cela dit, je préfère toujours Git à Perforce ou SVN. À une époque, j’aimais un peu plus Mercurial, mais je ne sais pas si ce serait encore le cas aujourd’hui.git reflogest roi et montre la vérité.Je me souviens avoir lu que Linus Torvalds avait été surpris que les gens commencent à utiliser Git directement sans ajouter par-dessus une couche plus conviviale. Si le secteur était capable d’introspection, il reconnaîtrait que choisir Git a été une erreur et passerait à un autre système de gestion de versions. Au lieu de gaspiller un temps fou dans un outil qui ne fait que stocker du texte.
Bien sûr, il pourrait être meilleur. Mais la haine que reçoit Git me surprend toujours. Git est un outil remarquable, et il est très en avance sur des outils destinés aux non-développeurs comme Word ou Google Docs.
C’est peut-être parce que je suis assez vieux pour me souvenir de l’époque où Subversion régnait.
Chaque semaine, je vois des collègues se perdre à cause de Git, des demandes d’aide en ligne, et encore des articles comme celui-ci qui tentent de réexpliquer quelque chose qui devrait être simple.
Je ne me souviens pas avoir vu, en codant, des gens perdre des heures à défaire le bazar qu’ils avaient créé avec SVN, TFVC, Perforce, etc.
Les outils existent pour rendre la vie plus facile. S’ils n’y arrivent pas, ils ne valent pas le temps qu’on y consacre.
J’aimerais qu’il existe encore une telle diversité. La monoculture Git signifie aussi que toute tentative de remplacer Git doit d’abord réimplémenter Git. On se retrouve donc presque éternellement liés à Git, comme à l’ASCII ou à la touche Scroll Lock.
La principale inquiétude est que GitHub soit tellement bon que nous resterons attachés à Git, à moins que GitHub ne découple Git du moteur de gestion de texte et n’autorise d’autres moteurs.
https://trolololo.xyz/github
https://news.ycombinator.com/item?id=38098109
Ce sont des termes qui relèvent d’une abstraction fuyante.
cache, ce qui était le terme le plus informatique.Ensuite, Junio l’a apparemment renommé
index, un terme plus spécifique aux systèmes de gestion de versions distribués, et la plupart des utilisateurs l’ont appelé staging area. Désormais, cette évolution terminologique est fossilisée dans l’UI et les entrailles de Git.pullà chaque fois.origin/masterne désigne pas le master qui se trouve sur origin, mais le commit vers lequel pointait le dernierorigin/masterconnu. Cette valeur est mise à jour lors d’unfetch, etpulleffectue automatiquement unfetch.Si tu fais
ls -l .git/refs/remotes/origin/master, tu verras queorigin/mastern’est qu’un fichier sur ton système. Tu peux aussi voir quand il a changé. Il ne se met pas à jour magiquement.S’il y a des changements quand tu fais
git fetch origin, l’horodatage et le contenu changent. Tu peux le vérifier aveccat .git/refs/remotes/origin/master.Les bases de Git sont très simples : on peut implémenter les structures de données centrales et quelques opérations en une journée. C’est vraiment précieux de le savoir. D’une manière ou d’une autre, Git a réussi à construire une interface utilisateur très complexe au-dessus d’un noyau plutôt simple.
master. En général, soit je ne peux pas pousser versmaster, soit je ne veux de toute façon pas travailler directement surmaster. Dans ce cas, il n’y a aucune raison de garder une branche localemastermodifiable.Il suffit donc de mettre à jour
origin/master, etfetchsuffit pour ça.git fetch && git pullJ’attends avec impatience de prendre ma retraite dans 3 ans et de me débarrasser de ce tas de déchets cassé.
git status, et ajouter le flag--porcelainaide vraiment. Il produit une sortie plus concise et plus facile à parser par programme.En me demandant combien d’autres commandes avaient une sortie plus lisible par machine, j’ai fini par consulter la page « Git Internals - Plumbing and Porcelain » de git-scm. En résumé, Git a été écrit au départ moins comme un système de gestion de versions sophistiqué que comme une boîte à outils pour gérer la gestion de versions.
Beaucoup de personnes qui utilisaient Git dès le début ont appris les tâches de gestion de versions avec ces commandes de bas niveau, puis ont transmis ces workflows à d’autres. C’est la couche plumbing. Plus tard, Git a créé une couche plus polie, appelée porcelain.
Je ne sais pas encore parfaitement quelles commandes appartiennent à quelle couche, mais cela m’a aidé à comprendre les nouveaux workflows recommandés ces dernières années. Cela me permet aussi de mieux juger quand je change mon propre workflow.
https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Po...
Malheureusement, pour rendre cette UI plus rapide, ils l’ont codée en dur, sans l’améliorer.
Avec le recul, quand j’ai commencé, ça devait être extrêmement déroutant, mais je pense que je faisais semblant que non pour avoir l’air cool.
https://news.ycombinator.com/item?id=28143078
« Your branch is up to date with ‘origin/main’ » est en fait un peu trompeur. On peut comprendre que la branche
mainest à jour, mais en réalité ce n’est pas le cas.Cela dit, inutile d’y aller trop fort sur le « techniquement parlant ». Le problème des deux généraux ne s’applique-t-il pas ici ? Si l’on veut vraiment être pointilleux, on ne peut pas savoir si c’est « à jour » à cet instant précis. Même si l’on fait un
fetchavantstatus, c’est pareil.Alors, quelle serait une attente raisonnable ? Simplement que la ref dans la base d’objets de ma machine était identique, lors de la dernière vérification, à la ref d’une autre base d’objets lointaine.
Un simple appel à
statusne peut pas faire unfetchréseau, ni rappeler à chaque fois les principes de base de l’outil qu’on utilise. C’est en tout cas mon avis. Pourtant, étonnamment, beaucoup de commentaires de la réponse StackOverflow semblent estimer que ces deux choses sont nécessaires.Une formulation comme « is up to date with the origin’s main as of your last fetch 5 days ago » serait plus raisonnable, car elle indique seulement depuis combien de temps le dernier
fetcha eu lieu.[1] https://stackoverflow.com/questions/27828404/why-does-git-st...
Autre point : je pensais que
ORIG_HEADavait un rapport avec la « head d’origin », commeFETCH_HEAD. Mais non. Cette « pseudoref » semble servir de point de sauvegarde avant des réécritures plus complexes comme un rebase, et elle a été implémentée avant l’existence du reflog. Cela veut probablement dire « original head ».« Your branch is up to date with ‘origin/main’ » est techniquement correct, mais l’expression up to date, lue rapidement, suggère deux choses : que
mainest identique àorigin/main, et queorigin/mainest lui aussi à jour, c’est-à-dire qu’il a été actualisé pendant la commande ou qu’il est maintenu automatiquement à jour et que la synchronisation récente a réussi.Ce n’est pas un signal lisible par une machine qui doit être vrai pendant un cycle CPU, mais un message d’état affiché à l’utilisateur. Même sans invoquer la théorie des réseaux, cette interprétation est raisonnable.
« Up to date » évoque davantage le fait d’avoir rattrapé quelque chose dans le temps que dans l’espace. La position d’une branche locale relève plutôt de l’espace — « où pointe cette branche ? » — tandis que l’état d’une ref distante relève plutôt du temps — « quand ai-je mis à jour la ref distante pour la dernière fois ? ». Bien sûr, c’est très subjectif et les deux peuvent se comprendre dans les deux sens.
De meilleures formulations pourraient être « Your branch matches origin/main », « Your branch’s head is the same as origin/main », ou « Your branch is pointing to the same commit as origin/main ». C’est un compromis entre clarté et verbosité. On pourrait aussi y ajouter entre parenthèses, comme le propose l’auteur, « remote ref last updated 5 days ago ».
statusfasse unfetchréseau serait agaçant. À mon avis, les opérations réseau doivent être explicites, pas implicites. Quand je faisgit status, je veux connaître l’état de mon dépôt sur le système de fichiers.Si je veux savoir ce qui se passe sur un autre remote, je peux faire moi-même un
fetch, puis comparer.statusest lancée. Il peut y avoir une condition de concurrence pendant que les informations sont affichées dans le terminal, mais la fenêtre temporelle est très réduite.En pratique, cela signifie généralement qu’on veut un
fetch. Le problème des deux généraux ne s’applique qu’au côté distant. Si le remote ne reçoit pas confirmation que le client a bien reçu les données, il peut continuer à les retransmettre pendant un moment. Ce n’est pas le problème du client.Si le client ne reçoit pas les données du serveur, le bon comportement serait probablement de rester bloqué puis d’afficher une erreur après un timeout, ce que
fetchfait sans doute déjà aujourd’hui.Cet outil est souvent partagé, et il convient très bien ici aussi. Il visualise le modèle interne de Git et l’effet de plusieurs commandes.
https://learngitbranching.js.org/
Les 10 minutes passées avec cet outil m’ont appris davantage que mes quelque 10 années d’expérience avec Git auparavant. Je le recommande vivement.
« pull » désigne l’action de fusionner des changements distants dans un dépôt local. Ce que l’utilisateur demande réellement, c’est que le serveur fusionne ses changements distants dans une branche. Le terme « merge request » de GitLab est le bon.
J’ai déjà vu quelqu’un faire un
fetchet voir des commits disparaître. Ils avaient été masqués parce que le dépôt était revenu en arrière dans le temps. Git cache ce genre de détails dansstatus, et si l’on n’utilise pasgit-promptoupowerline-shell, on travaille dans le noir.git-request-pull(1), était que nous ayons tous chacun notre dépôt Git quelque part comme kernel.org/git ou redhat.com/git, et que nous demandions par e-mail à d’autres de pull depuis des dépôts situés sur des serveurs, organisations et domaines différents.GitHub s’est inspiré de la commande
request-pullde Git, mais l’a réinterprétée comme une fusion d’un dépôt GitHub vers un autre dépôt GitHub.En tout cas, c’est ainsi que je l’ai toujours lu.
En résumé, ce n’est pas une requête faite à un serveur, mais à une autre personne. On demande à quelqu’un de pull sa branche pour examiner les changements que l’on souhaite contribuer au projet.
[0] https://git-scm.com/book/en/v2/Distributed-Git-Contributing-...