Aller au contenu
yaggui docsProchaine (non publiée)

Cherry-pick, revert et reset

Ces actions portent sur des commits que vous sélectionnez dans le graphe : les copier sur une branche (cherry-pick), créer un commit qui en annule un (revert), déplacer la branche courante sur un commit (reset), ou extraire un commit sans branche.

La plupart partent du menu contextuel d’un commit : faites un clic droit sur une ligne du graphe, ou appuyez sur Shift+F10 ou sur la touche de menu contextuel, la ligne étant sélectionnée. Tant qu’un merge, un rebase, un cherry-pick ou un revert est en cours, les entrées de cherry-pick, de revert et de reset sont désactivées (Termine ou annule d’abord l’opération en cours).

Un cherry-pick applique les changements de commits existants sous forme de nouveaux commits sur la branche courante (git-cherry-pick).

Faites un clic droit sur le commit et choisissez Cherry-pick sur {branch}, où {branch} est la branche extraite, ou HEAD quand il est détaché.

  1. Sélectionnez les commits dans le graphe : ⌘-clic (Ctrl-clic sous Windows et Linux) pour en ajouter ou en retirer un, Shift-clic ou Shift+↑/Shift+↓ pour une plage.
  2. La barre de sélection affiche {count} commits sélectionnés. Cliquez sur Cherry-pick de {count} commits sur {branch} dans la barre, ou faites un clic droit dans la sélection et choisissez la même entrée.

Esc ramène la sélection à un seul commit.

Les commits sont appliqués du plus ancien au plus récent, quel que soit l’ordre dans lequel vous les avez sélectionnés. Les doublons sont ignorés.

Glissez une ligne de commit (ou une ligne de la multisélection en cours, ce qui glisse toute la sélection) sur une branche locale dans la barre latérale, ou sur une étiquette de branche dans le graphe. Le menu de dépôt propose Cherry-pick de ce commit sur {target} ou Cherry-pick de {count} commits sur {target}, avec l’indication Bascule d’abord sur {target} quand la cible n’est pas la branche courante. yaggui extrait la cible, puis lance le cherry-pick. Si des modifications locales empêchent ce checkout, la boîte de dialogue de checkout s’ouvre et le cherry-pick n’est pas exécuté.

Cherry-pick des commits sélectionnés applique la sélection du graphe sur la branche courante. Sans sélection, elle affiche Sélectionne d’abord un commit dans le graphe.

Il n’y a pas de confirmation. yaggui exécute :

Fenêtre de terminal
git cherry-pick [-m <parent>] <sha1> <sha2> …

Notification : Commit cherry-pické sur {target} ou {count} commits cherry-pickés sur {target}.

Cherry-picker un commit de merge demande un parent : yaggui ouvre la boîte de dialogue du parent.

Un revert crée un nouveau commit qui annule les changements d’un commit existant (git-revert).

Faites un clic droit sur le commit et choisissez Revert de ce commit, ou lancez Revert du commit sélectionné depuis la palette (elle utilise le commit sélectionné). Pour un commit ordinaire, il n’y a pas de confirmation ; yaggui exécute git revert --no-edit <sha> et affiche {sha} annulé (revert).

Un commit de merge a plusieurs parents : Git doit donc savoir quel côté conserver. yaggui ouvre une boîte de dialogue :

  • Revert du merge {sha} : « Un merge a plusieurs parents. Choisis celui dont le côté est conservé : le revert annule ce qu’a apporté l’autre côté. »
  • Cherry-pick du merge {sha} : « Un merge a plusieurs parents. Choisis celui par rapport auquel les changements sont calculés. »

Sous Parent conservé, chaque option affiche Parent {n}, son SHA court et son résumé. Parent 1 est sélectionné par défaut et porte la mention « En général la branche sur laquelle le merge a été fait » ; les autres portent la mention « En général la branche qui a été mergée ». La boîte de dialogue affiche un aperçu de git revert -m <n> <sha> ou de git cherry-pick -m <n> <sha>. Cliquez sur Revert ou sur Cherry-pick.

Un reset déplace la branche courante sur un autre commit (git-reset).

  • Faites un clic droit sur un commit, ouvrez Reset de {branch} ici et choisissez Soft (Garde tous les changements indexés), Mixed (Garde les changements, non indexés) ou Hard (Perd les changements locaux). La boîte de dialogue s’ouvre avec ce mode sélectionné.
  • Ou lancez Reset de la branche courante sur le commit sélectionné… depuis la palette. La boîte de dialogue s’ouvre sur Mixed.

