publicar - how to tag a commit in git
Arreglando el historial de git double-commit (2)
Tuve que hacer correr git filter-branch
el otro día. Seguí las instrucciones en github , pero algo salió mal. Creo que alguien en el equipo no ejecutó rebase en una sucursal local, y en cambio fusionó los cambios. Desde entonces, el registro de confirmación está lleno de confirmaciones dobles, por ejemplo:
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.
Por extraño que parezca, no todas las confirmaciones se duplican, como la "nueva lógica de redireccionamiento" anterior. ¿Hay algo que pueda hacer para solucionar esto? Es relativamente benigno, pero ahora nuestro historial de cometer parece una mierda. Esta publicación SO sugirió simplemente dejarlo como está, pero prefiero tener un historial de compromiso limpio por el bien de la posteridad.
El comando para lograr eso es:
git rebase -i HEAD~7
Esto abrirá tu editor con algo como esto:
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
...
Ahora puedes decirle a git qué hacer con cada compromiso. Mantengamos el commit f392171, en el que agregamos nuestra función. Aplastaremos los siguientes dos compromisos en el primero, dejándonos con uno limpio.
Cambie su archivo a esto:
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
Cuando guarda y sale del editor, Git aplica los dos cambios y luego vuelve a colocarlo en el editor para fusionar los tres mensajes de confirmación:
# 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
Cuando haya terminado, guarde y salga de su editor. Git ahora aplastará los compromisos en uno. ¡Todo listo!
Entonces tienes que hacer
git push origin your-branch -f
para forzar sus cambios de confirmación local en la rama remota.
Nota: Tienes que hacer un squash a cada confirmación duplicada.
La respuesta de @VAIRIX es perfecta, pero hay casos complejos en los que las confirmaciones duplicadas no aparecen una junto a la otra, por lo que el aplastamiento no ayudará.
Entonces, tomando debajo de la historia, (asuma que ~ es duplicado de a)
# h
# g
# f
# c~
# b~
# a~
# e
# d
# c
# b
# a
Comando a seguir: (como se indica en la respuesta en @VAIRIX o más abajo si desea volver a hacer una base con el maestro) git rebase master -i
(Es mejor seguir git rebase -i HEAD~n
para evitar un nuevo dolor de cabeza)
¡Ahora! 1) aplastar los compromisos repetidos de la siguiente manera:
pick h
pick g
pick f
pick c~
s b~
s a~
pick e
pick d
pick c
pick b
pick a
Ahora, esto aplastará tus compromisos en c
# h
# g
# f
# c~ (having changes of a~ and b~)
# e
# d
# c
# b
# a
En mi caso, c ~ fue anti-commit de c, así que solo tuve que repetir el proceso, pero ahora, en lugar de aplastar con s
, estoy eliminando el commit con 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
Ahora, tu historial eliminará todas las confirmaciones duplicadas. Ahora, puede comparar con la rama de origen que tenía usando git diff
que tenía confirmaciones duplicadas en su rama. No debería haber ninguna diferencia si lo hiciste perfectamente.
Este proceso puede parecer un poco más largo, pero tiene la certeza de que no perdió ningún compromiso.