Préparation d'entretien 100% Gratuit angularforall.com

Entretien Git Junior — Merge, Rebase et Conflits

Git Junior Quiz-Git-Junior Git-Merge Git-Rebase Resolution-Conflits Entretien-Git-Junior Qcm-Git-Avance Git-Stash Git-Remote Git-Tag Git-Cherry-Pick Git-Reset
Junior 🔀 Mixte 20 questions ⏱ 15 min
📝

Entretien Git Junior — Merge, Rebase et Conflits

Évaluez votre maîtrise Git avec 20 questions niveau junior : merge, rebase, stash, résolution de conflits, tags et remotes. Préparez vos entretiens techniques.

20 questions ⏱ ~15 min Niveau Junior

Partager

Banque de révision : les 60 questions corrigées

Voici l'intégralité des 60 questions de « Entretien Git Junior — Merge, Rebase et Conflits », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.

  • merge crée un commit de fusion, rebase rejoue les commits par-dessus une autre base (bonne réponse)
  • merge supprime l'historique, rebase le conserve intact
  • merge ne fonctionne que localement, rebase uniquement sur le serveur distant
  • Il n'y a aucune différence, ce sont deux alias de la même commande
Explication : git merge combine deux branches en créant un commit de fusion qui possède deux parents, ce qui préserve l'historique réel. git rebase réécrit l'historique en rejouant les commits de la branche courante un par un au sommet d'une nouvelle base. Le résultat de merge est non destructif, celui de rebase produit un historique linéaire mais modifie les SHA des commits.
Merge = on garde la trace, rebase = on remet au propre.

  • Ne jamais rebaser une branche déjà partagée et poussée sur le dépôt distant (bonne réponse)
  • Toujours rebaser la branche main avant chaque commit
  • Ne rebaser que les branches contenant plus de dix commits
  • Rebaser uniquement le vendredi pour éviter les conflits
Explication : La règle d'or du rebase est de ne jamais réécrire l'historique d'une branche partagée. Comme git rebase change les SHA des commits, les collègues qui ont déjà récupéré l'ancienne version se retrouveront avec un historique divergent. On rebase donc librement ses branches locales et privées, mais on utilise merge sur les branches publiques comme main.
Rebase en privé, merge en public.

  • git rebase --update main
  • git rebase main (bonne réponse)
  • git merge rebase main
  • git rebase HEAD main
Explication : git rebase main rejoue les commits de la branche courante au-dessus du dernier commit de main. C'est la manière classique de mettre à jour une branche de fonctionnalité avec les évolutions récentes de la branche principale. On exécute souvent d'abord git checkout ma-branche puis git rebase main pour obtenir un historique propre avant l'ouverture d'une Pull Request.
D'abord se placer sur sa branche, ensuite rebaser sur main.

  • Des commentaires de log automatiquement supprimés par Git
  • Le début et la fin d'une zone de conflit délimitant les deux versions divergentes (bonne réponse)
  • Des numéros de ligne à ne pas modifier
  • Des balises de chiffrement du contenu sensible
Explication : Quand Git ne peut pas fusionner automatiquement, il insère des marqueurs de conflit dans le fichier. ferme la zone avec la version entrante. Vous devez éditer le fichier pour garder le bon contenu et supprimer entièrement les trois marqueurs.
Garde le bon code, efface les sept chevrons.

  • git resolve fichier
  • git conflict --done fichier
  • git add fichier (bonne réponse)
  • git commit --fix fichier
Explication : Une fois les marqueurs supprimés et le contenu corrigé, on exécute git add fichier pour marquer le conflit comme résolu. L'ajout à l'index signale à Git que la version retenue est validée. Ensuite, lors d'un merge on poursuit avec git commit, et lors d'un rebase avec git rebase --continue.
Conflit résolu = git add du fichier concerné.

  • git merge --abort (bonne réponse)
  • git merge --cancel
  • git reset --merge-stop
  • git undo merge
Explication : git merge --abort interrompt une fusion conflictuelle et restaure l'état du dépôt avant le début du merge. C'est très utile lorsqu'on réalise que la fusion est trop complexe ou qu'on s'est trompé de branche. L'arbre de travail et l'index reviennent proprement à la situation initiale.
Trop de conflits ? --abort remet tout comme avant.

  • git commit --rebase
  • git rebase --next
  • git rebase --continue (bonne réponse)
  • git rebase --resume
