git checkout

Branches et fusions

Changer de branche ou restaurer des fichiers de l’arbre de travail


git checkout est une commande polyvalente qui change de branche, crée de nouvelles branches, restaure des fichiers depuis des commits précis et peut mettre votre dépôt en état « HEAD détaché ». Même si les versions récentes de Git ont réparti une partie de ses fonctions entre « git switch » et « git restore », checkout reste très utilisé et bien connu.

Synopsis

git checkout <branch>
git checkout -b <new-branch> [<start-point>]
git checkout -B <branch> [<start-point>]
git checkout --detach [<branch>]
git checkout [--] <pathspec>...
git checkout <commit> -- <pathspec>...
[ ] facultatif| ou<arg> valeur à remplacer... répétable--flag option

Options

Cliquez sur une option pour la déplier

Débutant (3)

Créer une nouvelle branche et y basculer tout de suite. Équivaut à git branch <name> suivi de git checkout <name>.

RecommandéCrée et bascule en une étape (forme moderne : git switch -c)

Exemple

git checkout -b feature-login

Jeter les modifications non indexées des fichiers indiqués en les restaurant depuis la zone de préparation (l’index), pas depuis HEAD. Les modifications indexées sont conservées. Le -- sépare les chemins de fichiers des noms de branche.

Si nécessaireJette définitivement les modifications non préparées — git restore <file> est la forme moderne

Exemple

git checkout -- src/app.js

Supprimer les messages de retour. Utile dans les scripts où vous n’avez pas besoin des confirmations « Switched to branch ».

Si nécessaireSupprime les messages ; surtout pour les scripts

Exemple

git checkout -q main

Intermédiaire (8)

Créer une nouvelle branche, ou la replacer si elle existe déjà, puis y basculer. Utile pour replacer une branche sur le commit courant.

DéconseilléRéinitialise sans prévenir une branche existante et peut rendre ses commits orphelins

Exemple

git checkout -B feature-login

En créant une nouvelle branche, configurer le suivi de la branche upstream. Permet git pull/push sans préciser le dépôt distant.

RecommandéCrée une branche locale reliée à une branche distante

Exemple

git checkout --track origin/feature

En créant une nouvelle branche depuis une branche de suivi distante, ne pas configurer de suivi. La branche sera indépendante.

Si nécessaireCrée une branche à partir d’une branche distante sans la définir comme upstream

Exemple

git checkout --no-track -b feature origin/main

Détacher HEAD sur le commit indiqué. Vous pouvez examiner du vieux code ou expérimenter sans toucher à aucune branche.

Si nécessaireExaminer un ancien commit ; créez une branche avant d’y committer

Exemple

git checkout --detach v1.0.0

Restaurer un fichier dans son état à un commit précis. Le fichier est placé à la fois dans votre répertoire de travail et dans la zone de préparation.

Si nécessaireRamène l’ancienne version d’un fichier, préparée, sans changer de branche

Exemple

git checkout a1b2c3d -- src/app.js

Forcer le checkout même avec des modifications non committées. Jette TOUTES les modifications locales des fichiers suivis (pas seulement celles en conflit) et tous les fichiers non suivis qui gênent.

DéconseilléJette toutes les modifications non commitées des fichiers suivis — utilisez plutôt stash

Exemple

git checkout -f main

Pendant un conflit de fusion, extraire notre version (la branche où vous étiez) du fichier en conflit. Utile pour résoudre un conflit en choisissant un côté. Attention : pendant un rebase, ours/theirs sont inversés.

Si nécessaireRésout un fichier en conflit en gardant votre version (les côtés s’inversent pendant un rebase)

Exemple

git checkout --ours config.js

Pendant un conflit de fusion, extraire leur version (la branche en cours de fusion) du fichier en conflit. Accepte les modifications entrantes. Attention : pendant un rebase, ours/theirs sont inversés.

Si nécessaireRésout un fichier en conflit en prenant la version qui arrive

Exemple

git checkout --theirs config.js

Avancé (3)

