[{"data":1,"prerenderedAt":535},["ShallowReactive",2],{"page-\u002Fgit\u002Ftravailler-a-plusieurs":3,"pieces-git":492,"autour-\u002Fgit\u002Ftravailler-a-plusieurs":517,"prerequis-\u002Fgit\u002Ftravailler-a-plusieurs":522,"plan-git":524},{"id":4,"title":5,"body":6,"description":464,"extension":465,"ligne":91,"meta":466,"motsCles":467,"navigation":471,"niveau":472,"path":473,"prerequis":474,"ressources":476,"seo":485,"sources":486,"stem":490,"__hash__":491},"docs\u002Fgit\u002F04.travailler-a-plusieurs.md","Travailler à plusieurs",{"type":7,"value":8,"toc":447},"minimark",[9,14,40,44,53,56,62,66,71,74,105,108,123,127,134,149,159,163,183,186,190,207,210,228,237,241,245,257,266,271,289,297,301,313,328,340,344,350,379,385,397,401,443],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,37],"ul",{},[18,19,20],"li",{},"Ce qu'est un dépôt distant et comment le relier à ton projet.",[18,22,23,24,28,29,32,33,36],{},"Envoyer tes commits avec ",[25,26,27],"code",{},"git push"," et récupérer ceux des autres avec ",[25,30,31],{},"git fetch"," et ",[25,34,35],{},"git pull",".",[18,38,39],{},"Le principe d'une pull request sur GitHub.",[10,41,43],{"id":42},"le-dépôt-distant","Le dépôt distant",[45,46,47,48,52],"p",{},"Jusqu'ici, tout se passait sur ton ordinateur. Pour travailler à plusieurs, il faut une copie partagée du dépôt : le dépôt distant (",[49,50,51],"em",{},"remote","). Il est le plus souvent hébergé sur un service comme GitHub ou GitLab.",[45,54,55],{},"Chacun garde son propre dépôt local, avec l'historique complet. Le dépôt distant sert de point de rendez-vous : on y envoie ses commits, on y récupère ceux des autres.",[45,57,58,59,36],{},"Par convention, le dépôt distant principal s'appelle ",[25,60,61],{},"origin",[10,63,65],{"id":64},"deux-façons-de-commencer","Deux façons de commencer",[67,68,70],"h3",{"id":69},"tu-as-déjà-un-projet-local","Tu as déjà un projet local",[45,72,73],{},"Crée un dépôt sur GitHub (« New repository ») sans y ajouter de README : il doit rester vide pour recevoir ton historique. GitHub affiche alors son adresse. Relie ton projet à cette adresse :",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","git remote add origin https:\u002F\u002Fgithub.com\u002Fton-compte\u002Fportfolio.git\n","bash","",[25,82,83],{"__ignoreMap":80},[84,85,88,92,96,99,102],"span",{"class":86,"line":87},"line",1,[84,89,91],{"class":90},"sIXEE","git",[84,93,95],{"class":94},"shWOn"," remote",[84,97,98],{"class":94}," add",[84,100,101],{"class":94}," origin",[84,103,104],{"class":94}," https:\u002F\u002Fgithub.com\u002Fton-compte\u002Fportfolio.git\n",[45,106,107],{},"Pour vérifier les dépôts distants connus :",[75,109,111],{"className":77,"code":110,"language":79,"meta":80,"style":80},"git remote -v\n",[25,112,113],{"__ignoreMap":80},[84,114,115,117,119],{"class":86,"line":87},[84,116,91],{"class":90},[84,118,95],{"class":94},[84,120,122],{"class":121},"s5iOY"," -v\n",[67,124,126],{"id":125},"le-projet-existe-déjà-en-ligne","Le projet existe déjà en ligne",[45,128,129,130,133],{},"Tu rejoins un projet existant, par exemple le site d'une association. Tu le récupères avec ",[25,131,132],{},"git clone"," :",[75,135,137],{"className":77,"code":136,"language":79,"meta":80,"style":80},"git clone https:\u002F\u002Fgithub.com\u002Fasso\u002Fsite-asso.git\n",[25,138,139],{"__ignoreMap":80},[84,140,141,143,146],{"class":86,"line":87},[84,142,91],{"class":90},[84,144,145],{"class":94}," clone",[84,147,148],{"class":94}," https:\u002F\u002Fgithub.com\u002Fasso\u002Fsite-asso.git\n",[45,150,151,152,155,156,158],{},"Git crée un dossier ",[25,153,154],{},"site-asso",", télécharge tout l'historique et configure ",[25,157,61],{}," tout seul. Tu peux travailler tout de suite.",[10,160,162],{"id":161},"envoyer-tes-commits-git-push","Envoyer tes commits : git push",[75,164,166],{"className":77,"code":165,"language":79,"meta":80,"style":80},"git push -u origin main\n",[25,167,168],{"__ignoreMap":80},[84,169,170,172,175,178,180],{"class":86,"line":87},[84,171,91],{"class":90},[84,173,174],{"class":94}," push",[84,176,177],{"class":121}," -u",[84,179,101],{"class":94},[84,181,182],{"class":94}," main\n",[45,184,185],{},"Décortiquons cette commande :",[187,188],"anatomie-commande",{"exemple":189},"git-push",[45,191,192,193,196,197,200,201,203,204,206],{},"L'option ",[25,194,195],{},"-u"," relie ta branche locale ",[25,198,199],{},"main"," à la branche ",[25,202,199],{}," du dépôt distant. Tu ne l'utilises que la première fois. Ensuite, un simple ",[25,205,27],{}," suffit.",[45,208,209],{},"Pour publier une autre branche, même principe :",[75,211,213],{"className":77,"code":212,"language":79,"meta":80,"style":80},"git push -u origin recherche\n",[25,214,215],{"__ignoreMap":80},[84,216,217,219,221,223,225],{"class":86,"line":87},[84,218,91],{"class":90},[84,220,174],{"class":94},[84,222,177],{"class":121},[84,224,101],{"class":94},[84,226,227],{"class":94}," recherche\n",[229,230,231],"note",{},[45,232,233,234,236],{},"Si quelqu'un a poussé des commits que tu n'as pas encore, Git refuse ton ",[25,235,27],{},". Il ne veut pas écraser leur travail. Récupère d'abord leurs commits, intègre-les, puis pousse à nouveau.",[10,238,240],{"id":239},"récupérer-le-travail-des-autres","Récupérer le travail des autres",[67,242,244],{"id":243},"git-fetch-regarder-sans-toucher","git fetch : regarder sans toucher",[75,246,248],{"className":77,"code":247,"language":79,"meta":80,"style":80},"git fetch\n",[25,249,250],{"__ignoreMap":80},[84,251,252,254],{"class":86,"line":87},[84,253,91],{"class":90},[84,255,256],{"class":94}," fetch\n",[45,258,259,261,262,265],{},[25,260,31],{}," télécharge les nouveaux commits du dépôt distant et met à jour les branches de suivi, comme ",[25,263,264],{},"origin\u002Fmain",". Ces branches reflètent l'état du dépôt distant lors de ta dernière synchronisation.",[45,267,268,270],{},[25,269,31],{}," ne modifie pas ta branche courante ni tes fichiers. Tu peux donc regarder ce qui est arrivé avant de l'intégrer :",[75,272,274],{"className":77,"code":273,"language":79,"meta":80,"style":80},"git log --oneline main..origin\u002Fmain\n",[25,275,276],{"__ignoreMap":80},[84,277,278,280,283,286],{"class":86,"line":87},[84,279,91],{"class":90},[84,281,282],{"class":94}," log",[84,284,285],{"class":121}," --oneline",[84,287,288],{"class":94}," main..origin\u002Fmain\n",[45,290,291,292,294,295,36],{},"Cette commande liste les commits présents sur ",[25,293,264],{}," mais pas encore sur ta branche ",[25,296,199],{},[67,298,300],{"id":299},"git-pull-récupérer-et-intégrer","git pull : récupérer et intégrer",[75,302,304],{"className":77,"code":303,"language":79,"meta":80,"style":80},"git pull\n",[25,305,306],{"__ignoreMap":80},[84,307,308,310],{"class":86,"line":87},[84,309,91],{"class":90},[84,311,312],{"class":94}," pull\n",[45,314,315,317,318,320,321,32,324,327],{},[25,316,35],{}," fait un ",[25,319,31],{},", puis intègre les changements récupérés dans ta branche courante. Cette intégration se fait par fusion ou par rebase, selon la configuration (réglages ",[25,322,323],{},"pull.rebase",[25,325,326],{},"pull.ff","). Si les mêmes lignes ont été modifiées des deux côtés, tu retrouves les conflits vus au chapitre sur les branches, et ils se résolvent de la même façon.",[329,330,331],"tip",{},[45,332,333,334,336,337,339],{},"Commence ta séance de travail par un ",[25,335,35],{}," sur ",[25,338,199],{},". Tu pars ainsi de la version la plus récente, et tu limites les conflits.",[10,341,343],{"id":342},"la-pull-request","La pull request",[45,345,346,347,349],{},"Sur un projet d'équipe, on évite de pousser directement sur ",[25,348,199],{},". La méthode habituelle :",[351,352,353,359,365,370,373],"ol",{},[18,354,355,356,36],{},"Tu crées une branche, par exemple ",[25,357,358],{},"formulaire-contact",[18,360,361,362,36],{},"Tu fais tes commits dessus, puis tu la pousses avec ",[25,363,364],{},"git push -u origin formulaire-contact",[18,366,367,368,36],{},"Sur GitHub, tu ouvres une pull request : une demande de fusion de ta branche dans ",[25,369,199],{},[18,371,372],{},"Tes collègues relisent les changements, commentent, demandent des corrections. Chaque nouveau commit poussé sur la branche s'ajoute à la pull request.",[18,374,375,376,378],{},"Une fois validée, la pull request est fusionnée dans ",[25,377,199],{}," depuis GitHub.",[45,380,381,382,36],{},"La pull request n'est pas une commande Git : c'est une fonction de GitHub. GitLab propose la même chose sous le nom de ",[49,383,384],{},"merge request",[386,387,388],"warning",{},[45,389,390,393,394,396],{},[25,391,392],{},"git push --force"," remplace l'historique du dépôt distant par le tien. Sur une branche partagée, il peut effacer le travail de tes collègues. Ne l'utilise jamais sur ",[25,395,199],{}," ni sur une branche où d'autres travaillent.",[10,398,400],{"id":399},"à-retenir","À retenir",[15,402,403,409,418,426,437],{},[18,404,405,406,408],{},"Le dépôt distant, nommé ",[25,407,61],{}," par convention, est le point de rendez-vous de l'équipe.",[18,410,411,413,414,417],{},[25,412,132],{}," récupère un projet existant, ",[25,415,416],{},"git remote add"," relie un projet local à un dépôt distant.",[18,419,420,423,424,36],{},[25,421,422],{},"git push -u origin branche"," la première fois, puis ",[25,425,27],{},[18,427,428,430,431,433,434,436],{},[25,429,31],{}," met à jour ",[25,432,264],{}," sans toucher ta branche, ",[25,435,35],{}," récupère puis intègre.",[18,438,439,440,442],{},"Une pull request propose de fusionner une branche dans ",[25,441,199],{}," après relecture.",[444,445,446],"style",{},"html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}",{"title":80,"searchDepth":448,"depth":449,"links":450},2,3,[451,452,453,457,458,462,463],{"id":12,"depth":448,"text":13},{"id":42,"depth":448,"text":43},{"id":64,"depth":448,"text":65,"children":454},[455,456],{"id":69,"depth":449,"text":70},{"id":125,"depth":449,"text":126},{"id":161,"depth":448,"text":162},{"id":239,"depth":448,"text":240,"children":459},[460,461],{"id":243,"depth":449,"text":244},{"id":299,"depth":449,"text":300},{"id":342,"depth":448,"text":343},{"id":399,"depth":448,"text":400},"Relier ton dépôt à un dépôt distant, cloner, envoyer et récupérer des commits avec push, fetch et pull, et proposer tes changements par pull request.","md",{},[51,468,61,132,27,31,35,469,470],"dépôt distant","GitHub","pull request",true,"intermediaire","\u002Fgit\u002Ftravailler-a-plusieurs",[475],"\u002Fgit\u002Fbranches",[477,481],{"nom":478,"url":479,"type":480},"Pro Git en français (2e édition, 2014), chapitres « Les branches avec Git » et « GitHub »","https:\u002F\u002Fgit-scm.com\u002Fbook\u002Ffr\u002Fv2","doc",{"nom":482,"url":483,"type":484},"OpenClassrooms, Gérez du code avec Git et GitHub","https:\u002F\u002Fopenclassrooms.com\u002Ffr\u002Fcourses\u002F7162856-gerez-du-code-avec-git-et-github","cours",{"title":5,"description":464},[487],{"nom":488,"url":489},"Documentation de référence Git (en anglais)","https:\u002F\u002Fgit-scm.com\u002Fdocs","git\u002F04.travailler-a-plusieurs","hSwRnDIKN5JvFHlFXa_FKfzLAbg0RYoZ3t4oxlOE5L0",[493,497,501,504,505,509,513],{"path":494,"title":495,"stem":496},"\u002Fgit\u002Fpourquoi-git","Pourquoi Git","git\u002F01.pourquoi-git",{"path":498,"title":499,"stem":500},"\u002Fgit\u002Fpremiers-commits","Premiers commits","git\u002F02.premiers-commits",{"path":475,"title":502,"stem":503},"Les branches","git\u002F03.branches",{"path":473,"title":5,"stem":490},{"path":506,"title":507,"stem":508},"\u002Fgit\u002Fannuler","Annuler une erreur","git\u002F05.annuler",{"path":510,"title":511,"stem":512},"\u002Fgit\u002Frebase","Le rebase","git\u002F06.rebase",{"path":514,"title":515,"stem":516},"\u002Fgit","Git","git\u002Findex",[518,520],{"title":502,"path":475,"stem":503,"description":519,"children":-1},"Créer une branche pour travailler à part, changer de branche, fusionner avec git merge, puis lire et résoudre un conflit.",{"title":507,"path":506,"stem":508,"description":521,"children":-1},"Annuler une modification, désindexer un fichier, corriger le dernier commit, revenir en arrière avec revert ou reset, sans réécrire un historique déjà poussé.",[523],{"path":475,"title":502,"ligne":91},[525,527,528,529,530,531,533],{"path":494,"title":495,"niveau":526,"stem":496},"debutant",{"path":498,"title":499,"niveau":526,"stem":500},{"path":475,"title":502,"niveau":526,"stem":503},{"path":473,"title":5,"niveau":472,"stem":490},{"path":506,"title":507,"niveau":472,"stem":508},{"path":510,"title":511,"niveau":532,"stem":512},"avance",{"path":514,"title":515,"niveau":534,"stem":516},"memo",1794583451225]