Aller au contenu
Cheat Sheet
Git

[GIT] Réécrire l’histoire

  • 4 avril 202015 septembre 2020

Dans le passé, j’ai fait un commit avec le mauvais utilisateur (Bruce Wayne). Je souhaite réécrire l’histoire et changer l’utilisateur (Batman).

Tout d’abord, il faut trouver quels sont les commit que l’on souhaite modifier. Comme git log n’est pas très lisible, on va se faire un petit alias qui affiche les logs sur 1 ligne.
Pour cela, on va éditer le fichier .gitconfig et ajouter :

[alias]
	lol = log --pretty=format:"%h\\ %ad%d\\ %s\\ [%cn\\ %ce]" --decorate --date=short
	lolc = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn\\ %ce]" --decorate --date=short
	tree = log --graph --decorate --pretty=oneline --abbrev-commit

Ainsi git lol donnera les infos sur 1 seule ligne. Git lolc affichera la même chose mais avec des couleurs.

Avec git lol, je repère les commits qui ont été faits par l’utilisateur “Bruce Wayne”.

Supposons que l’historique soit A-B-C-D-E-F, F étant HEAD.
Je dois modifier les commits C et D.

  • Je fais un rebase interactif sur le commit précédent celui que je veux modifier :
git rebase -i B

Si j’avais besoin de modifier le tout premier, j’aurais utilisé git rebase -i --root

  • Un éditeur va s’ouvrir avec la liste de tous les commits. Il faut modifier pick en edit sur tous les commits qu’on souhaite changer.
  • On sauvegarde et on quitte (Echap :wq si on est sous vim).
  • Le rebase va commencer et s’arrêter à C.
  • On fait amende honorable de ce commit avec :
git commit --amend --author="Batman <batman@gotham.city>"
  • Je continue le rebase avec :
git rebase --continue
  • Je procède de la même manière pour changer tous mes commits.
  • Dans le cas où il y a un problème de merge (avec un fichier binaire par exemple), on peut choisir le fichier à garder :
git checkout --theirs -- [nom du fichier]
git add [nom du fichier]
  • Une fois tout l’historique remonté, je termine avec :
git push --force-with-lease

Si ça ne marche pas, on peut forcer comme un bourrin avec git push -f

  • Si après ça il reste des mentions de commits non souhaités, on peut forcer le garbage collector à passer avec :
git gc --prune=now --aggressive

Pour aller plus loin

Comment supprimer des merges : https://stackoverflow.com/questions/17577409/git-remove-merge-commit-from-history/17577876

[Python] Transformer un tableau de dict en dict
Activer / désactiver Hyper-V en ligne de commande
commit git rebase

Catégories

  • Android
  • Calibre
  • Excel
  • Git
  • Google Sheet
  • Knime
  • Linux
  • Logiciels
  • Matériel
  • Non classé
  • Notepad++
  • Power BI
  • Programmation
  • Python
  • Qlik
  • Synology
  • Visual Studio Code
  • Windows
  • Word
  • WordPress

Étiquettes

android apache apn artefact bloc connexion convert encode excel ffmpeg firefox flask hash kobo linux markdown max md5 min mod_wsgi mp3 notepad++ office partage php pip python qlik qliksense qlikview reduce selenium sha1 styles sum synology temps venv virtualenv visual basic wav windows word wordpress xhr

Tags

android apache apn artefact bloc connexion convert encode excel ffmpeg firefox flask hash kobo linux markdown max md5 min mod_wsgi mp3 notepad++ office partage php pip python qlik qliksense qlikview reduce selenium sha1 styles sum synology temps venv virtualenv visual basic wav windows word wordpress xhr
Thème par Colorlib Propulsé par WordPress