Explication : Lors d'un rebase, Git rejoue les commits un par un. En cas de conflit, on corrige les fichiers, on fait git add, puis git rebase --continue pour passer au commit suivant. On peut aussi utiliser git rebase --skip pour ignorer un commit ou git rebase --abort pour tout annuler.
Rebase bloqué : add puis --continue.

  • À supprimer définitivement les modifications non commitées
  • À mettre de côté temporairement les modifications en cours sans les commiter (bonne réponse)
  • À créer une branche de sauvegarde nommée stash
  • À pousser les modifications directement sur le dépôt distant
Explication : git stash met de côté les modifications non commitées de l'arbre de travail et de l'index, puis restaure un répertoire propre. C'est pratique pour changer rapidement de branche ou récupérer un correctif urgent sans créer un commit incomplet. Les modifications sont stockées dans une pile que l'on peut réappliquer plus tard.
Stash = un tiroir temporaire pour ton travail en cours.

  • pop réapplique le stash et le supprime de la pile, apply le réapplique en le conservant (bonne réponse)
  • pop ne fonctionne que sur le dernier stash, apply sur n'importe lequel uniquement
  • pop crée un commit, apply crée une branche
  • Il n'y a aucune différence entre les deux commandes
Explication : git stash pop réapplique les modifications stockées puis retire l'entrée de la pile. git stash apply réapplique les modifications mais conserve l'entrée, ce qui permet de la réutiliser ailleurs. On préfère apply quand on veut garder une copie de sécurité du stash.
pop = applique et jette, apply = applique et garde.

  • git stash --message "correctif"
  • git stash push -m "correctif" (bonne réponse)
  • git stash save --note "correctif"
  • git stash commit -m "correctif"
Explication : git stash push -m "correctif" crée une entrée de stash avec un message personnalisé, ce qui facilite son identification dans la liste. La forme git stash save existait dans les anciennes versions mais elle est désormais dépréciée au profit de git stash push.
git stash push -m pour nommer tes tiroirs.

  • git stash show-all
  • git stash --history
  • git stash list (bonne réponse)
  • git stash log
Explication : git stash list affiche la pile des stashs sous la forme stash@{0}, stash@{1}, etc. Chaque entrée indique la branche d'origine et le message éventuel. On peut ensuite cibler un stash précis, par exemple git stash apply stash@{2}.
stash list pour retrouver tous tes tiroirs ouverts.

  • git stash drop stash@{0} (bonne réponse)
  • git stash delete stash@{0}
  • git stash remove stash@{0}
  • git stash clear stash@{0}
Explication : git stash drop stash@{0} supprime une entrée précise de la pile sans en réappliquer le contenu. Pour vider l'intégralité de la pile en une fois, on utilise git stash clear, mais cette opération est irréversible et doit être employée avec prudence.
drop = un tiroir, clear = tous les tiroirs.

  • Elle supprime le commit indiqué de l'historique
  • Elle applique sur la branche courante les modifications d'un commit précis (bonne réponse)
  • Elle fusionne toutes les branches contenant ce commit
  • Elle affiche le détail du commit sans le modifier
Explication : git cherry-pick prend un commit existant et applique ses modifications comme un nouveau commit sur la branche courante. C'est idéal pour récupérer un correctif isolé d'une autre branche sans tout fusionner. Le nouveau commit possède un SHA différent puisqu'il a un parent différent.
Cherry-pick = piocher un seul commit à la fois.

  • Le tag léger ne peut pas être poussé sur un dépôt distant
  • Le tag annoté stocke un objet complet avec auteur, date et message, le tag léger est un simple pointeur (bonne réponse)
  • Le tag léger pointe sur une branche, le tag annoté sur un commit
  • Il n'y a aucune différence technique entre les deux
