Usage des reflogs

Question

Reprenez votre dépôt et supprimez tous vos commits à l'exception du premier. Puis utilisez les logs de référence pour retrouver votre code.

Indice

Pour supprimer tous les commits :

1
git reset --hard sha_du_premier_commit

Solution

Comme d'habitude, vous n'aurez pas les mêmes SHA

1
git reflog

On voit ainsi la liste des opérations effectuées. On peut remarquer que le rebase -i a effectué beaucoup d'opérations atomiques (eti l est possible de revenir dessus mais on ne le fera pas dans le cadre de ce cours)

1
bbb7664 (HEAD -> master) HEAD@{0}: reset: moving to bbb7664
2
98b3866 HEAD@{1}: rebase -i (finish): returning to refs/heads/master
3
98b3866 HEAD@{2}: commit (amend): Création du fichier c.txt pour fonctionnalité c à implémenter
4
7076764 HEAD@{3}: rebase -i (edit): ajout c.txt
5
ea4cd9a HEAD@{4}: rebase -i (fixup): Ajout fonctionnalité b dans nouveau fichier b.txt
6
7d6b274 HEAD@{5}: rebase -i (squash): # Ceci est la combinaison de 2 commits.
7
acf3a13 HEAD@{6}: rebase -i (pick): ajout b.txt
8
3100695 HEAD@{7}: rebase -i (fixup): Ajout fonctionnalité a dans nouveau fichier a.txt
9
bdfe4cf HEAD@{8}: rebase -i (squash): # Ceci est la combinaison de 2 commits.
10
1ca7d13 HEAD@{9}: rebase -i : avance rapide
11
bbb7664 (HEAD -> master) HEAD@{10}: rebase -i : avance rapide
12
fa6f034 HEAD@{11}: rebase -i (start): checkout fa6f03418f4e94588824829be0afa26d1fdd29a0
13
ab22896 HEAD@{12}: rebase -i (abort): updating HEAD
14
b25c4a5 HEAD@{13}: rebase -i (start): checkout b25c4a54c1f9849e4ef87d9c70071d2085ab9dc2
15
ab22896 HEAD@{14}: commit: débug fonctionnalité b dans b.txt
16
6ccc4d7 HEAD@{15}: commit: débug fonctionnalité a dans a.txt
17
771f2c8 HEAD@{16}: commit: Ajout fonctionnalité b dans b.txt
18
1c2ab5c HEAD@{17}: commit: Ajout fonctionnalité a dans a.txt
19
e62f296 HEAD@{18}: commit: ajout d.txt
20
845ae93 HEAD@{19}: commit: ajout c.txt
21
e7d2ee2 HEAD@{20}: commit: ajout b.txt
22
1ca7d13 HEAD@{21}: commit: ajout a.txt
23
bbb7664 (HEAD -> master) HEAD@{22}: commit (initial): Commit initial

Il ne nous reste plus qu'à annuler la dernière modifications en choisissant le SHA de la version qui la précède et constater le résultat

1
git reset --hard 98b3866
2
git log --oneline
3
git reflog

On constate toutefois que reflog n'a pas réellement supprimé de l'historique mais a simplement ajouté une ligne annulant toutes les modifications effectuées depuis le commit sélectionné.