Git et GitHub pour débutant : les 10 commandes qui suffisent la première année
Git compte des dizaines de commandes, chacune avec ses options, et il est tentant de vouloir tout apprendre d'un coup. Mon avis est plus simple : pour une première année, en projet personnel comme en alternance, dix commandes couvrent le travail quotidien. Les autres s'apprennent le jour où un vrai besoin se présente, pas avant.
Pour vous les montrer, j'ai rejoué un scénario complet dans un terminal et je recopie ici les sorties réelles, y compris les deux messages qui inquiètent le plus les débutants : le push refusé et le pull qui s'arrête sur une erreur. Le projet suivi est un petit site perso, du même genre que le portfolio de développeur en HTML, CSS et JavaScript.
Trois réglages à faire une seule fois
Avant la première commande de la liste, Git doit savoir qui signe vos commits. Ces lignes ne font pas partie des dix : on les tape une fois par ordinateur, puis on les oublie. Mettez votre nom et l'adresse e-mail de votre compte GitHub.
git config --global user.name "Sam Accolade"
git config --global user.email "sam@example.com"
git config --global init.defaultBranch mainLa troisième ligne donne le nom main à la branche principale des nouveaux dépôts, le nom que GitHub donne aussi par défaut aux nouveaux dépôts depuis le 1er octobre 2020. Aucune de ces commandes n'affiche quoi que ce soit quand tout va bien.
1. git clone : récupérer le dépôt
Sur GitHub, vous créez un dépôt vide : sa page de démarrage rapide (Quick setup) affiche alors son adresse, à copier. Sur un dépôt qui contient déjà des fichiers, c'est le bouton Code qui la donne. Pour que l'essai soit reproductible sans compte, j'ai remplacé GitHub par un dépôt sur le disque, à l'adresse /tmp/atelier/github/portfolio.git. Chez vous, seule l'adresse change : celle de GitHub commence par https://github.com/.
git clone /tmp/atelier/github/portfolio.git
cd portfolioCloning into 'portfolio'...
warning: You appear to have cloned an empty repository.
done.L'avertissement est normal : le dépôt ne contient encore aucun commit. git clone a créé un dossier portfolio, relié au dépôt distant sous le nom origin. Toutes les commandes suivantes se tapent depuis ce dossier.
2 à 4. status, add, commit : le cycle de tous les jours
Créez un premier fichier, puis demandez à Git ce qu'il en pense. git status est la commande que vous taperez le plus souvent : elle ne modifie rien, elle décrit l'état du dossier.
printf '<h1>Mon portfolio</h1>\n' > index.html
git statusOn branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
nothing added to commit but untracked files present (use "git add" to track)« Untracked » veut dire que Git voit le fichier mais ne le suit pas encore. git add le place dans l'index, la zone où l'on prépare le prochain commit. Un nouveau git status le confirme.
git add index.html
git statusOn branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: index.html
git commit enregistre ensuite le contenu de l'index dans l'historique, avec un message qui dit ce que le changement fait. Rédigez-le pour la personne qui lira l'historique dans six mois, vous compris.
git commit -m "Ajoute la page d'accueil"[main (root-commit) 31c5456] Ajoute la page d'accueil
1 file changed, 1 insertion(+)
create mode 100644 index.html31c5456 est le début de l'empreinte du commit, son identifiant. Le vôtre sera différent : il dépend du contenu, de l'auteur et de l'heure. Dans le banc, l'auteur et la date sont figés pour que l'empreinte reste la même d'une machine à l'autre.
5. git push : envoyer sur GitHub, avec -u la première fois
Votre commit n'existe pour l'instant que sur votre ordinateur. git push l'envoie au dépôt distant. La première fois, l'option -u associe votre branche main à celle d'origin : les fois suivantes, un simple git push suffira.
git push -u origin mainTo /tmp/atelier/github/portfolio.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.Avec GitHub, deux différences apparaissent. D'abord, Git demande de vous authentifier : depuis le 13 août 2021, GitHub refuse le mot de passe du compte pour les opérations Git et demande un jeton en HTTPS (jeton d'accès personnel, ou connexion par le navigateur via un gestionnaire d'identifiants), ou une clé SSH. Ensuite, dans un terminal, Git affiche des lignes de progression avant le résumé ; le banc capture la sortie hors terminal et ne les montre pas.
6. git log : relire l'historique
git log liste les commits du plus récent au plus ancien. L'option --oneline les réduit à une ligne chacun, ce qui suffit presque toujours.
git log --oneline31c5456 Ajoute la page d'accueil7 et 8. git diff et git restore : vérifier, puis revenir en arrière
Ajoutez une ligne au fichier. Avant tout add, git diff montre ce qui a changé depuis la version placée dans l'index, ici celle du dernier commit : la ligne précédée de + est celle que vous venez d'écrire.
printf '<p>Développeur web en reconversion</p>\n' >> index.html
git diffdiff --git a/index.html b/index.html
index 61f5887..8f9687c 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
<h1>Mon portfolio</h1>
+<p>Développeur web en reconversion</p>Imaginons que cette ligne soit une erreur. git restore remet le fichier tel qu'il est dans l'index, ici identique au dernier commit. git status confirme que plus rien n'est en cours.
git restore index.html
git statusOn branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanAttention : la ligne ajoutée n'avait jamais été ajoutée à l'index ni enregistrée dans un commit. Git n'en gardait aucune copie, il n'y a donc pas de corbeille où la retrouver. Lancez git diff avant git restore, pour savoir exactement ce que vous jetez. git switch et git restore sont arrivés avec Git 2.23, en août 2019, pour séparer les deux usages de git checkout, qui existe toujours : changer de branche et restaurer des fichiers. Vous croiserez encore checkout dans les tutoriels plus anciens.
9. git pull : le jour où quelqu'un a poussé avant vous
Pour simuler un deuxième ordinateur, ou un collègue d'alternance, je clone le même dépôt dans un autre dossier, j'y ajoute un pied de page et je le pousse. L'option -a de git commit ajoute d'office les fichiers déjà suivis qui ont changé : elle évite le git add, mais ne prend jamais un fichier nouveau.
cd /tmp/atelier
git clone --quiet /tmp/atelier/github/portfolio.git portfolio-ecole
cd portfolio-ecole
printf '<footer>Contact</footer>\n' >> index.html
git commit -a -m "Ajoute le pied de page"
git push[main bd3fc2e] Ajoute le pied de page
1 file changed, 1 insertion(+)
To /tmp/atelier/github/portfolio.git
31c5456..bd3fc2e main -> mainRetour dans le premier dossier, qui ignore tout de ce commit. J'y crée une feuille de style, je la valide et je tente de la pousser. Si lier une feuille CSS à une page est encore flou pour vous, le guide pour créer un fichier CSS et le lier à sa page le détaille.
cd /tmp/atelier/portfolio
printf 'body { font-family: sans-serif; }\n' > style.css
git add style.css
git commit -m "Ajoute la feuille de style"
git push[main 80d60a1] Ajoute la feuille de style
1 file changed, 1 insertion(+)
create mode 100644 style.css
To /tmp/atelier/github/portfolio.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '/tmp/atelier/github/portfolio.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.Rien n'est cassé. Git refuse d'écraser un travail qu'il ne connaît pas : le dépôt distant contient le pied de page, absent de votre copie. Le remède est écrit dans le message : récupérer d'abord ce travail avec git pull.
git pullFrom /tmp/atelier/github/portfolio
31c5456..bd3fc2e main -> origin/main
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.Ce second message déroute davantage, parce qu'il se termine par fatal. Pourtant, la première partie a réussi : la ligne From montre que le commit du pied de page a bien été téléchargé. Git s'arrête ensuite parce que les deux historiques ont divergé, chacun avec un commit que l'autre n'a pas, et qu'il ne sait pas comment vous voulez les réunir.
Pour une première année, choisissez la fusion, la première option proposée. Elle ne réécrit aucun commit existant et se règle une fois pour toutes avec --global, comme l'indique le message lui-même.
git config --global pull.rebase false
git pullMerge made by the 'ort' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)Dans un vrai terminal, Git ouvre en général votre éditeur pour proposer le message de ce commit de fusion. Gardez le message proposé, enregistrez et fermez l'éditeur : la fusion se termine. Le banc a neutralisé l'éditeur, d'où l'absence de cette étape ci-dessus. Le graphe de l'historique montre maintenant les deux lignes de travail réunies, et le push passe.
git log --oneline --graph
git push* af74398 Merge branch 'main' of /tmp/atelier/github/portfolio
|\
| * bd3fc2e Ajoute le pied de page
* | 80d60a1 Ajoute la feuille de style
|/
* 31c5456 Ajoute la page d'accueil
To /tmp/atelier/github/portfolio.git
bd3fc2e..af74398 main -> mainIci, les deux commits touchaient des fichiers différents, donc Git a pu les réunir seul. Si les deux commits avaient modifié différemment les mêmes lignes, Git se serait en revanche arrêté sur un conflit, à résoudre à la main. Le meilleur moyen d'en avoir peu reste de faire git pull avant de commencer à travailler.
10. git switch : travailler à côté de main
En entreprise, on modifie rarement main directement. On crée une branche, on y fait ses commits, on la pousse, puis on ouvre une pull request sur GitHub : une proposition de fusionner ces changements, que l'équipe relit avant de l'accepter. git switch -c crée la branche et s'y place.
git switch -c contact
printf '<a href="mailto:sam@example.com">Écrire</a>\n' > contact.html
git add contact.html
git commit -m "Ajoute la page contact"
git push -u origin contactSwitched to a new branch 'contact'
[contact 07a1014] Ajoute la page contact
1 file changed, 1 insertion(+)
create mode 100644 contact.html
To /tmp/atelier/github/portfolio.git
* [new branch] contact -> contact
branch 'contact' set up to track 'origin/contact'.Sur GitHub, la branche contact apparaît et le site propose d'ouvrir une pull request. La fusion se fait ensuite sur GitHub, avec le bouton prévu pour cela. De votre côté, il reste à revenir sur main, puis à faire git pull une fois la pull request fusionnée pour récupérer le résultat.
git switch mainSwitched to branch 'main'
Your branch is up to date with 'origin/main'.Ce circuit de branche, push et pull request est aussi ce qu'un recruteur voit de vous sur GitHub. Pour une candidature, un historique propre avec des messages clairs compte autant que le code, comme le rappelle la méthode pour trouver une alternance sans réseau.
Ce qui peut attendre votre deuxième année
git rebase, git stash, git reset, git cherry-pick ou git bisect sont utiles, et vous les croiserez. Mais aucune n'est nécessaire au cycle décrit plus haut, et certaines, comme reset ou rebase, peuvent réécrire ou faire perdre des commits si on les emploie sans comprendre ce qu'elles font. Apprenez-les quand une situation précise vous les demande, avec une copie du dépôt à côté pour vous entraîner.
Si votre équipe impose une autre règle, par exemple git pull --rebase, suivez-la : la convention de l'équipe passe avant ce choix par défaut. L'essentiel est de savoir lire les messages de Git, car ils disent presque toujours quoi faire ensuite.
Comment ces sorties ont été obtenues
Les seize blocs de commandes de cette page ont été extraits automatiquement de l'article, puis exécutés dans l'ordre par un même shell bash, dans un dossier vierge /tmp/atelier et avec un dossier personnel isolé. Chaque sortie, erreurs comprises, a été comparée octet par octet au bloc qui la suit, après suppression des espaces et tabulations en fin de ligne et d'un éventuel saut de ligne final : la mise en forme du site retire ces espaces des blocs de code, et rien de tout cela ne se voit à l'écran. Commande : node mesures.mjs --git-debian --article chemin/vers/git-github-debutant-commandes.md.
Environnement de référence, le 12 octobre 2026 : git 2.39.5, le paquet de Debian 12, avec Node 22.23.2 sous Linux. Messages en anglais (LC_ALL=C), auteur et dates de commit figés, éditeur neutralisé. Le dépôt nu qui remplace GitHub est créé par le banc avec git init --bare -b main ; c'est la seule commande qui n'apparaît pas dans l'article.
Contrôle croisé, le même jour, sous Windows avec Git for Windows 2.54.0 et Node 20.19.4 : mêmes sorties, à deux différences près. Le conseil du push refusé y est formulé autrement et se termine par « use 'git pull' before pushing again ». Le commit de fusion y a une autre empreinte, parce que son message contient le chemin du dépôt, différent sous Windows, et le commit de la branche contact, qui en descend, change aussi. Si votre Git est configuré en français, les messages seront traduits, mais leur structure reste la même.
Sources consultées le 12 octobre 2026 :
- GitHub : fin des mots de passe pour les opérations Git (13 août 2021)
- GitHub : main devient la branche par défaut des nouveaux dépôts (1er octobre 2020)
- GitHub Docs : copier l'adresse d'un dépôt vide depuis la page Quick setup
- Les nouveautés de Git 2.23 : git switch et git restore
- Documentation de git restore
- Documentation de git merge et de l'édition du message de fusion
- GitHub Docs : à propos des pull requests