Explication : Un tag léger (git tag v1.0) est un simple pointeur nommé vers un commit, sans métadonnées. Un tag annoté (git tag -a v1.0 -m "version 1.0") est un véritable objet Git stockant l'auteur, la date et un message, et il peut être signé. Pour les versions officielles, on privilégie toujours les tags annotés.
Releases officielles = tag annoté avec -a.

  • git push origin v1.0 (bonne réponse)
  • git tag push origin v1.0
  • git push --tag-only v1.0
  • git remote push tag v1.0
Explication : Par défaut, git push n'envoie pas les tags. Il faut explicitement faire git push origin v1.0 pour un tag précis, ou git push origin --tags pour envoyer tous les tags locaux. Cette étape est souvent oubliée après la création d'un tag de version.
Un tag créé reste local tant qu'on ne le pousse pas.

  • Il supprime le dernier commit et toutes ses modifications définitivement
  • Il annule le dernier commit en gardant les modifications dans l'index (bonne réponse)
  • Il annule le dernier commit en supprimant les fichiers du disque
  • Il crée une copie du dernier commit sur une nouvelle branche
Explication : git reset --soft HEAD~1 déplace le pointeur HEAD un commit en arrière mais conserve les modifications dans l'index (zone de staging). Le commit est défait, mais le travail reste prêt à être recommité. C'est parfait pour refaire un commit avec un meilleur message ou regrouper plusieurs commits.
--soft : le commit saute, le travail reste indexé.

  • --hard
  • --soft
  • --mixed (bonne réponse)
  • --keep
Explication : git reset --mixed est le mode par défaut. Il déplace HEAD et réinitialise l'index, mais laisse les modifications dans le répertoire de travail en tant que changements non indexés. --soft conserve l'index, tandis que --hard détruit aussi les changements du répertoire de travail.
--mixed : commit et index sautent, le code reste sur le disque.

  • Elle envoie automatiquement les modifications sur le dépôt distant
  • Elle détruit définitivement les modifications non commitées du répertoire de travail (bonne réponse)
  • Elle verrouille la branche en lecture seule
  • Elle supprime toutes les branches locales du dépôt
Explication : git reset --hard agit sur les trois zones : HEAD, l'index et le répertoire de travail. Toute modification non commitée est perdue sans possibilité de récupération simple. On l'utilise avec prudence, généralement pour revenir à un état propre connu. En cas d'erreur, git reflog peut parfois aider à retrouver un commit perdu.
--hard efface tout : sauvegarde avant de l'utiliser.

  • revert crée un nouveau commit qui annule un commit, reset déplace le pointeur de branche (bonne réponse)
  • revert supprime un commit, reset en crée un nouveau
  • revert agit sur les branches, reset uniquement sur les tags
  • Les deux commandes sont strictement équivalentes
Explication : git revert crée un nouveau commit qui inverse les modifications d'un commit antérieur, sans réécrire l'historique. git reset déplace le pointeur de branche, ce qui réécrit l'historique. Sur une branche partagée, on utilise revert car il est sûr ; reset est réservé aux branches privées.
Historique partagé = revert, jamais reset.

  • git log --short
  • git log --oneline (bonne réponse)
  • git log --compact
  • git log --brief
Explication : git log --oneline affiche chaque commit sur une seule ligne avec un SHA abrégé et le titre du message. C'est l'option la plus utilisée pour avoir une vue d'ensemble rapide. On la combine souvent avec --graph et --all pour visualiser la structure des branches.
--oneline pour une vue d'ensemble lisible.

  • git log --tree
  • git log --branches
  • git log --graph (bonne réponse)
  • git log --visual
Explication : git log --graph trace un graphe ASCII illustrant les branchements et les fusions de l'historique. Combinée à --oneline --all, elle donne une commande très pratique : git log --oneline --graph --all qui permet de comprendre visuellement la structure du dépôt.
--graph --oneline --all : le trio gagnant.

  • git log --author="Alice" (bonne réponse)
  • git log --by="Alice"
  • git log --user="Alice"
  • git log --committed-by="Alice"
Explication : git log --author="Alice" filtre l'historique pour n'afficher que les commits dont l'auteur correspond au motif fourni. Le motif est interprété comme une expression régulière, donc --author="Ali" trouverait aussi Alice. On combine souvent ce filtre avec --since et --until pour cibler une période.
--author accepte une regex, pas un nom exact.

  • git log --diff
  • git log -p (bonne réponse)
  • git log --full
  • git log --changes
