Aplicar los cambios de la rama b a a, sin fusionar ni agregar confirmaciones

86

Mi escenario es que tengo una rama en la que hice grandes mejoras en el proceso de compilación (rama A) y en otra estoy trabajando en una característica no relacionada (rama B). Entonces, ahora, cuando estoy pirateando en la rama B, quiero incorporar lo que escribí en la rama A porque quiero compilaciones más rápidas y fáciles. Sin embargo, no quiero "contaminar" mi rama B, simplemente agregue cambios de branchA a cambios sin etapas.

Lo que he intentado (cuando estoy parado en la rama B):

git merge --no-commit branchA

No funciona porque te coloca dentro de una fusión. Si no fuera así, sería perfecto.

git checkout branchA -- .

No funciona porque aplica cambios entre branchA..branchB y no los cambios master..branchA.

¿Algo más?

Editar: Sí, los cambios en la rama A están comprometidos. En este ejemplo, solo hay una rama con mejoras de compilación, pero puede haber hasta N ramas con mejoras de compilación que quiero aplicar mientras trabajo en una rama de funciones.

Björn Lindqvist
fuente
¿Ya se han confirmado los cambios en A?
Theolodis

Respuestas:

152

Solo tenía que hacer algo similar y pude solucionarlo agregando --squashal comando de combinación

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
culpable
fuente
3
Esto también debe tener una nota explicativa sobre lo que está haciendo. Establece la diferencia de cambios de branchA en su rama actual
KareemElashmawy
digamos que acabo de fusionar el código de branchA en master, pero olvidé algo y quiero agregar algunos códigos / cambios más en esta confirmación de fusión sin aparecer como otra confirmación de fusión en el historial de git. ¿Funcionará este método?
Sushmit Sagar
@Sushmit Creo que puedes hacer una git commit —amendy agregará los nuevos cambios a la última confirmación, pero no estoy del todo seguro de si funciona en las confirmaciones de fusión
guilffer
1
No creo que aquí se necesite no comprometerse. Debería ser el predeterminado.
Petter
11

cherry-pick -n debería hacer lo que quiera, pero no estoy seguro de por qué quiere las mejoras de compilación como cambios sin etapas, eso solo hace que varias cosas sean más difíciles (por ejemplo, fusionar otros cambios en los archivos modificados o volver a colocar cualquier cosa).

En este ejemplo, solo hay una rama con mejoras de compilación, pero puede haber hasta N ramas con mejoras de compilación que quiero aplicar mientras trabajo en una rama de funciones.

En ese caso, crearía una nueva rama, C, que fusiona tanto de A como de B (y cualquier otra rama con mejoras de compilación). Confirme los cambios en la rama de funciones, B, luego combínelos con la rama C, que ahora contiene las mejoras de compilación y los cambios de la rama de funciones, para que puedan probarlos juntos. Si necesita hacer más cambios, hágalo en la rama apropiada, no en C, luego fusione a C. Así que nunca cambie nada en la rama C, solo úsela para integrar cambios de otras ramas.

Eso significa que puede usar todas las características de Git en la rama C, en lugar de hacer malabarismos con los cambios no confirmados en un árbol sucio.

Jonathan Wakely
fuente
UseCase para cherry-pick -n: Creé una copia de trabajo de mi código agregando muchas cosas en lugares aleatorios. Ahora quiero limpiar mi código antes de comprometerme con la rama de esta función. Entonces cambio a una rama temporal, confirmo todos los cambios. Regrese a la rama de características, cherry-pickque se compromete. ¿Existe una forma mejor de hacer esto?
Tejas Kale
6

Debería poder seleccionar las confirmaciones (con -npara evitar comprometerse de inmediato).

Lucero
fuente
-n no funcionó. Dice que no ha fallado la opción -m dada la confirmación de selección selectiva.
Alejandro Sanz Díaz
5

No estoy 100% seguro de haberlo entendido claramente, pero en mi caso acabo de crear un parche de diferencia entre las ramas y luego apliqué esta ruta en la rama B.

Dentro de la rama A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff
sobi3ch
fuente
4

No estoy seguro de entender sus requisitos.

Puede ejecutar una combinación y luego llamar git reset HEAD~1.


La siguiente secuencia debería reproducir cada confirmación entre mastery branchAencima de branchB. Se branchBomitirán las confirmaciones que ya se hayan aplicado .

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
LeGEC
fuente
Eso agrega archivos al área de preparación de git que no quiero. Además, solo parece funcionar bien cuando todas las ramas se ramifican desde la misma confirmación en la rama maestra. De lo contrario, se introducen diferencias que no están en el rango master..branchA.
Björn Lindqvist
@ BjörnLindqvist: elimine la --softopción si no desea los cambios en el área preparada . ¿Podrías dibujar un gráfico de cómo están configuradas tus ramas?
LeGEC