Je travaillais avec un ami sur un projet, et il a édité un tas de fichiers qui n'auraient pas dû être édités. D'une manière ou d'une autre, j'ai fusionné son travail avec le mien, soit quand je l'ai retiré, soit quand j'ai essayé de choisir les fichiers spécifiques que je voulais. J'ai cherché et joué pendant longtemps, en essayant de comprendre comment supprimer les commits qui contiennent les modifications de ces fichiers, il semble que ce soit un mélange entre revert et rebase, et il n'y a pas d'exemples simples, et les docs supposent que je sais plus que je ne sais.
Voici donc une version simplifiée de la question :
Compte tenu du scénario suivant, comment puis-je supprimer le commit 2 ?
$ mkdir git_revert_test && cd git_revert_test
$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/
$ echo "line 1" > myfile
$ git add -A
$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 myfile
$ echo "line 2" >> myfile
$ git commit -am "commit 2"
[master 342f9bb] commit 2
1 files changed, 1 insertions(+), 0 deletions(-)
$ echo "line 3" >> myfile
$ git commit -am "commit 3"
[master 1bcb872] commit 3
1 files changed, 1 insertions(+), 0 deletions(-)
Le résultat attendu est
$ cat myfile
line 1
line 3
Voici un exemple de la façon dont j'ai essayé de revenir en arrière.
$ git revert 342f9bb
Automatic revert failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result.
15 votes
Si quelqu'un trouve ceci en cherchant le même problème, voici ce que j'ai fini par faire : Copier et coller. Sérieusement. J'ai passé plus de 6 heures à essayer de faire fonctionner les solutions proposées, en vain. A la fin, je n'avais plus le temps, j'ai sorti l'original et j'ai juste copié/collé une vingtaine de fichiers. Cela m'a pris moins de 5 minutes, et tout s'est bien passé depuis (même lorsque ces fichiers sont fusionnés avec des changements dans d'autres branches qui ont eu lieu avant ce fiasco). Je vous suggère d'adopter cette approche également. Non seulement c'est la plus simple, mais je pense aussi que c'est la seule chose qui fonctionne.
0 votes
J'ai été confronté à un problème similaire, mais peut-être plus complexe : j'avais une branche avec des centaines de commits que je voulais écraser. Malheureusement, les commits d'une autre branche ont été fusionnés dans la branche à un point intermédiaire, donc un "unmerge" était nécessaire avant que je puisse écraser. J'ai suivi un chemin similaire à celui suggéré par tk ci-dessous (cherry picking + utilisation de la notation de l'intervalle), mais cela a produit des conflits dans certains autres fichiers. En fin de compte, le copier-coller et quelques modifications manuelles ont été le moyen le plus facile et le plus prévisible de progresser. Cela vaut vraiment la peine d'être considéré si vous passez trop de temps sur ce sujet.
1 votes
Un problème que j'ai toujours, c'est que je ne suis jamais la personne qui commet le problème. Je suis le Release Manager et nos développeurs viennent me voir pour corriger les choses. Je n'ai jamais les commits à corriger dans mon local, donc beaucoup d'hypothèses "ex : si VOUS avez inclus le mauvais commit" ne s'appliquent pas vraiment. Mon clone local n'a jamais l'historique avec lequel travailler.