Explication : git log -p (ou --patch) affiche, pour chaque commit, le diff complet des modifications introduites. C'est très utile pour réviser le code historique. L'option --stat donne une version plus légère avec uniquement le nombre de lignes modifiées par fichier.
-p pour voir le code, --stat pour voir les chiffres.

  • git diff
  • git diff --staged (bonne réponse)
  • git diff HEAD~1
  • git diff --working
Explication : git diff --staged (ou son alias --cached) montre les différences entre l'index et le dernier commit, donc ce qui sera inclus au prochain git commit. À l'inverse, git diff sans option compare le répertoire de travail à l'index, c'est-à-dire les modifications non encore indexées.
git diff = pas encore add ; git diff --staged = déjà add.

  • git diff branche1 et branche2
  • git diff branche1 branche2 (bonne réponse)
  • git diff --between branche1 branche2
  • git diff --branches
Explication : git diff branche1 branche2 affiche les différences entre les sommets des deux branches indiquées. On peut aussi comparer deux commits en passant leurs SHA, par exemple git diff abc123 def456. La notation à trois points branche1...branche2 compare quant à elle par rapport à leur ancêtre commun.
git diff A B compare directement deux références.

  • git remote create origin
  • git remote new origin
  • git remote add origin (bonne réponse)
  • git remote set origin
Explication : git remote add origin enregistre un dépôt distant sous le nom origin, le nom conventionnel pour le dépôt principal. On peut ensuite vérifier la configuration avec git remote -v qui affiche les URL de récupération (fetch) et d'envoi (push).
remote add pour relier ton dépôt local au serveur.

  • git remote rename ancien nouveau (bonne réponse)
  • git remote move ancien nouveau
  • git remote --rename ancien nouveau
  • git remote update-name ancien nouveau
Explication : git remote rename ancien nouveau change le nom d'un dépôt distant, par exemple git remote rename origin upstream. Pour supprimer un distant, on utilise git remote remove nom (ou son ancien alias rm). Ces commandes ne touchent pas au dépôt distant lui-même, seulement à sa référence locale.
remote rename, remote remove : gestion des distants.

  • Elle force la mise à jour en écrasant le distant
  • Elle établit le lien de suivi entre la branche locale et la branche distante (bonne réponse)
  • Elle pousse uniquement les commits non vérifiés
  • Elle met à jour les sous-modules du dépôt
Explication : L'option -u (ou --set-upstream) crée la relation de suivi entre la branche locale et la branche distante. Après cela, un simple git push ou git pull sans argument suffit, car Git connaît la branche associée. On l'utilise typiquement la première fois qu'on pousse une nouvelle branche.
Premier push d'une branche : ajoute -u une seule fois.

  • Une branche locale associée à une branche distante pour synchroniser push et pull (bonne réponse)
  • Une branche qui enregistre toutes les commandes Git exécutées
  • Une branche en lecture seule réservée aux relectures de code
  • Une copie automatique de la branche main créée à chaque commit
Explication : Une branche de suivi est une branche locale liée à une branche distante (son upstream). Cette association permet à Git de savoir où pousser et d'où récupérer, et d'indiquer si la branche locale est en avance ou en retard. La commande git branch -vv affiche les relations de suivi configurées.
Tracking branch = locale qui sait dialoguer avec sa distante.

  • git pull crée un commit de fusion, git pull --rebase rejoue tes commits par-dessus les changements distants (bonne réponse)
  • git pull télécharge tout le dépôt, git pull --rebase seulement la branche courante
  • git pull --rebase fonctionne hors ligne, git pull nécessite Internet
  • Les deux commandes produisent exactement le même historique
Explication : git pull équivaut à git fetch suivi de git merge, ce qui peut créer un commit de fusion. git pull --rebase fait un git fetch suivi d'un git rebase, rejouant vos commits locaux au-dessus des nouveautés distantes. Le résultat est un historique linéaire, sans commit de fusion superflu.
--rebase pour un historique propre lors d'un pull.

  • Une fusion qui ignore les conflits automatiquement
  • Une fusion où le pointeur de branche avance simplement sans créer de commit de fusion (bonne réponse)
  • Une fusion qui compresse plusieurs commits en un seul
  • Une fusion réservée aux dépôts distants
