Refaire l'histoire avec git

Utilisation avancée de git et sa commande rebase pour modifier son historique

Le problème exposé dans ce sujet a été résolu.

Concernant le ^ ; je sais que je suis chiant, mais ça devrait faire partie des pré-requis (ce n'est nullement en relation avec la manipulation de l'historique… L'historique, peut-être, mais pas sa manipulation)

Sinon, peut-être aussi préciser que ce n'est qu'une intro à la manipulation, car comme je l'ai indiqué, y'a pas mal de petits trucs à savoir si on veut pousser le bouchon un peu plus loin :)

D'ailleurs, toujours en guise d'intro, la manipulation ne se fait pas qu'a l'aide de git rebase ; on peut aussi citer git reset, qui permet de revenir à un point de l'historique (que ce soit un commit, ou une action git, action liée au (fameux !) git reflog)

+0 -0

Bon, en fait, le reflog m'a sauvé la vie aujourd'hui, du coup je commence à changer d'avis à son sujet : après plusieurs commits assez intenses, j'ai eu la bêtise de faire un git rebase --abort (parce que j'avais oublié de conclure un précédent rebase avec des conflits et qu'il n'avait plus aucun sens à ce moment là).

Résultat : une grosse journée de boulot de perdue. Heureusement, le reflog est arrivé à la rescousse et un git reset --hard [le dernier commit avant ma connerie] a gentiment tout restauré. :)

Bref, ça peut être utile d'en parler dans un tuto.

+1 -0

Encore une fois, ça permet de manipuler l'historique de ses actions… Du coup, c'est juste carrément adapté. Sinon ton tuto est bon pour être une introduction à la manipulation de l'historique. C'est quand même une sacré nuance (la manipulation ne se limite pas qu'a git rebase hein)

+0 -0

Encore une fois, ça permet de manipuler l'historique de ses actions… Du coup, c'est juste carrément adapté. Sinon ton tuto est bon pour être une introduction à la manipulation de l'historique. C'est quand même une sacré nuance (la manipulation ne se limite pas qu'a git rebase hein)

Talus

Ah mais je ne m'en cache pas et dis pas le contraire hein ^^ je le precise bien dans l'intro (avec les emphases qu'il se doit) :

Ce tutoriel introductif va vous proposer de découvrir et mettre en pratique ces différents aspects au travers d'un exemple simple et complet. À la fin de ce tutoriel, vous saurez : […]

+0 -0

J'ai lu le tuto sauf la dernière partie. J'arrive à faire modifier (notamment fusionner) des commits déjà pushés sur des dépôts git hbébergés sur github. Par contre j'utilise git push -f. Est-ce la bonne manière de procéder ? (sans -f, il refuse et demande à ce que je fasse git pull qui fait un merge…)

Par contre sur un serveur git bare autohébergé, cela ne fonctionne pas, est-ce normal ? Est-ce alors impossible de pusher des corrections sur un tel dépôt ? Quel est le risque pour d'autres contributeurs ? Un git pull* corrige-t-il l'historique du dépôt git chez eux ?

Je ne crois pas avoir lu ces réponses dans le tuto, voilà pourquoi je me permet de les poser ici.

EDIT: Merci le caribou pour ton tuto :)

+0 -0

Oui, réecrire l'histoire d'un arbre git demande un push force… ce qui est logique, vu que tu réecris les commits.

Sur un serveur perso, ça devrait pas poser de problèmes non plus. Par contre, comme c'est une réecriture, si tu as des personnes qui ont déjà synchronisé la branche réecrite, ils sont bons pour faire une opération douloureuse, à savoir supprimer leur branche et resynchroniser à la main. C'est d'ailleurs pour ça que les réecriture sont assez déconseillées dès que ça dépasse le local… Mais si correctement géré (warning, etc…), et que c'est la seule solution, bah faut faire avec.

Un petit schéma que quiconque devrait avoir en tête avant de vouloir faire un rebase :

+5 -0

Sympa le schéma. Je viens de réessayer de pusher sur un dépôt initialisé avec git init --bare --shared et je n'arrive pas à pusher après un rebase même en forçant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ git push -f
Décompte des objets: 5, fait.
Delta compression using up to 4 threads.
Compression des objets: 100% (4/4), fait.
Écriture des objets: 100% (5/5), 514 bytes | 0 bytes/s, fait.
Total 5 (delta 2), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To ssh://example.com/srv/git/test.git
 ! [remote rejected] master -> master (non-fast-forward)
error: impossible de pousser des références vers 'ssh://example.com/srv/git/test.git'
Ce sujet est verrouillé.