[{"data":1,"prerenderedAt":527},["ShallowReactive",2],{"page-\u002Fgit\u002Frebase":3,"pieces-git":485,"autour-\u002Fgit\u002Frebase":509,"prerequis-\u002Fgit\u002Frebase":513,"plan-git":516},{"id":4,"title":5,"body":6,"description":453,"extension":454,"ligne":85,"meta":455,"motsCles":456,"navigation":463,"niveau":464,"path":465,"prerequis":466,"ressources":469,"seo":478,"sources":479,"stem":483,"__hash__":484},"docs\u002Fgit\u002F06.rebase.md","Le rebase",{"type":7,"value":8,"toc":442},"minimark",[9,14,36,40,55,61,64,68,104,116,119,122,126,135,157,160,164,231,234,238,241,257,267,283,289,310,313,317,323,347,350,364,377,381,388,397,400,404,438],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,30,33],"ul",{},[18,19,20,21,25,26,29],"li",{},"Ce que fait ",[22,23,24],"code",{},"git rebase"," et en quoi il diffère de ",[22,27,28],{},"git merge",".",[18,31,32],{},"Quand le rebase rend service, et comment gérer un conflit pendant un rebase.",[18,34,35],{},"Pourquoi on ne rebase jamais une branche partagée.",[10,37,39],{"id":38},"le-point-de-départ","Le point de départ",[41,42,43,44,47,48,51,52,54],"p",{},"Tu travailles sur une branche ",[22,45,46],{},"profil",", qui ajoute une page de profil à ton site. Tu l'as créée depuis ",[22,49,50],{},"main",", puis tu as fait deux commits. Pendant ce temps, ",[22,53,50],{}," a reçu un correctif. Les deux histoires ont divergé.",[41,56,57,58,60],{},"Tu connais déjà une solution : ",[22,59,28],{},". Elle crée un commit de fusion qui réunit les deux branches. L'historique garde la trace exacte de ce qui s'est passé, avec ses embranchements.",[41,62,63],{},"Le rebase propose une autre solution.",[10,65,67],{"id":66},"ce-que-fait-git-rebase","Ce que fait git rebase",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","git switch profil\ngit rebase main\n","bash","",[22,76,77,93],{"__ignoreMap":74},[78,79,82,86,90],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"sIXEE","git",[78,87,89],{"class":88},"shWOn"," switch",[78,91,92],{"class":88}," profil\n",[78,94,96,98,101],{"class":80,"line":95},2,[78,97,85],{"class":84},[78,99,100],{"class":88}," rebase",[78,102,103],{"class":88}," main\n",[41,105,106,107,109,110,112,113,115],{},"Git prend les commits de ",[22,108,46],{}," qui ne sont pas sur ",[22,111,50],{},", et les rejoue un par un par-dessus le dernier commit de ",[22,114,50],{},". Tout se passe comme si tu avais créé ta branche à partir de la version la plus récente.",[41,117,118],{},"Point important : les commits rejoués sont de nouveaux commits. Leur contenu est le même, mais leur parent change, donc leur identifiant change aussi. Les anciens commits ne font plus partie d'aucune branche.",[41,120,121],{},"Avance pas à pas dans le schéma :",[123,124],"git-graphe",{"scenario":125},"rebase",[41,127,128,129,131,132,134],{},"Après le rebase, ",[22,130,50],{}," est un ancêtre direct de ",[22,133,46],{},". Une fusion se fait donc en avance rapide, sans commit de fusion :",[69,136,138],{"className":71,"code":137,"language":73,"meta":74,"style":74},"git switch main\ngit merge profil\n",[22,139,140,148],{"__ignoreMap":74},[78,141,142,144,146],{"class":80,"line":81},[78,143,85],{"class":84},[78,145,89],{"class":88},[78,147,103],{"class":88},[78,149,150,152,155],{"class":80,"line":95},[78,151,85],{"class":84},[78,153,154],{"class":88}," merge",[78,156,92],{"class":88},[41,158,159],{},"L'historique devient une ligne droite.",[10,161,163],{"id":162},"rebase-ou-merge","Rebase ou merge ?",[165,166,167,184],"table",{},[168,169,170],"thead",{},[171,172,173,176,180],"tr",{},[174,175],"th",{},[174,177,178],{},[22,179,28],{},[174,181,182],{},[22,183,24],{},[185,186,187,199,210,221],"tbody",{},[171,188,189,193,196],{},[190,191,192],"td",{},"Historique",[190,194,195],{},"garde les embranchements",[190,197,198],{},"linéaire",[171,200,201,204,207],{},[190,202,203],{},"Commits existants",[190,205,206],{},"inchangés",[190,208,209],{},"remplacés par de nouveaux",[171,211,212,215,218],{},[190,213,214],{},"Commit de fusion",[190,216,217],{},"oui, si les branches ont divergé",[190,219,220],{},"non",[171,222,223,226,229],{},[190,224,225],{},"Sans risque sur une branche partagée",[190,227,228],{},"oui",[190,230,220],{},[41,232,233],{},"Aucun des deux n'est meilleur dans l'absolu. Le merge dit la vérité sur ce qui s'est passé. Le rebase donne un historique plus facile à lire. Beaucoup d'équipes choisissent une règle commune : suis celle de ton projet.",[10,235,237],{"id":236},"quand-lutiliser","Quand l'utiliser",[41,239,240],{},"Le rebase sert surtout dans deux cas.",[41,242,243,247,248,250,251,253,254,256],{},[244,245,246],"strong",{},"Mettre ta branche à jour avant une pull request."," Ta branche ",[22,249,46],{}," est en retard sur ",[22,252,50],{},". Un rebase sur ",[22,255,50],{}," la remet à jour, et la relecture se fait sur une base récente. À condition que tu sois seul à travailler sur cette branche.",[41,258,259,262,263,266],{},[244,260,261],{},"Récupérer le travail des autres sans commit de fusion."," Quand tu fais ",[22,264,265],{},"git pull"," sur ta branche et que tes commits locaux ont divergé du dépôt distant, tu peux rejouer tes commits par-dessus ceux des autres :",[69,268,270],{"className":71,"code":269,"language":73,"meta":74,"style":74},"git pull --rebase\n",[22,271,272],{"__ignoreMap":74},[78,273,274,276,279],{"class":80,"line":81},[78,275,85],{"class":84},[78,277,278],{"class":88}," pull",[78,280,282],{"class":281},"s5iOY"," --rebase\n",[41,284,285,286,288],{},"Pour en faire le comportement par défaut de ",[22,287,265],{}," :",[69,290,292],{"className":71,"code":291,"language":73,"meta":74,"style":74},"git config --global pull.rebase true\n",[22,293,294],{"__ignoreMap":74},[78,295,296,298,301,304,307],{"class":80,"line":81},[78,297,85],{"class":84},[78,299,300],{"class":88}," config",[78,302,303],{"class":281}," --global",[78,305,306],{"class":88}," pull.rebase",[78,308,309],{"class":281}," true\n",[41,311,312],{},"Tes commits locaux n'ont encore été vus par personne : les réécrire ne gêne personne.",[10,314,316],{"id":315},"les-conflits-pendant-un-rebase","Les conflits pendant un rebase",[41,318,319,320,288],{},"Comme le rebase rejoue les commits un par un, un conflit peut apparaître sur l'un d'eux. Git s'arrête alors sur ce commit. Tu le résous comme pour une fusion : tu édites le fichier, tu retires les marqueurs, puis tu l'indexes. Ensuite, au lieu de ",[22,321,322],{},"git commit",[69,324,326],{"className":71,"code":325,"language":73,"meta":74,"style":74},"git add profil.html\ngit rebase --continue\n",[22,327,328,338],{"__ignoreMap":74},[78,329,330,332,335],{"class":80,"line":81},[78,331,85],{"class":84},[78,333,334],{"class":88}," add",[78,336,337],{"class":88}," profil.html\n",[78,339,340,342,344],{"class":80,"line":95},[78,341,85],{"class":84},[78,343,100],{"class":88},[78,345,346],{"class":281}," --continue\n",[41,348,349],{},"Git passe au commit suivant. Si tout devient confus, tu peux revenir à l'état d'avant le rebase :",[69,351,353],{"className":71,"code":352,"language":73,"meta":74,"style":74},"git rebase --abort\n",[22,354,355],{"__ignoreMap":74},[78,356,357,359,361],{"class":80,"line":81},[78,358,85],{"class":84},[78,360,100],{"class":88},[78,362,363],{"class":281}," --abort\n",[365,366,367],"tip",{},[41,368,369,370,373,374,29],{},"Si un rebase s'est mal terminé, ",[22,371,372],{},"git reflog"," retrouve l'ancien emplacement de ta branche, comme après un ",[22,375,376],{},"git reset",[10,378,380],{"id":379},"la-règle-jamais-sur-une-branche-partagée","La règle : jamais sur une branche partagée",[41,382,383,384,387],{},"Le rebase remplace des commits par d'autres. Si ces commits sont déjà sur le dépôt distant et que tes collègues les ont récupérés, ils ont l'ancienne version de l'histoire, toi la nouvelle. Pour publier la tienne, il faudrait forcer le ",[22,385,386],{},"git push",". Leur travail pourrait être écrasé, et leurs prochaines fusions deviendraient un casse-tête.",[389,390,391],"warning",{},[41,392,393,394,396],{},"Ne rebase jamais ",[22,395,50],{},", ni aucune branche sur laquelle d'autres personnes travaillent. Rebase seulement des commits qui ne sont que chez toi, ou une branche dont tu es le seul utilisateur.",[41,398,399],{},"C'est la même règle qu'au chapitre précédent : on ne réécrit pas un historique déjà partagé.",[10,401,403],{"id":402},"à-retenir","À retenir",[15,405,406,414,417,420,435],{},[18,407,408,411,412,29],{},[22,409,410],{},"git rebase main"," rejoue les commits de ta branche par-dessus le dernier commit de ",[22,413,50],{},[18,415,416],{},"Les commits rejoués sont de nouveaux commits, avec de nouveaux identifiants.",[18,418,419],{},"Le merge garde l'historique réel, le rebase le rend linéaire.",[18,421,422,423,426,427,430,431,434],{},"En cas de conflit : résoudre, ",[22,424,425],{},"git add",", puis ",[22,428,429],{},"git rebase --continue",", ou ",[22,432,433],{},"git rebase --abort"," pour tout annuler.",[18,436,437],{},"Jamais de rebase sur une branche partagée ou déjà récupérée par d'autres.",[439,440,441],"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":74,"searchDepth":95,"depth":443,"links":444},3,[445,446,447,448,449,450,451,452],{"id":12,"depth":95,"text":13},{"id":38,"depth":95,"text":39},{"id":66,"depth":95,"text":67},{"id":162,"depth":95,"text":163},{"id":236,"depth":95,"text":237},{"id":315,"depth":95,"text":316},{"id":379,"depth":95,"text":380},{"id":402,"depth":95,"text":403},"Rejouer une branche par-dessus une autre avec git rebase, comparer avec git merge, et savoir quand ne jamais l'utiliser.","md",{},[24,457,458,459,460,461,462],"rebaser","merge","historique linéaire","git pull --rebase","réécriture","conflit",true,"avance","\u002Fgit\u002Frebase",[467,468],"\u002Fgit\u002Fbranches","\u002Fgit\u002Fannuler",[470,474],{"nom":471,"url":472,"type":473},"Pro Git en français (2e édition, 2014), section « Rebaser (Rebasing) »","https:\u002F\u002Fgit-scm.com\u002Fbook\u002Ffr\u002Fv2","doc",{"nom":475,"url":476,"type":477},"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":453},[480],{"nom":481,"url":482},"Documentation de référence Git (en anglais)","https:\u002F\u002Fgit-scm.com\u002Fdocs","git\u002F06.rebase","QFzf_gjYzZg4E6YlXG-vyMW6UqM7bV_fjtjiSIQF5zw",[486,490,494,497,501,504,505],{"path":487,"title":488,"stem":489},"\u002Fgit\u002Fpourquoi-git","Pourquoi Git","git\u002F01.pourquoi-git",{"path":491,"title":492,"stem":493},"\u002Fgit\u002Fpremiers-commits","Premiers commits","git\u002F02.premiers-commits",{"path":467,"title":495,"stem":496},"Les branches","git\u002F03.branches",{"path":498,"title":499,"stem":500},"\u002Fgit\u002Ftravailler-a-plusieurs","Travailler à plusieurs","git\u002F04.travailler-a-plusieurs",{"path":468,"title":502,"stem":503},"Annuler une erreur","git\u002F05.annuler",{"path":465,"title":5,"stem":483},{"path":506,"title":507,"stem":508},"\u002Fgit","Git","git\u002Findex",[510,512],{"title":502,"path":468,"stem":503,"description":511,"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é.",null,[514,515],{"path":467,"title":495,"ligne":85},{"path":468,"title":502,"ligne":85},[517,519,520,521,523,524,525],{"path":487,"title":488,"niveau":518,"stem":489},"debutant",{"path":491,"title":492,"niveau":518,"stem":493},{"path":467,"title":495,"niveau":518,"stem":496},{"path":498,"title":499,"niveau":522,"stem":500},"intermediaire",{"path":468,"title":502,"niveau":522,"stem":503},{"path":465,"title":5,"niveau":464,"stem":483},{"path":506,"title":507,"niveau":526,"stem":508},"memo",1794583451800]