Explication : Une fusion fast-forward se produit quand la branche cible n'a pas divergé : Git peut simplement faire avancer le pointeur jusqu'au dernier commit de la branche fusionnée, sans créer de commit de fusion. L'historique reste linéaire. Si les branches ont divergé, Git effectue une vraie fusion à trois voies.
Fast-forward = le pointeur glisse, aucun merge commit.

  • Elle annule la fusion si un conflit survient
  • Elle crée toujours un commit de fusion, même quand un fast-forward serait possible (bonne réponse)
  • Elle fusionne sans vérifier les fichiers ignorés
  • Elle ignore les commits de moins de cinq lignes
Explication : git merge --no-ff impose la création d'un commit de fusion explicite, même lorsqu'un fast-forward serait possible. Cela conserve une trace visible de l'intégration d'une branche de fonctionnalité dans l'historique. Beaucoup d'équipes l'utilisent pour que chaque feature reste clairement identifiable.
--no-ff garde une trace visible de chaque feature.

  • Le dépôt est corrompu et doit être recloné
  • HEAD pointe directement sur un commit au lieu de pointer sur une branche (bonne réponse)
  • La branche courante a été supprimée du dépôt distant
  • Le fichier .git a été effacé par erreur
Explication : En detached HEAD, HEAD pointe directement sur un commit précis plutôt que sur une branche. Cela arrive en faisant git checkout ou en se plaçant sur un tag. Les commits créés dans cet état ne sont rattachés à aucune branche et risquent d'être perdus s'ils ne sont pas sauvegardés.
Detached HEAD : tu es sur un commit, pas sur une branche.

  • Exécuter git checkout main pour abandonner immédiatement
  • Créer une branche avec git switch -c nouvelle-branche pour rattacher les commits (bonne réponse)
  • Lancer git reset --hard HEAD pour réparer le pointeur
  • Supprimer le dossier .git puis recloner le dépôt
Explication : Pour conserver des commits faits en detached HEAD, on crée une branche qui les rattache : git switch -c nouvelle-branche (ou git branch nom). Si on quittait l'état detached sans cette précaution en revenant directement sur une autre branche, les commits orphelins deviendraient inaccessibles.
Du travail en detached HEAD ? Crée vite une branche.

  • -d supprime une branche locale, -D une branche distante
  • -d refuse de supprimer une branche non fusionnée, -D force la suppression (bonne réponse)
  • -d archive la branche, -D la supprime définitivement
  • Les deux options sont identiques
Explication : git branch -d nom est une suppression sécurisée : Git refuse de supprimer une branche dont les commits ne sont pas encore fusionnés ailleurs, pour éviter une perte de travail. git branch -D nom est la version majuscule qui force la suppression sans vérification.
-d protège, -D force : majuscule = danger.

  • git fetch télécharge les changements distants sans les fusionner, git pull télécharge puis fusionne (bonne réponse)
  • git fetch ne fonctionne que sur la branche main
  • git pull ne télécharge que les tags, git fetch les branches
  • git fetch supprime les branches locales obsolètes automatiquement
Explication : git fetch récupère les nouveautés du dépôt distant et met à jour les références distantes (origin/main, etc.) sans modifier votre branche de travail. git pull ajoute une étape : il enchaîne le fetch avec un merge (ou un rebase). fetch est donc plus sûr pour inspecter avant d'intégrer.
fetch = je regarde, pull = je récupère et j'intègre.

  • Elle ignore le fichier de façon prioritaire
  • Elle réinclut un fichier précédemment exclu par un motif (bonne réponse)
  • Elle marque le fichier comme important pour le commit
  • Elle est interprétée comme un commentaire
Explication : Dans un .gitignore, le préfixe ! est une négation : il réinclut un fichier qui aurait été exclu par un motif précédent. Par exemple *.log !important.log ignore tous les fichiers .log sauf important.log. L'ordre des règles est important : la négation doit venir après le motif d'exclusion.
Le ! réinclut une exception après une règle d'exclusion.

  • ignore: build
  • build/ (bonne réponse)
  • ~build~
  • all build
