[{"data":1,"prerenderedAt":639},["ShallowReactive",2],{"authors":3,"article-2023-01-12-commit-atomique-kezako":331},[4,23,35,48,61,73,85,98,111,124,136,148,161,173,185,197,209,221,233,245,258,270,282,295,307,319],{"id":5,"title":6,"body":7,"description":11,"extension":14,"meta":15,"name":16,"navigation":17,"path":18,"readingTime":19,"seo":20,"stem":21,"__hash__":22},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":8,"value":9,"toc":10},"minimark",[],{"title":11,"searchDepth":12,"depth":12,"links":13},"",2,[],"md",{},"Alexandre Guillon",true,"\u002Fauthors\u002Falexandre-guillon",1,{"title":6,"description":11},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":24,"title":6,"body":25,"description":11,"extension":14,"meta":29,"name":30,"navigation":17,"path":31,"readingTime":19,"seo":32,"stem":33,"__hash__":34},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":8,"value":26,"toc":27},[],{"title":11,"searchDepth":12,"depth":12,"links":28},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":6,"description":11},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":36,"title":37,"body":38,"description":11,"extension":14,"meta":42,"name":43,"navigation":17,"path":44,"readingTime":19,"seo":45,"stem":46,"__hash__":47},"authors\u002Fauthors\u002Faxel-shaita.md","Engineering Manager",{"type":8,"value":39,"toc":40},[],{"title":11,"searchDepth":12,"depth":12,"links":41},[],{},"Axel Shaïta","\u002Fauthors\u002Faxel-shaita",{"title":37,"description":11},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",{"id":49,"title":50,"body":51,"description":11,"extension":14,"meta":55,"name":56,"navigation":17,"path":57,"readingTime":19,"seo":58,"stem":59,"__hash__":60},"authors\u002Fauthors\u002Fbaptiste-faure.md","Head of Talent Acquisition",{"type":8,"value":52,"toc":53},[],{"title":11,"searchDepth":12,"depth":12,"links":54},[],{},"Baptiste Faure","\u002Fauthors\u002Fbaptiste-faure",{"title":50,"description":11},"authors\u002Fbaptiste-faure","ELisToYtcgHmgdVWZkCclTPV6exZtfyXqhpx1jjbJHs",{"id":62,"title":6,"body":63,"description":11,"extension":14,"meta":67,"name":68,"navigation":17,"path":69,"readingTime":19,"seo":70,"stem":71,"__hash__":72},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":8,"value":64,"toc":65},[],{"title":11,"searchDepth":12,"depth":12,"links":66},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":6,"description":11},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":74,"title":37,"body":75,"description":11,"extension":14,"meta":79,"name":80,"navigation":17,"path":81,"readingTime":19,"seo":82,"stem":83,"__hash__":84},"authors\u002Fauthors\u002Fcedric-nicoloso.md",{"type":8,"value":76,"toc":77},[],{"title":11,"searchDepth":12,"depth":12,"links":78},[],{},"Cédric Nicoloso","\u002Fauthors\u002Fcedric-nicoloso",{"title":37,"description":11},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",{"id":86,"title":87,"body":88,"description":11,"extension":14,"meta":92,"name":93,"navigation":17,"path":94,"readingTime":19,"seo":95,"stem":96,"__hash__":97},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":8,"value":89,"toc":90},[],{"title":11,"searchDepth":12,"depth":12,"links":91},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":87,"description":11},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":99,"title":100,"body":101,"description":11,"extension":14,"meta":105,"name":106,"navigation":17,"path":107,"readingTime":19,"seo":108,"stem":109,"__hash__":110},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":8,"value":102,"toc":103},[],{"title":11,"searchDepth":12,"depth":12,"links":104},[],{},"Eloïse Chizat","\u002Fauthors\u002Feloise-chizat",{"title":100,"description":11},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",{"id":112,"title":113,"body":114,"description":11,"extension":14,"meta":118,"name":119,"navigation":17,"path":120,"readingTime":19,"seo":121,"stem":122,"__hash__":123},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":8,"value":115,"toc":116},[],{"title":11,"searchDepth":12,"depth":12,"links":117},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":113,"description":11},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":125,"title":6,"body":126,"description":11,"extension":14,"meta":130,"name":131,"navigation":17,"path":132,"readingTime":19,"seo":133,"stem":134,"__hash__":135},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":8,"value":127,"toc":128},[],{"title":11,"searchDepth":12,"depth":12,"links":129},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":6,"description":11},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":137,"title":37,"body":138,"description":11,"extension":14,"meta":142,"name":143,"navigation":17,"path":144,"readingTime":19,"seo":145,"stem":146,"__hash__":147},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":8,"value":139,"toc":140},[],{"title":11,"searchDepth":12,"depth":12,"links":141},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":37,"description":11},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":149,"title":150,"body":151,"description":11,"extension":14,"meta":155,"name":156,"navigation":17,"path":157,"readingTime":19,"seo":158,"stem":159,"__hash__":160},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":8,"value":152,"toc":153},[],{"title":11,"searchDepth":12,"depth":12,"links":154},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":150,"description":11},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":162,"title":6,"body":163,"description":11,"extension":14,"meta":167,"name":168,"navigation":17,"path":169,"readingTime":19,"seo":170,"stem":171,"__hash__":172},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":8,"value":164,"toc":165},[],{"title":11,"searchDepth":12,"depth":12,"links":166},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":6,"description":11},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":174,"title":6,"body":175,"description":11,"extension":14,"meta":179,"name":180,"navigation":17,"path":181,"readingTime":19,"seo":182,"stem":183,"__hash__":184},"authors\u002Fauthors\u002Fleo-martin.md",{"type":8,"value":176,"toc":177},[],{"title":11,"searchDepth":12,"depth":12,"links":178},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":6,"description":11},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":186,"title":6,"body":187,"description":11,"extension":14,"meta":191,"name":192,"navigation":17,"path":193,"readingTime":19,"seo":194,"stem":195,"__hash__":196},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":8,"value":188,"toc":189},[],{"title":11,"searchDepth":12,"depth":12,"links":190},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":6,"description":11},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":198,"title":6,"body":199,"description":11,"extension":14,"meta":203,"name":204,"navigation":17,"path":205,"readingTime":19,"seo":206,"stem":207,"__hash__":208},"authors\u002Fauthors\u002Floic-poullain.md",{"type":8,"value":200,"toc":201},[],{"title":11,"searchDepth":12,"depth":12,"links":202},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":6,"description":11},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":210,"title":100,"body":211,"description":11,"extension":14,"meta":215,"name":216,"navigation":17,"path":217,"readingTime":19,"seo":218,"stem":219,"__hash__":220},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":8,"value":212,"toc":213},[],{"title":11,"searchDepth":12,"depth":12,"links":214},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":100,"description":11},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":222,"title":37,"body":223,"description":11,"extension":14,"meta":227,"name":228,"navigation":17,"path":229,"readingTime":19,"seo":230,"stem":231,"__hash__":232},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":8,"value":224,"toc":225},[],{"title":11,"searchDepth":12,"depth":12,"links":226},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":37,"description":11},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":234,"title":37,"body":235,"description":11,"extension":14,"meta":239,"name":240,"navigation":17,"path":241,"readingTime":19,"seo":242,"stem":243,"__hash__":244},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":8,"value":236,"toc":237},[],{"title":11,"searchDepth":12,"depth":12,"links":238},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":37,"description":11},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":246,"title":247,"body":248,"description":11,"extension":14,"meta":252,"name":253,"navigation":17,"path":254,"readingTime":19,"seo":255,"stem":256,"__hash__":257},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":8,"value":249,"toc":250},[],{"title":11,"searchDepth":12,"depth":12,"links":251},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":247,"description":11},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":259,"title":37,"body":260,"description":11,"extension":14,"meta":264,"name":265,"navigation":17,"path":266,"readingTime":19,"seo":267,"stem":268,"__hash__":269},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":8,"value":261,"toc":262},[],{"title":11,"searchDepth":12,"depth":12,"links":263},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":37,"description":11},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":271,"title":6,"body":272,"description":11,"extension":14,"meta":276,"name":277,"navigation":17,"path":278,"readingTime":19,"seo":279,"stem":280,"__hash__":281},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":8,"value":273,"toc":274},[],{"title":11,"searchDepth":12,"depth":12,"links":275},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":6,"description":11},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":283,"title":284,"body":285,"description":11,"extension":14,"meta":289,"name":290,"navigation":17,"path":291,"readingTime":19,"seo":292,"stem":293,"__hash__":294},"authors\u002Fauthors\u002Ftalent-acquisition.md","Talent Acquisition",{"type":8,"value":286,"toc":287},[],{"title":11,"searchDepth":12,"depth":12,"links":288},[],{},"Équipe Talent Acquisition","\u002Fauthors\u002Ftalent-acquisition",{"description":11},"authors\u002Ftalent-acquisition","doDfE76txftQ4wIiKjJoDmSpyzSKk0tzlgVAp6-opAY",{"id":296,"title":6,"body":297,"description":11,"extension":14,"meta":301,"name":302,"navigation":17,"path":303,"readingTime":19,"seo":304,"stem":305,"__hash__":306},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":8,"value":298,"toc":299},[],{"title":11,"searchDepth":12,"depth":12,"links":300},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":6,"description":11},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":308,"title":6,"body":309,"description":11,"extension":14,"meta":313,"name":314,"navigation":17,"path":315,"readingTime":19,"seo":316,"stem":317,"__hash__":318},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":8,"value":310,"toc":311},[],{"title":11,"searchDepth":12,"depth":12,"links":312},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":6,"description":11},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":320,"title":6,"body":321,"description":11,"extension":14,"meta":325,"name":326,"navigation":17,"path":327,"readingTime":19,"seo":328,"stem":329,"__hash__":330},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":8,"value":322,"toc":323},[],{"title":11,"searchDepth":12,"depth":12,"links":324},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":6,"description":11},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",{"id":332,"title":333,"author":334,"body":335,"date":628,"description":629,"extension":14,"lang":630,"meta":631,"navigation":17,"path":632,"published":17,"readingTime":633,"seo":634,"stem":635,"tags":636,"__hash__":638},"articles\u002Farticles\u002F2023-01-12-commit-atomique-kezako.md","Commit atomique ? Kezako ?","benjamin-bouillot",{"type":8,"value":336,"toc":621},[337,346,351,354,361,364,367,373,377,380,383,436,439,447,453,457,460,475,478,481,488,492,495,498,505,518,521,524,534,537,540,545,548,551,554,557,562,565,567,570,575,578,581,584,587],[338,339,340,341,345],"p",{},"Lorsque l’on s’intéresse de près ou de loin au merveilleux monde du développement, on ne peut pas\npasser à côté de Git (merci Linus Torvald) et des commits. Et un jour, on tombe sur ces 2 mots\n",[342,343,344],"code",{},"commit atomique",". On se demande alors à quoi cela pourrait faire référence. Ici, je vais vous\ndonner mon interprétation de ce type de commit et pourquoi il est important de les utiliser au\nquotidien.",[347,348,350],"h2",{"id":349},"une-petite-histoire-pour-un-peu-de-contexte","Une petite histoire pour un peu de contexte",[338,352,353],{},"Actuellement à Indy, on utilise GitHub, donc chaque commit sur master est en théorie relié à une PR.\nCette PR est alors normalement reliée à une tâche Jira, donc on peut avoir un historique assez\nsimplement.",[338,355,356,357,360],{},"Ainsi, si on tombe sur un commit qui a comme seul nom ",[342,358,359],{},"fix",", on va voir la PR, même si le message de\nPR est vide lui aussi, on a accès aux autres commits compris dans cette PR, et on peut comprendre à\nquoi correspond ce “fix” et avoir un peu de contexte (et encore, on vient de perdre 5min).",[338,362,363],{},"Maintenant, imaginons que cette PR contient uniquement ce commit, il est alors nécessaire d’aller à\nla tâche Jira rattachée et cette fois, on comprend ce qu’il se passe parce qu’on a du contexte. Mais\nseulement si une tâche Jira est rattachée à la PR !",[338,365,366],{},"Bon ça, c'est dans le meilleur des cas en fait.",[338,368,369,370,372],{},"Imaginons, qu’on touche à du legacy et qu’on essaie de comprendre ce qu’il y a bien pu se passer.\nSauf que ce legacy date d’il y a 5 ans. Et qu’à l’époque on n'était pas sous GitHub, mais GitLab et\nqu’on n'a donc aucun historique des PRs\u002FMRs, et qu’à l’époque on n'avait pas Jira mais Trello\n(instance de Trello qui n’existe plus bien sûr). Et, bien entendu, la ligne de code qu’on essaie de\nmodifier est rattaché à un seul commit qui s’appelle ",[342,371,359],{}," et qui fait 600 lignes. Clairement,\npersonne n'a envie d’arriver dans cet état-là. Donc, on modifie en croisant les doigts, on rajoute\ndes tests comme on peut, et on fait des incantations pour que notre patch ne casse pas d’autres\nchoses tout en se disant “J’aurai dû être éleveur de lamas dans le Périgord”.",[347,374,376],{"id":375},"alors-clairement-quest-ce-que-cest-un-commit-atomique","Alors clairement, qu’est-ce que c’est un commit atomique ?",[338,378,379],{},"Pour faire simple, c’est un commit qui ne dépend que de lui.",[338,381,382],{},"En d’autre mot, il contient plusieurs caractéristiques :",[384,385,386,390,401,416,430,433],"ul",{},[387,388,389],"li",{},"Très simple, peu de lignes modifiées (lorsque cela est possible) et doit pouvoir se lire\nfacilement",[387,391,392,393,400],{},"Ses tests associés\n(👋 ",[394,395,399],"a",{"href":396,"rel":397},"https:\u002F\u002Fwww.all4test.fr\u002Fblog-du-testeur\u002Fles-3-cles-pour-maitriser-le-test-driven-development-tdd\u002F",[398],"nofollow","TDD",")",[387,402,403,404,409,410,415],{},"Un titre simple expliquant le but. Pour t’aider, tu peux utiliser\n",[394,405,408],{"href":406,"rel":407},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[398],"Conventional Commits"," et\n",[394,411,414],{"href":412,"rel":413},"https:\u002F\u002Fconventionalcomments.org\u002F",[398],"Conventional Comments",".",[387,417,418,419],{},"Une description claire, et qui répond à plusieurs questions :",[384,420,421,424,427],{},[387,422,423],{},"Pourquoi ?",[387,425,426],{},"Qu’est-ce qu’on cherche à faire ?",[387,428,429],{},"Quelle est la suite ? (S’il y en a une)",[387,431,432],{},"Il ne doit pas dépendre d’un autre commit pour être fonctionnel en production",[387,434,435],{},"Un lien vers une tâche Jira ou autre (en bonus, le titre de la tache, car un titre est plus\nparlant qu’un simple numéro)",[338,437,438],{},"Enfin, quelques règles supplémentaires :",[384,440,441,444],{},[387,442,443],{},"Son message de commit doit être aussi conséquent que son nombre de lignes modifiées (ça ne se\njustifie pas toujours bien sûr)",[387,445,446],{},"Il serait possible de revenir sur n’importe quel commit, compiler le projet, le lancer et il\nfonctionnera toujours. Dans les faits, il faut prendre en compte les montées de version des outils\nexternes comme NPM, node, ou autres librairies qui peuvent compliquer la tâche, aussi le fait que\n2 commits peuvent dépendre l’un de l’autre, etc.",[448,449,450],"blockquote",{},[338,451,452],{},"Un petit exemple est disponible en fin de page pour mieux comprendre",[347,454,456],{"id":455},"ok-cest-bien-beau-mais-à-la-fin-le-résultat-sera-le-même-on-aura-du-code","Ok c’est bien beau, mais à la fin le résultat sera le même : On aura du code !",[338,458,459],{},"Oui. Je suis totalement d’accord avec toi. Mais, j’ai 4 contre-exemples à te donner :",[461,462,463,466,469,472],"ol",{},[387,464,465],{},"Il ne faut pas oublier une chose : ton code n’est pas parfait ! Un jour, un bug sera introduit\nsans t’en rendre compte (parce qu’un bug est rarement introduit consciemment …) et ça sera durant\ncette phase de debugging que tu seras content d’avoir un peu de contexte grâce aux messages de\ncommits. Et ainsi te rendre compte que ce n'est pas un bug, mais une feature ! (la fameuse\nfeature)",[387,467,468],{},"Tu touches à un code pas si vieux que ça, et tu dois introduire une nouvelle fonctionnalité.\nComme tu es quelqu’un de minutieux, tu as mis de beaux messages de commits là où il le fallait.\nAinsi, tu gagnes en temps, car tu n’auras pas besoin d’aller voir la PR ni Jira pour comprendre\nle contexte de chaque ligne et pourquoi elles ont été introduites\u002Fmodifiées, tout se fera\ndirectement dans ton IDE. Tu n’auras pas besoin de lire tout le code pendant 10min pour te\nremettre dans le contexte de l’époque et poser la question “Pourquoi ils ont fait ça ??” toutes\nles 3 minutes.",[387,470,471],{},"Durant la phase de relecture, ton copain relecteur sera content d’avoir un peu de contexte s’il\nne bosse pas sur la feature en même temps que toi. Ainsi, il saura ce que tu veux faire et où tu\ncomptes aller par la suite, et il pourra t’aiguiller s’il sent que tu vas dans le mur. Aussi,\nlire un commit qui fait plus de 1000 lignes n’est jamais agréable, c’est très long et fastidieux,\ndonc plus le commit est petit, plus la revue ira vite et sera un moment de plaisir pour le\nrelecteur.",[387,473,474],{},"Qui te dit que tu seras encore dans l’entreprise dans 2 ans ? Qui te dit que le projet ne sera\npas repris par une autre équipe par la suite ? Qui te dit que l’entreprise utilisera les PRs et\nGitHub toute sa vie ? À vrai dire, personne ne le sait à ce moment-là, la seule chose qui est\nsûre, c’est que le logiciel sera encore existant, et ses commits aussi (jusqu’à qu’un nouvel\noutil de versionning plus performant que Git arrive).",[338,476,477],{},"Tu pourrais aussi te dire “Je mets un commentaire dans mon code, ça fait la même chose”. Et c’est là\nque je te sors ma carte (Yu-Gi-Oh) fétiche.",[338,479,480],{},"Un message de commit correspond à ce que tu as voulu faire à un moment T, il est relié à des\nmodifications de fichiers. Il est uniquement là pour te donner du contexte et comprendre plus\nrapidement ce que tu faisais et ce que tu cherchais à faire à ce moment précis.",[338,482,483,484,487],{},"Un commentaire est quant à lui volatile\u002Fmodifiable, il est là, relié à une fonction ou un fichier,\nmais cette fonction a changé de signature ou de comportement, et on a oublié de modifier le\ncommentaire, et dans le doute, on le laisse, se disant qu’il doit servir à quelqu'un (combien de\n",[342,485,486],{},"\u002F\u002F TODO"," sont là depuis 2 ans alors que personne n’y a touché ?) mais en fait non. Du coup, on a un\ncommentaire relié à une méthode et ils n’ont plus rien en commun. Alors qu’un message de commit,\nlui, sera toujours relié à ses fichiers modifiés.",[347,489,491],{"id":490},"petite-synthèse","Petite synthèse",[338,493,494],{},"Les commits atomiques sont composés de 3 choses importantes : le message, le code et les tests.",[338,496,497],{},"Le message permet de mettre en avant le pourquoi. Le code permet de dire le comment. Et les tests\npour s’assurer que ton quoi répond au pourquoi.",[338,499,500,501,504],{},"Il n’est pas nécessaire de passer du temps sur le message s’il n’y a aucune utilité. Par exemple,\n",[342,502,503],{},"fix: Button should be display in red when alert",", est assez compréhensible pour être seul.",[338,506,507,508,513,514,517],{},"Par contre, lorsque notre commit modifie ou introduit une archi un peu complexe, il peut être\nintéressant d’expliquer le but de cette architecture, de mettre un lien vers un\n",[394,509,512],{"href":510,"rel":511},"https:\u002F\u002Fgithub.com\u002Fjoelparkerhenderson\u002Farchitecture-decision-record",[398],"ADR"," si celui-ci existe, etc.\nIdem pour les ",[342,515,516],{},"breaking change"," d’API par exemple.",[338,519,520],{},"Donc perdre 5min à un moment T peut être lourd et compliqué à prendre, mais sera synonyme de\nrapidité dans 6 mois. Ainsi, un projet n’est plus relié à un gestionnaire de projet quelconque ou un\nservice de référentiel. Mais uniquement à ses commits, permettant un gain de temps et de\ncompréhension.",[338,522,523],{},"Ce n’est pas parce que tu comprends ton code aujourd’hui que tu le comprendras dans 1 an, et imagine\nce que ressentent ceux qui n’ont jamais touché à ton code 🙃",[347,525,527],{"id":526},"petit-exemple-concret",[528,529,530],"em",{},[531,532,533],"strong",{},"Petit exemple concret",[338,535,536],{},"On introduit une nouvelle feature sur le paiement SEPA et cela correspond à une grosse\nfonctionnalité. La première bonne pratique est alors de la découper en 3 ou 4 commits.",[338,538,539],{},"Le premier commit :",[448,541,542],{},[338,543,544],{},"refactor: Move files to pay by card",[338,546,547],{},"SEPA payment must be added as a payment option. Because many users ask for it, and some users cannot\npay by credit card.",[338,549,550],{},"In order to add SEPA payment, it is necessary to move some functions in order to DRY. This commit\nmust not break the initial behavior of the CB payment.",[338,552,553],{},"Part of JIRA-3015 Pouvoir payer par SEPA",[338,555,556],{},"Le deuxième commit :",[448,558,559],{},[338,560,561],{},"feat: User can select SEPA mode",[338,563,564],{},"SEPA payment is not yet in place, only the UI part is available. A new feature flag\n‘payment_sepa_activated’ is introduced so user does not see this part. It is now possible to select\nthe SEPA payment and a new form is displayed to enter all the details. This form is currently\ndisabled. In next patch, the back-end will be built to allow SEPA payment.",[338,566,553],{},[338,568,569],{},"Le troisième commit :",[448,571,572],{},[338,573,574],{},"feat: Pay by SEPA or CB",[338,576,577],{},"The user can choose between SEPA and CB. In both cases, a form is displayed and the payment should\nbe successful in both cases.",[338,579,580],{},"The feature flag ‘payment_sepa_activated’ is now deleted.",[338,582,583],{},"Closes JIRA-3015 Pouvoir par SEPA",[338,585,586],{},"Références :",[384,588,589,597,605,613],{},[387,590,591,594],{},[394,592],{"href":406,"rel":593},[398],[394,595,406],{"href":406,"rel":596},[398],[387,598,599,602],{},[394,600],{"href":412,"rel":601},[398],[394,603,412],{"href":412,"rel":604},[398],[387,606,607,610],{},[394,608],{"href":510,"rel":609},[398],[394,611,510],{"href":510,"rel":612},[398],[387,614,615,618],{},[394,616],{"href":396,"rel":617},[398],[394,619,396],{"href":396,"rel":620},[398],{"title":11,"searchDepth":12,"depth":12,"links":622},[623,624,625,626,627],{"id":349,"depth":12,"text":350},{"id":375,"depth":12,"text":376},{"id":455,"depth":12,"text":456},{"id":490,"depth":12,"text":491},{"id":526,"depth":12,"text":533},"2023-01-12","chaque commit sur master est en théorie relié à une PR. Cette PR est alors normalement reliée à une tâche Jira, donc on peut avoir un historique assez simplement.","fr",{},"\u002Farticles\u002F2023-01-12-commit-atomique-kezako",10,{"title":333,"description":629},"articles\u002F2023-01-12-commit-atomique-kezako",[637],"Tech","Nv7IYIoZiwbzpEW4Ln0XlIkbE7podWMFM4iJ37mJxGo",1775837023389]