Créer une nouvelle branche vierge sans historique de commits. Les fichiers actuels restent dans l’arbre de travail et la zone de préparation ; le premier commit de cette branche n’aura pas de parent, ce qui crée un historique indépendant.

Si nécessaireDémarre un historique sans lien (gh-pages, docs) ; rarement utile

Exemple

git checkout --orphan gh-pages

Quand vous changez de branche avec des modifications locales sur des fichiers qui diffèrent entre les deux branches, les emporter par une fusion à trois voies au lieu de refuser ; les conflits restent dans l’arbre de travail à résoudre. Depuis Git 2.55, les modifications locales sont d’abord enregistrées dans une entrée de stash, donc un changement de branche en conflit ne peut plus les perdre.

Si nécessaireEmporte les modifications locales vers une autre branche ; peut laisser des conflits

Exemple

git checkout -m feature

Choisir de façon interactive les blocs à jeter du répertoire de travail. Permet de garder certaines modifications et d’en annuler d’autres dans le même fichier.

Si nécessaireNe jette que les hunks choisis — lisez chaque question attentivement

Exemple

git checkout -p -- app.js

Choisir la bonne option

Créer des branches

Différentes façons de créer une nouvelle branche et d’y basculer

CommandeSi la branche existeHistoriqueIdéal pour
-b <name>Échoue avec une erreurNormale (reliée)Travail standard sur une nouvelle fonctionnalité
-B <name>Replacée sur le commit courantNormale (reliée)Recommencer une branche à zéro
--orphan <name>Échoue avec une erreurAucun (déconnectée)gh-pages, docs, page blanche

Changer de branche avec des modifications non committées

Ce qui arrive à vos modifications locales quand vous changez de branche

CommandeModifications non committéesNiveau de risqueQuand l’utiliser
git checkout <branch>Bloqué en cas de conflitSans risqueComportement par défaut - évite les accidents
git checkout -f <branch>Jetées définitivementDangereuxAbandonner volontairement toutes les modifications locales
git checkout -m <branch>Fusionnées par une fusion à trois voiesMoyenEmporter les modifications sur une autre branche
git stash + checkoutMises de côté pour plus tardSans risqueChangement de contexte temporaire

Restaurer des fichiers

Jeter ou restaurer le contenu de fichiers depuis différentes sources

CommandeSourceTouche l’indexRécupérable
-- <file>Index (version indexée)NoNon - modifications perdues pour toujours
<commit> -- <file>Un commit précisOui (indexé)Non - mais indexé pour relecture
-p -- <file>Index (interactif)NoPartiel - choisissez les blocs

Suivi des branches distantes

Contrôler la relation entre branches locales et distantes

CommandeCrée le suiviCas d’usagegit push/pull
--track origin/featOui (automatique)Travailler sur la branche d’un collègueFonctionne sans arguments
--no-track -b exp origin/mainNon (indépendante)Expérimenter sans risqueExige de nommer le dépôt distant
<remote-branch>Oui (si c’est sans ambiguïté)Extraire rapidement une branche distanteFonctionne sans arguments

Résoudre des conflits de fusion

Choisir un côté pendant un conflit de fusion

CommandeGardeJetteQuand l’utiliser
--ours <file>La version de votre brancheModifications entrantesVos modifications sont les bonnes
--theirs <file>Version entranteVos modificationsAccepter leur implémentation
(manual edit)Résultat combinéRienBesoin de parties des deux côtés

checkout face aux commandes modernes

Git 2.23+ a séparé checkout en commandes ciblées

CommandeChange de brancheRestaure des fichiersRecommandé pour
git checkoutOuiOuiHabitude, anciennes versions de Git
git switchOuiNoIntention claire : opérations sur les branches seulement
git restoreNoOuiIntention claire : opérations sur les fichiers seulement

Exemples de workflows

1
git stash

Mettre de côté le travail non committé en cours

2
git checkout other-branch

Passer sur l’autre branche

3
(review or make quick fix)

Faire le travail nécessaire sur cette branche

4
git checkout -

Revenir à la branche précédente (raccourci)

5
git stash pop

Restaurer le travail mis de côté

1
git checkout main

Passer sur la branche main