Explication : Pour ignorer un dossier complet, on écrit son nom suivi d'une barre oblique : build/. La barre finale indique explicitement qu'il s'agit d'un répertoire. On peut aussi utiliser des jokers, par exemple **/temp/ pour ignorer tout dossier temp à n'importe quelle profondeur.
Un slash final dans .gitignore = on cible un dossier.

  • À supprimer l'historique du fichier indiqué
  • À afficher, pour chaque ligne, le commit et l'auteur qui l'ont modifiée en dernier (bonne réponse)
  • À verrouiller le fichier en lecture seule
  • À comparer le fichier avec sa version distante
Explication : git blame fichier.txt annote chaque ligne du fichier avec le SHA du commit, l'auteur et la date de la dernière modification. C'est un outil précieux pour comprendre l'origine d'une ligne de code, identifier qui contacter ou retrouver le contexte d'un changement, sans intention d'accuser malgré son nom.
git blame répond à : qui a écrit cette ligne et pourquoi ?

  • Elle supprime les fichiers non suivis sans confirmation
  • Elle effectue une simulation et liste les fichiers qui seraient supprimés (bonne réponse)
  • Elle nettoie uniquement les fichiers nommés
  • Elle supprime aussi les fichiers ignorés
Explication : git clean -n est un mode simulation (dry-run) : il affiche les fichiers non suivis qui seraient supprimés, sans rien effacer. Pour réellement supprimer, on utilise git clean -f, et -d pour inclure les dossiers. On exécute toujours -n avant -f par précaution.
Toujours git clean -n avant git clean -f.

  • Les fichiers et dossiers non suivis du répertoire de travail (bonne réponse)
  • Les commits non poussés sur le distant
  • Les branches locales fusionnées
  • Les fichiers présents dans l'index mais pas commités
Explication : git clean -fd supprime les fichiers non suivis (-f pour forcer) ainsi que les dossiers non suivis (-d). Cette commande ne touche ni aux fichiers suivis, ni aux fichiers ignorés (sauf avec -x). C'est utile pour nettoyer un répertoire de travail encombré de fichiers générés.
-f pour les fichiers, -d pour les dossiers non suivis.

  • Au troisième commit depuis le début du dépôt
  • À l'ancêtre situé trois générations avant le commit courant (bonne réponse)
  • Au troisième parent du commit de fusion courant
  • À la branche numéro trois
Explication : HEAD~3 désigne le commit situé trois générations en arrière en suivant le premier parent à chaque étape. Ainsi HEAD~1 est le commit précédent. Cette notation est très pratique pour des opérations comme git reset HEAD~2 ou git rebase -i HEAD~5.
HEAD~n : remonte n commits en arrière.

  • Au premier et au deuxième fichier modifié
  • Au premier et au deuxième parent du commit de fusion (bonne réponse)
  • À deux branches distantes différentes
  • Aux deux derniers commits de l'historique
Explication : Le symbole ^ sélectionne un parent d'un commit. Sur un commit de fusion, qui possède plusieurs parents, HEAD^1 est le premier parent (la branche sur laquelle on était) et HEAD^2 le deuxième (la branche fusionnée). Sur un commit ordinaire, HEAD^ équivaut à HEAD~1.
^ choisit quel parent, ~ remonte la lignée.

  • git commit --edit-last
  • git commit --amend (bonne réponse)
  • git commit --fix
  • git commit --rewrite
Explication : git commit --amend permet de modifier le dernier commit : on peut corriger son message ou ajouter des fichiers oubliés (préalablement indexés). Attention, cette opération réécrit l'historique car le SHA change ; il ne faut donc pas l'utiliser sur un commit déjà poussé et partagé.
--amend : pour rectifier le dernier commit, pas un plus ancien.

  • git restore --staged fichier (bonne réponse)
  • git remove --index fichier
  • git reset --hard fichier
  • git unstage --keep fichier
