¿Cómo realizar una rebase en un compromiso específico?

Gitlovers, tengo un problema.

Hace varios commits, después de la última fusión de la twig dev en master, olvidé volver a la twig dev. Y continué haciendo commits en la twig incorrecta: master, que debería volver al lugar donde se produjo la fusión. ¿Cómo cambio las twigs para que la situación vuelva a ser como si volviera a la twig dev después de fusionarla en master?

Intenté con rebase:

git checkout master; git rebase dev; y git checkout master; git rebase --onto dev; git checkout master; git rebase --onto dev; haciendo algo extraño para mí …

enter image description here

perdón por mi inglés horrible (las correcciones son bienvenidas) 🙂

Una solución general que también funcionará para escenarios más complejos donde la historia no es lineal. Asegúrese de estar en la twig principal , luego:

 git rebase --preserve-merges --onto master^2 master dev 

Lo que debe haber pasado para que te pongas en la situación es que hiciste esto:

  1. verificado maestro
  2. desarrollador combinado
  3. desprotegido dev
  4. maestro fusionado (!!!)
  5. continuó desarrollando en dev

el error es el paso 4. Esto se denomina fusión inversa y debe evitarse, aunque algunos flujos de trabajo basados ​​en troncales se benefician de ello.

Básicamente estás moviendo un montón de commits desde la twig master a la twig dev. Tuve una situación similar al intentar mover confirmaciones de una twig de tema a otra. El --onto rebase command rebase hace esto. No quiero repetir todo el blog aquí, pero aquí es donde detallé lo que hice: http://nibrahim.net.in/2012/01/09/moving_topic_branches_in_git.html

Tu podrías intentar:

 $ git checkout dev $ git merge master $ get checkout master $ get reset --hard [the revision you want to return] 

No es necesario volver a establecer la base o fusionar. Las twigs no son más que tags en commits. Puede mover las tags usando git reset . A pesar de su nombre, reset es realmente el command move labels around .

  1. git tag master dev.target Almacena una label donde debe ir dev antes de mover el master.
  2. git checkout master
  3. git reset --hard dev Mueve el master a donde dev está.
  4. git checkout dev
  5. git reset --hard dev.target Mueve el dev al lugar donde estaba el maestro.
  6. git tag -d dev.target Quita el marcador de position.

Puede hacerlo sin la label con la identificación de confirmación, pero la label es un gran seguro en caso de que arruine las cosas. Esta es esencialmente la receta "deshacer una confirmación, convirtiéndola en una twig de tema" de la página man de git-reset , excepto que su twig temática ya existe.

Alternativamente, como solo quieres cambiar las twigs, puedes cambiarles el nombre.

  1. git branch -m master dev.mv
  2. git branch -m dev master
  3. git branch -m dev.mv dev

El inconveniente es que si tienen un seguimiento en sentido ascendente, será incorrecto. Tendría que entrar en .git/config para corregirlo.