Mi historial de Git se ve así:
Me gustaría aplastar las confirmaciones moradas en una sola. No quiero volver a verlos en mi registro de confirmación.
Intenté hacer una git rebase -i 1
, pero a pesar de que 1
está en la rama azul (ver imagen), todavía veo cada confirmación en mi rama púrpura.
¿Cómo puedo eliminar por completo la rama púrpura (del registro de confirmación)?
git
git-merge
git-rebase
Benjamín Toueg
fuente
fuente
Respuestas:
Hacer
git rebase -i <sha before the branches diverged>
esto le permitirá eliminar la confirmación de fusión y el registro será una sola línea como desee. También puede eliminar las confirmaciones que ya no desee. La razón por la que su rebase no funcionaba era que no retrocedía lo suficiente.ADVERTENCIA: Estás reescribiendo el historial haciendo esto. Hacer esto con cambios que se han enviado a un repositorio remoto provocará problemas. Recomiendo hacer esto solo con confirmaciones locales.
fuente
git rebase
y se eliminarán.Comenzando con el repositorio en el estado original
Para eliminar la confirmación de fusión y aplastar la rama en una única confirmación en la línea principal
Utilice estos comandos (reemplazando 5 y 1 con los SHA de las confirmaciones correspondientes):
Para retener un compromiso de fusión pero aplastar el compromiso de la rama en uno:
Utilice estos comandos (reemplazando 5, 1 y C con los SHA de las confirmaciones correspondientes):
Para eliminar la confirmación de fusión y reemplazarla con confirmaciones individuales de la rama
Solo hazlo (reemplazando 5 con el SHA de la confirmación correspondiente):
Y finalmente, quitar la rama por completo
Utilice este comando (reemplazando C y D con los SHA de las confirmaciones correspondientes):
fuente
git rebase 5 master
caso, ¿por qué no es el orden "ABC 1 2 3 4 5 D ..."?master
no tienen en común con5
y las coloca encima de5
. El compromisoC
no es parte del linaje de5
, es el primero en ser movido encima de5
.git rebase C 5; git rebase 5 master
Hay dos formas de abordar esto según lo que desee:
Solución 1 : elimine las confirmaciones moradas, preservando el historial (en caso de que desee retroceder)
-m 1
especifica qué línea principal elegirLas confirmaciones púrpuras seguirán estando allí en el historial, pero como ha revertido, no verá el código de esas confirmaciones.
Solución 2 : elimine completamente las confirmaciones violetas (cambio disruptivo si se comparte el repositorio)
y elimine (elimine las líneas) correspondientes a las confirmaciones moradas.
Esto sería menos complicado si las confirmaciones no se hicieran después de la fusión. Las confirmaciones adicionales aumentan la posibilidad de conflictos durante
revert/rebase
.fuente
1 - 1 = 0
. Pero si luego reabastece las confirmaciones moradas, deja atrás el parche revertido, a menos que también lo reemplace. Si no lo hace, es como aplicar-1
a su historial, no0
, así que dejará atrás los cambios que no desea.Para eliminar simplemente una confirmación de fusión
Si todo lo que quiere hacer es eliminar un compromiso de fusión (2) para que sea como si nunca hubiera sucedido, el comando es simplemente el siguiente
git rebase --onto <sha of 1> <sha of 2> <blue branch>
Y ahora la rama violeta no está en absoluto en el registro de confirmación de azul y tienes dos ramas separadas nuevamente. A continuación, puede aplastar el morado de forma independiente y hacer cualquier otra manipulación que desee sin el compromiso de fusión en el camino.
fuente