¿Cómo puedo mover confirmaciones del tronco a una sucursal en Git?

Hice un montón de compromisos con el maestro y me di count después del hecho de que deberían haber estado en una sucursal.

He analizado varias cosas sobre cómo volver a basar y combinar y restablecer el maestro. Pero ningún bash de manipulación ha producido una historia que se parece a lo que estoy tratando de hacer.

Mis bashs me llevan a creer que se necesita una combinación de rebase --onto y reset --hard para mover al maestro hacia atrás en el time. Pero mi comprensión de la ramificación de Git deja algo que desear. Parte de hacer esto es aprender cómo puedo usarlo.

Debe tenerse en count que ninguno de los cambios que bash mover se ha eliminado.

Corriente

  * remote/trunk --o--a--b--c--d--e--f <- master | o <- remote branch foo 

Resultado deseado

  * remote/trunk --o <- master | o--a--b--c--d--e--f <- remote branch foo 

No estoy seguro de que el cambio de nombre de las sucursales sea la solución correcta, ya que lo sacaría de:

  * remote/trunk --M--a--b--c--d--e--f <- master | F <- remote branch foo 

a:

 --F <- master | M--a--b--c--d--e--f <- remote branch foo * remote/trunk 

(siempre que renombre remote/foo , lo cual no es aconsejable: primero debe rastrearlo y luego cambiarle el nombre, pero aunque el resultado final difiera de lo que necesita)

que no es el "Resultado deseado" que desea (foo necesita comenzar desde F, no M):

  * remote/trunk --M <- master | F--a--b--c--d--e--f <- remote branch foo 

Solo puedes lograr eso a través de una rebase --onto

 git checkout --track -b origin/foo # create a local branch named after the remote one git branch tmp # mark current foo HEAD to 'F' git branch -f foo master # put foo where it should b: at 'f' git branch -f master tmp^ # reset master to M, parent of tmp git checkout tmp # go to where we must replay the commits git rebase --onto tmp master foo # replay a to f on top of tmp git svn dcommit # push the local foo in order to update remote/foo 

dandote:

  * remote/trunk --M <- master | F--a'--b'--c'--d'--e'--f' <- local foo and remote branch foo 

Una variación en la respuesta de Martin que no necesariamente será aplicable a su situación, pero quiero publicarlo de todos modos 🙂

Supongamos que olvidó crear la twig en commit o , por lo que tiene:

 x--y--z--o--a--b--c--d--e--f master | + [forgot to make a branch here] 

Y luego te diste count de que lo que realmente querías era:

 x--y--z--o master | +--a--b--c--d--e--f topic 

Lo que puedes hacer en este caso es crear una twig en o usando su hash:

 git branch topic # creates new branch 'topic' - will be at commit `f` git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash) git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`) 

Estarás en la twig principal (commit o ), así que como último paso puedes:

 git checkout topic 

El hash, por supuesto, puede ser solo los primeros 5 caracteres.

EDITAR

No debería importar mucho que estés usando git-svn , lo que realmente importa es que no hayas publicado tu twig principal en ningún momento después de o

Una twig en git no es más que un puntero a un commit. Es por eso que la bifurcación es tan barata: solo creas un puntero y tienes una twig.

Aunque no sé cómo rastrear sucursales remotas, es posible que deba configurarlo después de cambiar el nombre / mover sus sucursales.

Casi corrijo lo que hasen j sugiere, pero tuve que hacer algunas pequeñas modificaciones (y uso git-svn):

 # create the branch with your commits git branch performance # fork the master to a new branch at the commit before your local, non pushed commits git branch newmaster 2d0516dfe8252de87 # checkout your branch git checkout performance # rename the newmaster git branch -M newmaster master # now checkout the master git checkout master 

No puede cambiar el nombre de una twig en la que se encuentra, así que revisé la twig de performance donde moví mis commits.