Aide-mémoire Git

Un aide-mémoire Git consultable couvrant la configuration, la boucle de commit quotidienne, les branches, les dépôts distants, l'historique et la récupération, avec copie en un clic pour chaque commande.

Quarante-neuf commandes Git utiles à retenir. Filtrez parmi les noms et descriptions de commandes, puis copiez celle dont vous avez besoin. Groupe par configuration, flux de travail quotidien, branches, dépôts distants, historique et annulation d'erreurs.

Comprendre les commandes Git que vous utilisez chaque jour

À quoi sert vraiment un aide-mémoire Git

Git compte bien plus d'une centaine de commandes de porcelaine, mais la plupart des ingénieurs utilisent les mêmes vingt ou trente chaque jour et n'ont recours aux autres que quelques fois par an. Un aide-mémoire ne remplace pas la compréhension du modèle ; il existe pour que les commandes que vous comprenez déjà restent à une touche de distance plutôt qu'à un onglet de navigateur et trois réponses Stack Overflow.

La référence de cette page est groupée selon le déroulement réel du travail : configuration d'un dépôt, la boucle de commit que vous lancez des dizaines de fois par jour, les branches, la communication avec un dépôt distant, la lecture de l'historique, et vous sortir de situation difficile. Saisissez dans la zone de filtre et la liste se réduit à la fois sur le texte de la commande et sa description, donc rechercher « stash », « force » ou « undo » fait apparaître les lignes pertinentes immédiatement. Chaque ligne possède un bouton de copie, car retaper une commande contenant un --force-with-lease est précisément ce qui provoque les fautes de frappe.

Le modèle mental derrière les commandes

Presque chaque commande Git a un sens dès que vous gardez trois endroits en tête. L'arbre de travail est les fichiers sur disque tels que vous les voyez dans votre éditeur. L'index — aussi appelé zone de préparation — est l'instantané que vous assemblez pour le prochain commit. Le dépôt est la chaîne immuable de commits déjà enregistrés. git add déplace le contenu de l'arbre de travail vers l'index, git commit transforme l'index en un nouveau commit, et git restore renvoie le contenu dans l'autre sens.

Les branches sont la deuxième idée, et elles sont plus simples qu'elles n'en ont l'air : une branche est simplement un pointeur mobile vers un commit, et HEAD est un pointeur vers la branche sur laquelle vous êtes. Créer une branche ne coûte rien car elle écrit un seul fichier contenant un hash de quarante caractères. C'est pourquoi git switch -c est peu coûteux, suffisant pour une expérience de cinq minutes.

La fusion et le rebasage combinent tous deux le travail de deux branches ; ils diffèrent dans ce qu'ils enregistrent. Une fusion conserve les deux historiques et ajoute un commit qui les joint, ce qui est honnête mais produit un graphe tressé. Un rebasage réécrit vos commits pour qu'ils apparaissent avoir été écrits au-dessus de l'autre branche, ce qui produit une ligne droite propre mais change les hash des commits — c'est exactement pourquoi vous ne rebasez jamais de commits que d'autres ont déjà récupérés.

Récupérer quand quelque chose tourne mal

La chose la plus utile à savoir sur Git est qu'il perd très rarement un travail commité. Tant qu'un changement a été commité à un moment donné, git reflog vous montrera le hash, et git switch -c rescue <hash> le ramènera. Ce filet de sécurité couvre les rebasages ratés, un reset --hard accidentel après un commit, et les branches supprimées un peu trop hâtivement.

Les opérations dangereuses sont celles qui touchent un travail non commité : git reset --hard, git checkout -- sur un fichier modifié, et git clean -fd. Aucun de ces changements n'a jamais été enregistré, donc le reflog ne pointe vers rien. L'habitude à prendre est de committer tôt et souvent sur une branche temporaire, ou de faire git stash push avant toute expérience. Un commit que vous écrasez plus tard ne coûte rien ; un après-midi de travail non commité ne revient pas.

Sur les branches partagées, préférez git revert à la réécriture de l'historique. Il enregistre un nouveau commit qui inverse l'ancien, donc le clone de chacun reste valide. Réservez --force-with-lease à vos propres branches de fonctionnalités, et notez que c'est de manière significative plus sûr qu'un --force simple : il refuse de s'exécuter si le distant a bougé depuis votre dernier fetch, ce qui est précisément le cas où un force push simple détruirait silencieusement les commits d'un collègue.

Développé en interne. L'aide-mémoire est des données simples rendues et filtrées par quelques lignes de JavaScript vanilla ; rien de ce que vous saisissez n'est envoyé nulle part.

Foire aux questions

Ces commandes fonctionnent-elles sur Windows, macOS et Linux ?
Oui. Chaque entrée est du Git simple et se comporte de façon identique sur les trois plateformes, que vous l'exécutiez dans PowerShell, l'invite de commande, le Terminal ou n'importe quel shell Linux. Les seules différences que vous remarquerez sont la gestion des fins de ligne, contrôlée par core.autocrlf, et les règles de citation pour les arguments contenant des espaces.
Quelle est la différence entre git switch et git checkout ?
git checkout a historiquement fait deux tâches sans rapport : passer d'une branche à l'autre et restaurer des fichiers. Git 2.23 a séparé celles-ci en git switch pour les branches et git restore pour les fichiers. checkout fonctionne toujours et n'est pas obsolète, mais switch et restore sont plus clairs et bien plus difficiles à utiliser par erreur.
Quand dois-je rebase au lieu de merge ?
Rebasez votre propre branche de fonctionnalité non publiée sur la dernière main pour garder un historique linéaire et des revues lisibles. Fusionnez quand la branche est partagée, quand les commits sont déjà poussés, ou quand vous voulez que l'historique montre que deux lignes de travail ont tourné en parallèle.
Comment récupérer un commit que j'ai supprimé par erreur ?
Lancez git reflog pour voir chaque position qu'a occupée HEAD, trouvez le hash du commit voulu, puis lancez git switch -c rescue <hash>. Cela fonctionne pour les commits perdus lors d'un mauvais rebase, d'un reset hard ou d'une branche supprimée, tant que la collecte des ordures n'a pas tourné, ce qui vous donne généralement au moins 30 jours.
git push --force-with-lease est-il vraiment plus sûr que --force ?
Oui, de manière significative. Un --force simple écrase la branche distante sans condition. --force-with-lease vérifie d'abord que le distant est toujours au commit que vous avez récupéré, et abandonne si quelqu'un d'autre a poussé entre-temps, ce qui est précisément la situation où un force push détruirait le travail d'un collègue.
Quelque chose que je saisis dans la zone de filtre quitte-t-il mon navigateur ?
Non. L'aide-mémoire est un petit bloc de données intégré dans la page et le filtre est une simple correspondance de chaîne JavaScript. Il n'y a aucune requête, aucun appel d'analytique et aucun serveur impliqué une fois la page chargée.