Este es un caso especial de rebase, al igual que la rama está vacía:
git checkout A
git rebase B
rebase
es más general; que maneja este caso también:
Antes:
A1 -> A2 -> [A]
/
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B]
Después:
A1' -> A2' -> [A]
/
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B]
A1' y A2' se combinan para dar cuenta de la delta entre 4 y 8 en la rama principal.
Git rebase maneja este caso trivial sin problemas. Creé un repositorio con dos confirmaciones en master
y una rama br
apuntando a la primera confirmación.
$ git checkout br
Switched to branch 'br'
$ git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded br to master.
Poof, done. El registro ahora muestra la rama que apunta a la segunda confirmación.
También podemos lograrlo "después": [gracias a M. Flaschen para señalar esto faltaba]:
A1'' -> A2'' -> [A]
/
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B]
En lugar de cambio de base a la rama B, que sería el nombre de la específica commit 6, p.ej
git checkout A
git rebase 6 # rather than rebase B
Cuando no hay A1 y A2 se compromete, esto se reduce a la pregunta original: moviendo el [A] puntero de 4 a 6.
Esto funciona en esta situación porque A realmente no contiene nada; simplemente apunta al punto de ramificación y movimos el puntero a otro lugar sin perder nada. Supongamos que A tuvo algunos compromisos? Luego tienes que hacer un 'git rebase' para llevar a cabo las confirmaciones. Eso es más general y también debería manejar este caso trivial de "rama vacía". – Kaz
@Kaz, git tiene ramas ligeras, por lo que nunca "contienen" nada. Son solo una nota adhesiva en movimiento adjunta a un compromiso. Mi respuesta es para este escenario, una historia de rama lineal.Si no fuera lineal, miraría lo que el OP realmente quería y encontraría una solución. –
Podría decir eso también sobre CVS. Una rama no contiene nada. Es solo una etiqueta de rama ("nota adhesiva") que denota un número de rama como 1.2.0.2. ¿Tiene CVS una ramificación liviana? :) – Kaz