Corriger l'historique de double-commit de git

j'ai eu à faire exécuter git filter-branch l'autre jour. J'ai suivi les instructions!--3-->github, mais quelque chose a mal tourné. J' penser un membre de l'équipe n'a pas lancé rebase sur une branche locale, mais a fusionné les changements. Depuis, le journal de propagation est rempli de doubles-propagations, par exemple:

commit b0c03ec925c0b97150594a99861d8f21fd3ab22d
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit f30c21d21b5ea715a99b0844793cb4b5f5df97a1
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit 2346be43d0e02d3987331f0a9eeb2f12cd698ede
Author: XXX
Date:   Wed Mar 19 16:40:26 2014 -0400

    new redirect logic

commit 1383070b31bde1aaa9eda7c2a9bcb598dd72247b
Merge: d1e2eb6 94e07fe
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit 79ce7824688cf2a71efd9ff82e3c7a71d53af229
Merge: 6079061 1ed3967
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit d1e2eb645a4fe2a1b3986082d0409b4075a0dbc9
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

commit 6079061f6ef1f856f94d92bc0fdacf18854b8a89
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

bizarrement, toutes les propagations ne sont pas doublées, comme la "nouvelle logique de redirection" ci-dessus. Est-ce que je peux faire pour résoudre ce problème? C'est relativement bénin, mais maintenant notre commettre l'histoire ressemble à de la merde. Ce post j'ai suggéré de le laisser tel quel, mais je préférerais avoir une histoire nette pour la postérité.

17
demandé sur ysimonson 2014-04-02 20:19:14

2 réponses

La commande pour accomplir ce qui est:

git rebase -i HEAD~7

Cela permettra d'ouvrir votre éditeur de texte avec quelque chose comme ceci:

pick f392171 Removed most clearfixs in templates
pick ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
pick 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop
...

Maintenant vous pouvez dire à git ce qu'il faut faire avec chaque commit. Gardons le commit f392171, celui où nous avons ajouté notre fonctionnalité. Nous écraserons les deux commits suivants dans le premier - nous laissant avec un propre.

changez votre fichier en ceci:

pick f392171 Removed most clearfixs in templates
squash ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
squash 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop

lorsque vous sauvegardez et quittez l'éditeur, Git applique les deux modifications et puis vous replace dans l'éditeur pour fusionner les trois messages de propagation:

# This is a combination of  commits.
# The first commit's message is:
Removed most clearfixs in templates

# This is the 2nd commit message:

Removed most clearfixs in templates

une fois terminé, sauvegardez et quittez votre éditeur. Git va maintenant écraser les commits en un seul. Tout fait!

Alors que vous avez à faire

git push origin your-branch -f

pour forcer votre localement commits change dans la branche distante.

Note: Vous devez faire un squash à chaque propagation dupliquée.

21
répondu VAIRIX 2015-06-08 16:03:41

la réponse de @VAIRIX est parfaite mais il y a des cas complexes où les commits dupliqués ne semblent pas adjacents les uns aux autres, donc l'écrasement n'aidera pas.

donc en prenant l'historique ci-dessous, (supposons que A~ est une copie de a)

 # h
 # g
 # f
 # c~
 # b~
 # a~
 # e
 # d
 # c
 # b
 # a

commande à suivre: (comme dit dans la réponse par @VAIRIX ou ci-dessous si vous voulez rebaser avec le maître) git rebase master -i (mieux vaut suivre git rebase -i HEAD~n pour éviter la relocalisation des maux de tête)

Maintenant! 1) la courge à la répétition s'engage comme ci-dessous:

 pick h
 pick g
 pick f
 pick c~
 s b~
 s a~
 pick e
 pick d
 pick c
 pick b
 pick a

maintenant, cela va écraser vos commits en c

 # h
 # g
 # f
 # c~ (having changes of a~ and b~)
 # e
 # d
 # c
 # b
 # a

dans mon cas, c~ etait anti-commit de c, donc j'ai juste eu à refaire le processus, mais maintenant au lieu de squash avec s, je suis tomber la validation avec d

 pick h
 pick g
 pick f
 d c~ (having changes of a~ and b~)
 pick e
 pick d
 pick c
 pick b
 pick a

maintenant, votre historique supprimera toutes les propagations dupliquées. Maintenant, vous pouvez comparer avec la branche d'origine que vous aviez en utilisant git diff qui avait dupliqué commet contre votre cette branche. Il ne devrait pas y avoir de différence si vous il l'a fait parfaitement.

ce processus peut sembler un peu plus long mais vous êtes assuré que vous n'avez manqué aucun commit.

4
répondu myDoggyWritesCode 2017-09-15 21:21:05