Git: combina el file en etapas con el que está en el tree de trabajo

Tengo un file llamado foo . Hago una modificación M1 para foo y lo foo . Luego lo reverso en el tree de trabajo HEAD desde HEAD , y le hago otra modificación M2 . Ahora quiero fusionar estas dos modificaciones antes de la confirmación. ¿Cómo puede hacerse esto? ¡Gracias!

(Sé que las sucursales son para este tipo de trabajo. Pero me gustaría saber si hay una forma de fusionar un file en etapas con la versión modificada en el tree de trabajo).

La solución más obvia es crear dos commits y fusionarlos. Esto es bastante seguro, ya que una vez que obtiene sus cambios en dos commits diferentes, es bastante difícil perderlos, y si la fusión no va como desea, puede descartar la fusión y volver a intentarlo.

Para el primer commit, ya tiene los cambios en etapas, por lo que solo el git commit debería ser suficiente.

Por el segundo, tiene un estado en su copy de trabajo que representa cambios en el HEAD original. Pero ahora que has hecho ese compromiso, hay uno interviniente; HEAD es lo que estaba en el índice, por lo que parece que su copy de trabajo revierte esos cambios. Para evitar esto, necesitamos restablecer nuestros puntos HEAD , sin cambiar lo que está en la copy de trabajo.

Antes de hacerlo, guardemos un puntero a nuestro HEAD actual: git branch was-in-index . Ahora podemos restablecer el HEAD anterior (el padre de HEAD ) con git reset HEAD^ , y agregar y confirmar nuestros cambios git add some stuff; git commit git add some stuff; git commit (o git commit -a , si quieres todos tus cambios).

Ahora tenemos dos twigs; nuestro actual, que contiene los cambios de la copy de trabajo, y was-in-index , que contiene los cambios que estaban en el índice. Ahora puedes combinarlos como quieras; git merge was-in-index , git rebase was-in-index , o lo que sea. Puede eliminar la twig was-in-index cuando haya terminado.

La mejor manera es esconder:

 # modify file git stash -u # modify file in a different way git add -A && git commit -m "M2" git stash pop # resolve conflicts git add -A && git commit --amend -m "M1 and M2 merged" 

no hay twigs para tratar.

La forma más fácil es un process de 4 pasos.

  1. git commit los cambios por etapas a foo.
  2. modifica foo, agregando M2 encima de M1
  3. git add foo , poniendo M2 en el área de preparación.
  4. git commit --amend , fusionando M1 con M2.

Esto no es exactamente lo que preguntaste, pero creo que es la forma más eficiente de get el resultado que estás solicitando.