Aller au contenu

Récupération de la branche media-quality

Contexte

Branche concernée :

feat/media-quality

Le travail local media-quality comportait :

  • des modifications de workflows CI ;
  • des modifications du montage Docker ;
  • des modifications du pipeline de qualité des images ;
  • de nouveaux extracteurs, scorers, fournisseurs et éléments de preuve.

Incident initial

Le dépôt présentait deux emplacements du plugin :

plugins/ccx-feeds-industrial
wordpress/wp-content/plugins/ccx-feeds-industrial

La copie située sous WordPress apparaissait comme massivement supprimée dans Git.

Sauvegardes créées

Des sauvegardes indépendantes de Git ont été créées sur le VPS dans :

~/git-safety/media-quality-working.patch
~/git-safety/media-quality-index.patch
~/git-safety/media-quality-untracked.tar.gz

Correction des suppressions WordPress

Les permissions ont été corrigées avec :

sudo chown -R ubuntu:ubuntu \
  wordpress/wp-content/plugins/ccx-feeds-industrial

Les suppressions accidentelles ont été annulées avec :

git restore --source=HEAD --staged --worktree -- \
  wordpress/wp-content/plugins/ccx-feeds-industrial

Mise à jour initiale de main

La branche main était en retard de 20 commits et pouvait être mise à jour en fast-forward.

Commande utilisée :

git pull --ff-only origin main

Résultat :

main synchronisée avec origin/main

Les commandes développeur ont ensuite été validées :

make help
make doctor

Le diagnostic a confirmé :

  • configuration Docker Compose valide ;
  • services Docker actifs ;
  • WordPress accessible sur le port 8080.

Situation de feat/media-quality après rebase

Après le retour sur la branche et l'application du stash :

feat/media-quality est ahead 49 et behind 76 par rapport à origin/feat/media-quality

Cette divergence est apparue après :

git rebase main

La branche distante possédait déjà un historique important. Aucun push forcé ne doit être effectué.

Tentative de récupération du commit de documentation

Un commit de documentation a ensuite été ajouté sur origin/main :

87b9612 docs: document media-quality branch recovery

La commande suivante a été lancée alors que la branche active était encore feat/media-quality et que le travail media-quality était présent dans le répertoire de travail :

git switch main
git pull --ff-only origin main

Le changement de branche a été refusé afin de ne pas écraser les fichiers modifiés. Le git pull suivant s'est donc exécuté depuis feat/media-quality et a tenté d'intégrer origin/main dans cette branche. L'opération a été interrompue, car aucun fast-forward n'était possible.

Cette tentative n'a créé ni merge ni rebase. Elle a seulement mis à jour la référence distante origin/main.

Procédure correcte pour synchroniser main

Le travail local a été rangé, y compris les fichiers non suivis :

git stash push -u -m "WIP media-quality avant synchronisation documentation"

Le répertoire de travail est alors redevenu propre sur feat/media-quality.

La branche main a ensuite été activée et synchronisée :

git switch main
git pull --ff-only origin main

Résultat observé :

## main...origin/main
9996902 (HEAD -> main, origin/main) docs: record branch checkout recovery step
87b9612 docs: document media-quality branch recovery

Le document de récupération est présent localement dans :

docs/operations/media-quality-branch-recovery.md

État sûr atteint

À ce stade :

  • main locale est synchronisée avec origin/main ;
  • le travail media-quality est conservé dans stash@{0} au moment de cette étape ;
  • les sauvegardes indépendantes de Git restent disponibles dans ~/git-safety ;
  • aucun merge, reset destructif ou push forcé n'a été effectué.

Analyse de la divergence locale/distante

La divergence a été inspectée sans restaurer le stash.

Résultat :

origin/feat/media-quality...feat/media-quality
76 commits uniquement distants
49 commits uniquement locaux
merge-base : 594a8ac80fce11a7b35bf12291beeb6866fcf5d4

Les commits locaux et distants montrent deux séries media-quality portant les mêmes intitulés mais des SHA différents. Cela correspond à une réécriture d'historique provoquée par le rebase local.

La branche distante contient en plus une longue série de commits de consolidation documentaire et architecturale. Elle est donc considérée comme la base canonique à préserver.

Une sauvegarde permanente de la branche locale rebased a été créée :

git branch \
  backup/feat-media-quality-local-rebased-20260724 \
  feat/media-quality

Résultat du range-diff

Le git range-diff montre que les 29 commits fonctionnels et media-quality de la branche distante correspondent exactement aux 29 commits rejoués localement :

1: 55367a4 = 21: 26080ad
...
29: de6b96a = 49: f79ccff

Le signe = confirme un contenu de patch équivalent malgré des SHA différents.

Les 20 premiers commits uniquement locaux correspondent aux commits de documentation et d'outillage de main introduits par le rebase. Les 47 derniers commits uniquement distants correspondent à la consolidation documentaire et architecturale réalisée sur la branche distante.

Clarification sur les sept fichiers techniques

Une première lecture avait attribué à tort les statistiques suivantes à la comparaison entre les deux branches :

7 files changed, 367 insertions(+), 297 deletions(-)

La vérification explicite suivante a produit un patch vide :

git diff \
  origin/feat/media-quality \
  feat/media-quality \
  -- <sept fichiers techniques> \
  > ~/git-safety/media-quality-technical-diff.patch

Résultat :

~/git-safety/media-quality-technical-diff.patch : 0 octet

Le git diff --numstat n'a également produit aucune ligne. Les sept fichiers techniques sont donc identiques entre les deux branches.

Les statistiques de sept fichiers provenaient en réalité de :

git stash show --stat stash@{0}

Elles décrivent le travail non commité conservé dans le stash, pas une différence entre la branche locale rebased et la branche distante.

Conclusion technique

La base propre construite pendant plusieurs jours est bien origin/feat/media-quality :

  • elle contient les commits media-quality originaux ;
  • elle contient la consolidation documentaire complète ;
  • son contenu technique commité est équivalent à celui de la branche locale rebased ;
  • le travail supplémentaire à préserver est uniquement celui conservé dans stash@{0} et dans ~/git-safety.

La stratégie sûre consiste à réaligner la branche locale feat/media-quality sur origin/feat/media-quality, tout en conservant la branche de sauvegarde locale, puis à réappliquer le stash sur cette base canonique.

Règles de sécurité

Avant toute réparation supplémentaire :

  • ne pas lancer git pull depuis feat/media-quality ;
  • ne pas lancer git push ;
  • ne pas lancer git push --force ;
  • ne pas supprimer le stash avant validation ;
  • conserver les fichiers présents dans ~/git-safety ;
  • conserver la branche backup/feat-media-quality-local-rebased-20260724 ;
  • toujours vérifier la branche active avec git branch --show-current avant un pull.

Prochaine étape

Réaligner localement feat/media-quality sur origin/feat/media-quality, restaurer le stash avec git stash apply plutôt que git stash pop, puis valider le statut et les tests avant de supprimer toute sauvegarde.