Explication : git restore --staged fichier désindexe un fichier : il le retire de la zone de staging tout en conservant ses modifications dans le répertoire de travail. C'est l'équivalent moderne et plus explicite de git reset HEAD fichier. Le fichier modifié reste donc présent, simplement non préparé pour le prochain commit.
restore --staged annule un git add sans rien perdre.

  • Elle supprime la branche puis la recrée
  • Elle crée une nouvelle branche et bascule immédiatement dessus (bonne réponse)
  • Elle copie le contenu de la branche courante vers une autre
  • Elle affiche les branches contenant le mot fonctionnalite
Explication : git switch -c nouvelle-fonctionnalite crée une branche puis bascule dessus en une seule commande. C'est l'équivalent moderne de git checkout -b. La commande git switch a été introduite pour clarifier le rôle de git checkout, qui était surchargé de fonctions différentes.
switch -c = créer et basculer en une fois.

  • À supprimer automatiquement la branche source
  • À permettre la relecture du code et la validation par l'équipe avant l'intégration (bonne réponse)
  • À compiler le code en production directement
  • À renommer la branche de fonctionnalité
Explication : Une Pull Request (ou Merge Request sur GitLab) propose d'intégrer une branche dans une autre. Elle ouvre un espace de relecture de code où les coéquipiers commentent, demandent des modifications et lancent les tests automatiques. La fusion n'a lieu qu'une fois la PR approuvée, ce qui améliore la qualité et le partage de connaissance.
La PR = un sas de relecture avant d'entrer dans main.

  • --global s'applique à tous les dépôts de l'utilisateur, --local uniquement au dépôt courant (bonne réponse)
  • --global modifie le dépôt distant, --local le dépôt local
  • --global est en lecture seule, --local en écriture
  • Les deux options écrivent dans le même fichier de configuration
Explication : git config --global écrit dans le fichier ~/.gitconfig et s'applique à tous les dépôts de l'utilisateur. git config --local écrit dans .git/config et ne concerne que le dépôt courant. La configuration locale est prioritaire sur la globale, ce qui permet de surcharger un réglage projet par projet.
Local écrase global : du plus précis au plus général.

  • Pour fusionner deux branches publiques très anciennes
  • Pour mettre à jour une branche de fonctionnalité locale et garder un historique linéaire (bonne réponse)
  • Pour résoudre automatiquement tous les conflits sans intervention
  • Pour partager rapidement un commit avec toute l'équipe
Explication : Le rebase est idéal pour mettre à jour une branche de fonctionnalité privée avec les évolutions de main, en obtenant un historique propre et linéaire avant l'ouverture d'une PR. Le merge reste préférable pour intégrer une branche dans une branche partagée, car il ne réécrit pas l'historique.
Rebase pour nettoyer sa branche, merge pour intégrer.

  • git log main..feature (bonne réponse)
  • git log feature--main
  • git log --only feature
  • git log feature except main
Explication : La notation à deux points git log main..feature affiche les commits présents dans feature mais absents de main. C'est très pratique pour visualiser ce qu'une branche apporte avant de la fusionner. Inverser l'ordre, feature..main, montrerait ce que main a en plus.
A..B = ce que B contient en plus de A.

  • Git annule automatiquement l'opération sans rien dire
  • On résout le conflit, on fait git add, puis git cherry-pick --continue (bonne réponse)
  • On doit recloner le dépôt depuis zéro
  • Le commit est appliqué malgré le conflit
Explication : Comme pour un rebase, un git cherry-pick peut générer un conflit. On édite alors les fichiers, on fait git add, puis git cherry-pick --continue pour finaliser le commit. On peut aussi annuler avec git cherry-pick --abort pour revenir à l'état initial.
Cherry-pick en conflit : add puis --continue, comme le rebase.

  • git log --count
  • git log --stat (bonne réponse)
  • git log --lines
  • git log --files
Explication : git log --stat ajoute, sous chaque commit, un résumé des fichiers modifiés avec le nombre de lignes ajoutées et supprimées. C'est un bon compromis entre --oneline, trop concis, et -p, qui affiche le diff complet. On obtient ainsi une vue d'ensemble de l'ampleur de chaque changement.
--stat : combien de lignes touchées, sans tout le diff.

  • git remote -v (bonne réponse)
  • git remote --url
  • git remote show-all
  • git remote list -u