La boîte de dialogue Reset de {branch} sur {sha} affiche : « Déplace la branche courante sur ce commit. Choisis ce qu’il advient de tes changements. » Elle fonctionne aussi sur un HEAD détaché ({branch} vaut alors HEAD).

Elle commence par vérifier ce qui changerait (Calcul de ce qui changerait…) et résume l’effet sur la branche :

  • {branch} perd {count} commits (toujours dans le reflog).
  • {branch} avance de {count} commits.
  • {branch} pointe déjà sur ce commit.

Choisissez ensuite un Mode de reset :

Mode Ce qui se passe
Soft Seule la branche bouge. Les changements des commits défaits restent indexés, prêts à être recommités.
Mixed La branche et l’index bougent. Vos changements restent dans le répertoire de travail, non indexés.
Hard La branche, l’index et le répertoire de travail prennent tous le contenu de ce commit. Les changements locaux sont perdus (sauvegardés au préalable).

Pour Hard, la boîte de dialogue liste les fichiers qui perdent leur contenu local, avec ce qu’il advient de chacun :

Mention Signification
changements perdus Un fichier suivi avec des modifications locales (ou en conflit)
sera supprimé Un fichier que vous avez ajouté et qui n’existe pas dans le commit cible
revient Un fichier que vous avez supprimé et qui existe dans le commit cible
écrasé Un fichier non suivi que le commit cible suit

Les fichiers non suivis que la cible n’a pas sont laissés tels quels et ne sont pas listés. Sous la liste : Ces fichiers sont sauvegardés avant le reset. Si rien ne serait perdu, la boîte de dialogue affiche Aucun changement local ne serait perdu.

La boîte de dialogue affiche git reset --<mode> <sha> et tient lieu de confirmation : cliquez sur Reset (soft), Reset (mixed) ou Reset (hard). Le bouton est disponible une fois la vérification terminée. yaggui exécute git reset -q --<mode> <sha> --, après avoir copié les fichiers listés dans une sauvegarde pour un reset hard. Notification : Reset ({mode}) sur {sha}, accompagnée de Fichiers locaux sauvegardés avant. quand une sauvegarde a été faite.

Faites un clic droit sur un commit et choisissez Checkout de ce commit. yaggui exécute git switch --detach <sha> et affiche HEAD est détaché sur {sha}. Plus aucune branche n’est extraite ; les commits que vous faites ne sont sur aucune branche tant que vous n’en créez pas une (Créer une branche ici…). Voir HEAD détaché.

Si des modifications locales gênent, la boîte de dialogue de checkout s’ouvre : voir Branches.

Message Que faire
« {short} n’apporte plus aucune modification (il est sans doute déjà appliqué) : passe-le. » Le commit est déjà dans la branche. Le cherry-pick ou le revert reste en cours ; cliquez sur Passer dans la notification ou le bandeau, ou sur le bouton d’annulation
« {short} est un commit de merge : choisis le parent dont le côté est conservé. » yaggui ouvre la boîte de dialogue du parent
« {short} n’a pas de parent {n}. » Choisissez un parent qui existe
« Il n’y a pas encore de commit sur lequel les appliquer. » Le dépôt ne contient aucun commit : faites un premier commit
« Tes modifications locales seraient écrasées par le cherry-pick. Commite-les ou mets-les de côté (stash) d’abord. » (idem pour le revert) Committez-les ou mettez-les de côté (stash). Voir les changements dans la notification les ouvre
« Une autre opération (merge, rebase, cherry-pick, revert ou bisect) est en cours : continue-la ou annule-la d’abord. » Terminez-la depuis le bandeau

Quand Git s’arrête sur des conflits, le cherry-pick ou le revert reste en cours : résolvez les fichiers, puis choisissez Continuer, Passer ou le bouton d’annulation. Voir Résoudre les conflits. Les autres messages figurent dans Messages d’erreur.

Opération Libellé d’annulation Ce que fait l’annulation
Cherry-pick terminé d’un seul coup cherry-pick de {count} commits Ramène la branche en arrière avec git reset --keep
Revert terminé d’un seul coup revert de {sha} Idem
Reset soft reset soft vers {sha} Ramène la branche en arrière
Reset mixed reset mixed vers {sha} Ramène la branche en arrière et restaure l’index
Reset hard reset hard vers {sha} Ramène la branche en arrière et réécrit les fichiers sauvegardés
Checkout d’un commit checkout de {sha} (HEAD détaché) Rebascule sur la branche ou le commit précédent, en conservant les modifications locales

Un cherry-pick ou un revert arrêté sur des conflits puis terminé avec Continuer ne peut pas être annulé. Voir Annuler et rétablir.