what used pick for cherry git git-interactive-rebase

used - git rebase--continue



Las combinaciones de combinaciones no aparecen en git rebase--interactivo (1)

git log revela lo siguiente:

commit 1abcd[...] Author: [...] Date: [...] [Useful commit] commit 2abcd[...] Author: [...] Date: [...] Merge branch [...] of [etc. etc.] commit 3abcd[...] Author: [...] Date: [...] [Useful commit]

Esa confirmación de fusión no me sirve, ya que no representa un estado significativo de la rama y se generó a partir de una extracción remota, por lo que tengo las confirmaciones reales del historial remoto: no es necesario realizar una confirmación para marcar el hecho de que hice la extracción . Me gustaría aplastar esta fusión de cometer. Mi técnica habitual para hacer un squash es:

git rebase --interactive HEAD~2 (o, sin embargo, tengo que irme)

Y luego lo aplastaría en un comite vecino. Hago esto algunas veces si, por ejemplo, realizo un compromiso, me doy cuenta de que me he perdido un pequeño detalle importante (un solo archivo o no había cambiado una línea en uno de los archivos), y hago otro compromiso que básicamente es solo un oops. De esa manera, cuando presiona mis cambios en el control remoto, todo es agradable y limpio y cuenta una narrativa coherente.

Sin embargo, en este caso, cuando ejecuto el comando git rebase ... , ¡el comando 2abcd no aparece! Parece que salta a la derecha sobre 2abcd y en su lugar muestra 1abcd y 3abcd . ¿Hay algo especial acerca de un compromiso de fusión que evite que aparezca en git rebase --interactive ? ¿Qué otra técnica podría usar para aplastar esa fusión de comillas?

ACTUALIZACIÓN por solicitud de @ Cupcake:

La salida de git log --graph --oneline --decorate ve así:

* 1abcd (useful commit) * 2abcd (merge) | / <-- from remote | * 3abcd (useful commit) | |

¿Servicial?


Normalmente, Rebase no conserva las combinaciones de combinación sin --preserve-merges

Ok, entonces no estoy exactamente seguro de lo que sucedería si tratara de aplastar un compromiso de fusión usando una rebase interactiva con --preserve-merges ... pero así es como eliminaría el compromiso de fusión en su caso y haría su historial lineal:

  1. Cambie de base todo antes de realizar la fusión en la parte superior de la rama remota.

  2. Elija o rebase todo después de la confirmación de fusión sobre las confirmaciones previamente reajustadas.

Si solo tienes 1 commit después del merge commit

Así que en términos de comandos, se vería algo como esto:

# Reset to commit before merge commit git reset --hard <merge>^ # Rebase onto the remote branch git rebase <remote>/<branch> # Cherry-pick the last commit git cherry-pick 1abcd

Si tiene más de 1 confirmación después de la confirmación de fusión

# Leave a temporary branch at your current commit git branch temp # Reset to commit before merge commit git reset --hard <merge>^ # Rebase onto the remote branch git rebase <remote>/<branch> # Cherry-pick the last commits using a commit range. # The start of the range is exclusive (not included) git cherry-pick <merge>..temp # Alternatively to the cherry-pick above, you can instead rebase everything # from the merge commit to the tip of the temp branch onto the other # newly rebased commits. # # You can also use --preserve-merges to preserve merge commits following # the first merge commit that you want to get rid of...but if there were # any conflicts in those merge commits, you''ll need to re-resolve them again. git rebase --preserve-merges --onto <currentBranch> <merge> temp # These next steps are only necessary if you did the rebase above, # instead of using the cherry-pick range. # # Fast-forward your previous branch and delete temp git checkout <previousBranch> git merge temp git branch -d temp

Documentación