2
git pull origin main

Récupérer les dernières modifications du dépôt distant

3
git checkout -b feature-name

Créer la nouvelle branche de fonctionnalité et y basculer

4
(make changes and commits)

Travailler sur la fonctionnalité

5
git push -u origin feature-name

Pousser la branche et configurer le suivi

1
git status

Voir quels fichiers ont été modifiés

2
git diff file.js

Relire les modifications que vous allez jeter

3
git checkout -- file.js

Jeter les modifications d’un fichier précis

4
git checkout -- .

Ou jeter TOUTES les modifications non indexées des fichiers suivis

1
git log --oneline

Trouver le hash du commit voulu

2
git checkout <commit-hash>

Extraire ce commit précis (HEAD détaché)

3
(inspect, test, or debug)

Examiner l’ancien code

4
git checkout main

Revenir sur la branche main une fois fini

1
git log --oneline -- file.js

Trouver les commits qui ont modifié ce fichier

2
git show <commit>:file.js

Prévisualiser l’ancienne version

3
git checkout <commit> -- file.js

Restaurer le fichier depuis ce commit (il est indexé)

4
git commit -m 'Restore file.js'

Committer la version restaurée

1
git fetch origin

Récupérer les dernières infos sur les branches distantes

2
git branch -r

Voir les branches distantes disponibles

3
git checkout --track origin/feature

Créer une branche locale qui suit la distante

4
git pull

Maintenant pull fonctionne sans préciser le dépôt distant

Dépannage

error: Your local changes to the following files would be overwritten by checkout

Cause : Vous avez des modifications non committées qui entrent en conflit avec la branche cible

Committez vos modifications, mettez-les dans le stash, ou utilisez -f pour forcer (jette les modifications)

git stash && git checkout branch && git stash pop

error: pathspec 'branch-name' did not match any file(s) known to git

Cause : La branche n’existe pas, ou vous avez peut-être fait une faute de frappe dans le nom

Consultez les branches disponibles avec git branch -a, ou créez la branche avec -b

git branch -a | grep branch-name

You are in 'detached HEAD' state

Cause : Vous avez extrait un hash de commit ou un tag au lieu d’un nom de branche

Si vous voulez continuer à travailler, créez une branche. Sinon, extrayez une branche existante

git checkout -b new-branch-name

Les commits faits en HEAD détaché sont perdus

Cause : Vous avez fait des commits en HEAD détaché puis êtes passé sur une autre branche

Retrouvez les commits avec le reflog et créez une branche pour les garder

git reflog && git branch recovered-work <commit-hash>

Checkout impossible : un fichier non suivi serait écrasé

Cause : Vous avez des fichiers non suivis qui existent dans la branche cible

Supprimez, déplacez ou mettez d’abord ces fichiers non suivis dans le stash

git stash --include-untracked && git checkout branch

Modifications jetées par erreur avec checkout --

Cause : git checkout -- <file> supprime définitivement les modifications non committées

Malheureusement, Git ne peut pas les récupérer. Regardez l’historique local de votre éditeur

(check IDE local history if available)

fatal: 'name' could be both a local file and a tracking branch

Cause : Un fichier ou un dossier porte le même nom que la branche distante que vous voulez extraire

Ajoutez un -- à la fin pour dire à Git que ce nom est une branche, ou utilisez git switch

git checkout branch-name --

La branche ne se met pas à jour après le checkout

Cause : Vous avez peut-être extrait directement une branche de suivi distante

Créez une branche de suivi locale au lieu d’extraire directement origin/branch

git checkout --track origin/branch-name

Astuces et pièges

