Git move single commit de feature_branch para master

¿Cuál es la forma más simple de lograr esto?

de:

--A--B \ 1--2--3 

a:

 --A--B--2 \ 1--3 

No puedo encontrar una forma simple de lograr esto (less de 5 pasos).

Olvidaste las tags; vamos a ponerlos de nuevo. Aquí está "antes":

 --A--B <-- master \ 1--2--3 <-- feature 

y aquí está "después". Los marcaré con una marca (o "principal" o como quiera llamar) ya que serán copys de las confirmaciones originales, con identificaciones de compromiso nuevas y diferentes.

 --A--B--2' <-- master \ 1'-3' <-- feature 

Esto no puede hacerse en un solo paso: toma al less dos.

Primero tenemos que volver a orderar la secuencia 1--2--3 para que 2 sea ​​primero. La forma más fácil es probablemente una rebase interactiva (mientras está en la feature twig, usando el command git rebase -i master ): simplemente cambie la order de pick y rebase seleccionará 2, luego 1, luego 3 y moverá la label de feature :

 --A--B <-- master \ 2'-1'-3' <-- feature 

Ahora solo necesitamos mover la label master para apuntar a cometer 2' . Muchos commands harán esto, pero el más simple es la git merge instrucciones de hacer una fusión de avance rápido (para evitar errores):

 git checkout master; git merge --ff-only feature~2 

Para evitar echar un vistazo a master , podemos usar git branch -f como en la respuesta de VonC (que apareció mientras editaba este), por ejemplo:

 git branch -f master feature~2 

(en ambos casos necesitamos nombrar commit 2' ; con git branch debemos nombrar la twig para mover, mientras que con git merge tenemos que estar en la twig para mover).


Para completar, aquí hay un método diferente pero equivalente (usando cuatro commands git). Primero vamos a get un master twig:

 git checkout master 

Ahora podemos seleccionar cometer cometer 2 , crear una copy, 2' :

 git cherry-pick feature^ # or feature~1 

que produce este gráfico:

 --A--B--2' <-- master \ 1--2--3 <-- feature 

Ahora podemos reajustar la feature interactivamente en el nuevo master , descartando commit 2 :

 git checkout feature git rebase -i master 

Cambie las líneas de pick para copyr 1 y 3 y omita 2, ya que el compromiso 2' ya está allí en el master .

Principalmente:

 --A--B (master) \ 1--2--3 (B) git checkout B git rebase -i master # reorder commits --A--B (master) \ 2--1--3 (B) git branch -f master 2 

puedes get el hash de confirmación de

  git reflog 

luego ve a la twig principal.

 git checkout master 

a continuación, select el compromiso de cereza

 git cherry-pick <commit-hash> 

La confirmación se aplicará a la twig principal si no hay conflictos.