Explication : git remote -v (verbose) liste les dépôts distants avec leurs URL de fetch et de push. C'est la commande de référence pour vérifier vers quel serveur on pousse et d'où l'on récupère. Sans le -v, git remote n'affiche que les noms des distants.
remote -v pour voir où pointent vraiment tes distants.

  • git reset --hard sur le commit précédent
  • git revert sur le commit fautif (bonne réponse)
  • git commit --amend pour le corriger
  • git branch -D sur la branche concernée
Explication : Sur une branche partagée, on annule un commit fautif avec git revert . Cette commande crée un nouveau commit inverse qui défait les modifications, sans toucher à l'historique existant. Les collègues peuvent alors récupérer la correction par un simple git pull, sans conflit de divergence.
Commit poussé à corriger ? revert, jamais reset.

  • git tag v2.0 -m "Version 2.0"
  • git tag -a v2.0 -m "Version 2.0" (bonne réponse)
  • git tag --new v2.0 "Version 2.0"
  • git tag create v2.0 "Version 2.0"
Explication : git tag -a v2.0 -m "Version 2.0" crée un tag annoté, c'est-à-dire un objet Git complet contenant l'auteur, la date et le message. Sans l'option -a, git tag v2.0 créerait un simple tag léger. Pour les versions destinées à être publiées, le tag annoté est recommandé.
-a + -m : le duo pour un tag annoté propre.

  • Il affiche les différences introduites par le dernier commit (bonne réponse)
  • Il supprime le dernier commit
  • Il fusionne les deux commits indiqués
  • Il liste les fichiers ignorés entre deux commits
Explication : git diff HEAD~1 HEAD compare l'avant-dernier commit (HEAD~1) au dernier commit (HEAD), affichant ainsi exactement les modifications apportées par le dernier commit. Cette technique permet de revoir le contenu d'un commit précis en comparant deux références de l'historique.
diff entre deux refs = ce qui change de l'une à l'autre.

  • Parce que la commande est trop lente sur les gros dépôts
  • Parce qu'elle peut écraser les commits poussés par les collègues et provoquer des pertes de travail (bonne réponse)
  • Parce qu'elle supprime tous les tags du dépôt distant
  • Parce qu'elle désactive les branches de suivi
Explication : git push --force remplace l'historique distant par le vôtre. Sur une branche partagée, cela peut écraser des commits poussés par d'autres et provoquer des pertes de travail difficiles à récupérer. Quand un push forcé est nécessaire après un rebase, on préfère --force-with-lease, qui refuse d'écraser si le distant a été mis à jour entre-temps.
Push forcé indispensable ? Préfère --force-with-lease.

  • git stash drop --all
  • git stash clear (bonne réponse)
  • git stash empty
  • git stash purge
Explication : git stash clear vide entièrement la pile de stashs. Cette opération est irréversible : tous les travaux mis de côté sont supprimés d'un coup. Pour ne retirer qu'une entrée précise, on utilise plutôt git stash drop stash@{n}.
stash clear vide tout : assure-toi de ne plus en avoir besoin.

  • git branch --merged (bonne réponse)
  • git branch --done
  • git branch --integrated
  • git branch --closed
Explication : git branch --merged affiche les branches dont les commits sont déjà intégrés dans la branche courante : elles peuvent généralement être supprimées sans risque avec git branch -d. À l'inverse, git branch --no-merged liste les branches contenant encore du travail non fusionné.
--merged repère les branches prêtes à être nettoyées.

  • Elle ignore les conflits pendant le rebase
  • Elle ouvre un rebase interactif permettant de réorganiser, fusionner ou réécrire des commits (bonne réponse)
  • Elle installe les dépendances avant le rebase
  • Elle inverse l'ordre de tous les commits du dépôt
Explication : git rebase -i (interactif) ouvre un éditeur listant les commits concernés avec des actions possibles : pick pour garder, squash pour fusionner avec le précédent, reword pour changer le message, drop pour supprimer, ou réordonner les lignes. C'est l'outil idéal pour nettoyer son historique avant une Pull Request.
rebase -i : le couteau suisse pour ranger ses commits.