Actualmente estoy trabajando en una rama y quiero que algunas confirmaciones se fusionen con otras ramas:
a-b-c-d-e-f-g (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
\
x-x-x-x-x (branchB)
(Las letras denotan confirmaciones y la "x" son confirmaciones irrelevantes).
Sin embargo, noté que sería una buena idea agrupar algunas confirmaciones. Quiero "concatenar" las confirmaciones a, d, e y g en un parche y enviarlas a master. Las confirmaciones byf deberían ir como una confirmación para branchB. ¿Existe una buena forma 'git'-ish de lograrlo?
Respuestas:
El comando que está buscando es
git rebase
, específicamente la-i/--interactive
opción.Voy a suponer que desea dejar la confirmación c en la rama A, y que realmente quiere decir que desea mover las otras confirmaciones a las otras ramas, en lugar de fusionar, ya que las fusiones son sencillas. Comencemos por manipular la rama A.
Los
^
medios de la confirmación anterior, por lo que este comando dice que rebase la rama A usando el commit antes "a" como la base. Git te presentará una lista de las confirmaciones en este rango. Reordenarlos y decirle a git que aplaste los apropiados:Ahora, el historial debería verse así:
Ahora, tomemos la confirmación b + f recién aplastada para branchB.
Y lo mismo para a + d + e + g para master:
Finalmente, actualice branchA para que apunte ac:
Ahora deberíamos tener:
Tenga en cuenta que si tiene varias confirmaciones que desea mover entre ramas, puede usar rebase nuevamente (no interactivamente):
Finalmente, un descargo de responsabilidad: es muy posible reordenar las confirmaciones de tal manera que algunas ya no se apliquen limpiamente. Esto podría deberse a que eligió un orden incorrecto (colocando un parche antes de la confirmación introduciendo la característica que parcheó); en ese caso, querrá abortar el rebase (
git rebase --abort
). De lo contrario, tendrá que solucionar los conflictos de manera inteligente (tal como lo hace con los conflictos de fusión), agregar las correcciones y luego ejecutargit rebase --continue
para continuar . Estas instrucciones también las proporciona el mensaje de error que se imprime cuando se produce el conflicto.fuente
git branch -f branchA branchA^^
error? Es decir, ¿no debería branchA apuntar ac en este punto, de modo que la primera línea del diagrama seac (branchA)
y noc - [a+d+e+g] - [b+f] (branchA)
?git branch -f branchA branchA^^
¿por qué no puedes simplemente hacer unagit reset --hard <sha1 of c>
en la rama A?¿Dónde
3
está la cantidad de confirmaciones que necesitan reordenarse ( fuente )?Esto abrirá vi , enumerando las confirmaciones de la más antigua (arriba) a la más nueva (abajo).
Ahora reordene las líneas, guarde y salga del editor.
ddp
moverá la línea actual hacia abajoddkP
moverá la línea actual hacia arriba ( fuente )fuente
git rebase --interactive
es el comando que desea.Ejemplo:
El estado actual es este:
Quiero reordenar las confirmaciones
9a24b81
(Tercera confirmación) y7bdfb68
(Segunda confirmación). Para hacer esto, primero encuentro el compromiso antes del primer compromiso que queremos cambiar . Este es el compromiso186d1e0
(primer compromiso).El comando a ejecutar es
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
, en este caso:Esto abre un archivo en el editor predeterminado con el siguiente contenido:
Tenga en cuenta que el orden de las confirmaciones en el archivo es opuesto al que se usa para git log. En git log, la confirmación más reciente está en la parte superior. En este archivo, la confirmación más reciente está al final.
Como explica el comentario en la parte inferior del archivo, hay varias cosas que puedo hacer, como aplastar, eliminar y reordenar las confirmaciones. Para reordenar las confirmaciones, edito el archivo para que se vea así (los comentarios inferiores no se muestran):
El
pick
comando al comienzo de cada línea significa "usar (es decir, incluir) esta confirmación" y cuando guardo el archivo temporal con los comandos de rebase y salgo del editor, git ejecutará los comandos y actualizará el repositorio y el directorio de trabajo:Tenga en cuenta el historial de confirmaciones reescrito.
Enlaces:
fuente
git rebase --interactive
para lograr el objetivo de OP?Si desea reordenar solo las dos últimas confirmaciones , puede usar este
git reorder
alias: https://stackoverflow.com/a/33388211/338581fuente
git rebase es lo que quieres. Consulte la opción --interactive.
fuente