Bonnes pratiques

  • ✓Utilisez 'git stash' avant de changer de branche si vous avez du travail non committé à garder
  • ✓Préférez 'git checkout -b' à 'git branch' + 'git checkout' séparés pour créer une branche et y basculer
  • ✓Utilisez '--' pour séparer clairement les chemins de fichiers des noms de branche : 'git checkout -- file.txt'
  • ✓Pensez aux commandes modernes 'git switch' pour les branches et 'git restore' pour les fichiers - l’intention est plus claire
  • ✓Utilisez 'git checkout -' pour revenir rapidement à la branche précédente (comme 'cd -')
  • ✓Avant d’utiliser '-f' pour forcer le checkout, assurez-vous de vraiment vouloir jeter vos modifications
  • ✓En HEAD détaché, créez tout de suite une branche si vous comptez faire des commits
  • ✓Utilisez '--track' en extrayant des branches distantes pour configurer push/pull automatiquement
  • ✓Utilisez 'git checkout <commit> -- <file>' pour restaurer certains fichiers sans changer de branche
  • ✓Évitez d’extraire directement des commits sauf pour enquêter - utilisez des noms de branche pour le travail courant
  • ✓Utilisez '-p' (mode patch) pour ne jeter que certaines modifications d’un fichier
  • ✓Vérifiez toujours que vous êtes sur la bonne branche avec 'git branch' ou 'git status' avant de commencer à travailler

Erreurs fréquentes

  • ✗Tenter un checkout avec des modifications non committées. Git refuse de changer de branche s’il devait écraser vos modifications - committez, faites un stash, ou utilisez -f pour forcer (jette les modifications).
  • ✗Confondre checkout pour les branches et pour les fichiers. Restaurer des fichiers par erreur en voulant changer de branche - mettez -- avant les chemins : git checkout -- file.txt
  • ✗Faire des commits en HEAD détaché. Ces commits deviennent orphelins dès que vous extrayez une autre branche - créez d’abord une branche : git checkout -b my-branch
  • ✗Utiliser -B sans comprendre qu’il écrase. Cela peut faire perdre la position de la branche existante - utilisez -b pour les nouvelles branches, et -B seulement pour une remise à zéro voulue.

FAQ

A:

'git switch' est une commande plus récente (Git 2.23+) qui ne fait que changer de branche, ce qui la rend plus claire et plus sûre. 'git checkout' peut à la fois changer de branche ET restaurer des fichiers, ce qui peut prêter à confusion. Utilisez 'git switch' pour les branches et 'git restore' pour les fichiers si vous préférez l’approche moderne.

A:

Malheureusement, Git seul ne peut pas l’annuler - les modifications sont jetées définitivement. Certains IDE ont un historique local qui peut aider. C’est pour cela qu’il faut être prudent avec cette commande.

A:

HEAD détaché signifie que vous avez extrait un commit précis plutôt qu’une branche. Vous pouvez explorer et faire des commits, mais ils n’appartiendront à aucune branche. Créez une branche avec 'git checkout -b name' pour garder votre travail.

A:

'-b' crée une nouvelle branche et échoue si elle existe déjà. '-B' crée une nouvelle branche ou replace une branche existante sur la position courante. Utilisez '-B' quand vous voulez volontairement remettre une branche à zéro.

A:

Utilisez 'git checkout other-branch -- path/to/file'. Cela copie le fichier de cette branche dans votre répertoire de travail et votre zone de préparation. Vous pouvez ensuite le committer sur votre branche courante.

A:

Git vous protège contre la perte de travail. Si changer de branche devait écraser vos modifications, il refuse. Committez vos modifications, mettez-les de côté avec 'git stash', ou utilisez 'git checkout -f' pour forcer (ce qui jette les modifications).

A:

Il revient à la branche extraite précédemment, comme 'cd -' dans le shell. C’est un moyen rapide d’alterner entre deux branches sur lesquelles vous travaillez.

A:

Faites d’abord 'git fetch origin', puis soit 'git checkout branch-name' (Git crée automatiquement une branche de suivi si origin/branch-name existe), soit explicitement 'git checkout --track origin/branch-name'.

A:

Oui, utilisez 'git checkout -p <commit> -- <file>' pour le mode interactif, ou simplement 'git checkout <commit> -- <specific-files>' pour ne restaurer que certains fichiers de ce commit.

A:

Parce qu’il fait deux choses très différentes : changer de branche ET restaurer des fichiers. Git 2.23 a introduit 'git switch' et 'git restore' pour séparer ces rôles. 'git checkout' fonctionne toujours et reste très utilisé.