Obtenga cambios de otra rama sin afectar la rama actual en absoluto

5 minutos de lectura

avatar de usuario
andrii zymohliad

¿Existe una manera simple de obtener cambios de otra rama sin fusionar o reorganizar? ¿Y mantener esos cambios como sin seguimiento (para archivos nuevos) o no preparados para confirmación (para archivos existentes)?

  • ¿Por qué quieres hacer esto? La fusión y el cambio de base son básicamente las dos únicas opciones para traer cambios desde otra rama. Si no quiere hacer esto, ¿por qué no simplemente cambia a la otra rama?

    – Tim Biegeleisen

    26 de octubre de 2016 a las 4:05

  • Porque la rama desde la que quiero actualizar (rama de origen) debe revisarse y luego fusionarse con la maestra. Me gustaría actualizar mi sucursal actual (sucursal de destino) directamente desde el maestro después de que se revise este código. Pero necesito probar nuevas funciones desde la rama de origen en mi rama de destino.

    –Andrii Zymohliad

    26 de octubre de 2016 a las 6:23

avatar de usuario
Ôrel

haga una combinación para obtener el cambio, luego cancele la combinación pero mantenga la modificación:

git merge --no-ff feature
git reset HEAD~1

  • Esta es en realidad la mejor respuesta en mi opinión. Las ramas de características generalmente tienen una tonelada de sus propios compromisos, por lo que, a menos que se aplasten primero, no puede hacerlo con cherry-pick

    –Jerry Brady

    26 de febrero de 2019 a las 22:35

  • @JerryBrady, gracias por la explicación. De alguna manera me perdí tu comentario. Marcando esto como una respuesta.

    –Andrii Zymohliad

    15 de julio de 2019 a las 10:12

  • Parece que tampoco funciona bien con sucursales que tienen muchas confirmaciones propias. Si mi rama actual está muy por detrás de la rama de la que quiero obtener cambios, aún terminaría trayendo las confirmaciones a mi registro de git. Creo que la respuesta de @njam es la solución más confiable, ya que no implica trabajar con el historial de git en absoluto.

    –Andrii Zymohliad

    17 de diciembre de 2019 a las 16:54

  • ¡La mejor respuesta! Si lo consigues Git refusing to merge unrelated histories on rebase al hacer git merge feature entonces hazlo git merge feature ----allow-unrelated-histories

    – Joaquín Iurchuk

    17 de enero de 2020 a las 13:33

  • Votado negativamente, esta respuesta trae MUCHAS confirmaciones y ejecutar git reset HEAD ~ 1 solo deshace la última

    – Iván Castellanos

    10 de marzo a las 19:17

avatar de usuario
1615903

git cherry-pick -n <commit>...
git reset

git cherry-pick -n <commit>... toma los cambios de uno o más compromisos y los aplica a su árbol de trabajo actual sin hacer un compromiso.

Documentación para -n bandera:

-norte

–sin compromiso

Por lo general, el comando crea automáticamente una secuencia de confirmaciones. Esta bandera aplica los cambios necesarios para seleccionar cada confirmación con nombre en su árbol de trabajo y el índice, sin realizar ninguna confirmación. Además, cuando se usa esta opción, su índice no tiene que coincidir con la confirmación HEAD. La selección selectiva se realiza contra el estado inicial de su índice.

Esto es útil cuando selecciona el efecto de más de una confirmación en su índice en una fila.

git reset eliminará los archivos seleccionados de la puesta en escena.

  • La pregunta era sobre todas las diferencias entre una rama diferente y la rama actual, no sobre la aplicación de confirmaciones específicas.

    – Iván Castellanos

    10 de marzo a las 19:18

  • @IvanCastellanos No, OP no especificó que quieren traer TODOS los cambios de otra rama. Y en cualquier caso, cherry-pick acepta un rango de compromiso como parámetro, que puede utilizar para traer todos los cambios si lo desea.

    – 1615903

    11 de marzo a las 5:07


  • Por ejemplo, si en el futuro desea tomar los cambios de la misma rama, no puede simplemente ejecutar el mismo comando, debe averiguar la confirmación de la rama actual, la respuesta de njam es completamente independiente de dicha información y, por lo tanto, se ajusta mejor a esta pregunta.

    – Iván Castellanos

    15 de marzo a las 0:05

  • @IvanCastellanos si revisas la documentación, notarás que <commit> en este comando se puede especificar de acuerdo con gitrevisionesque también acepta nombres de sucursales.

    – 1615903

    15 de marzo a las 5:53

  • El uso del nombre de la rama solo traerá la última confirmación en la rama, no todos los cambios, esto puede sorprender a los novatos de git, la forma equivalente de usar la selección de cereza (para obtener los mismos resultados que la respuesta aceptada) necesitaría dos puntos antes del nombre de la rama para incluir todos los cambios: git cherry-pick -n ..feature

    – Iván Castellanos

    16 de marzo a las 6:39


Puedes usar git diff <another-branch> ^HEAD para imprimir una diferencia de los cambios que están en “otra rama”, pero no en su sucursal actual (HEAD). Y luego aplique esos cambios al índice actual pasándolos a git apply -.

git diff <another-branch> ^HEAD | git apply -

  • Me gusta que esta solución no toque el índice.

    – Señor Mas

    2 de mayo a las 21:32

Esto requiere que su árbol de trabajo esté limpio (sin modificaciones del compromiso HEAD)1.

git cherry-pick <commit>
git reset --soft HEAD~1
git reset .

Aplicará los cambios de otra rama a su rama actual si existe una confirmación, manteniendo los archivos nuevos sin seguimiento y los archivos existentes sin etapas.


Si está interesado en saber cómo aplicar los cambios de otra rama en otro repositorio a su repositorio actual. Esto puede hacerse aquí.

  1. https://git-scm.com/docs/git-cherry-pick

Consulte la nueva rama en la que desea colocar los cambios no confirmados.

git merge --squash sourcebranch

Funciona de manera similar a la respuesta aceptada pero es una línea.

https://blog.oddbit.com/post/2019-06-17-evite-rebase-hell-squashing-wi/

  • Oh, guau, esto es agradable

    –Andrii Zymohliad

    11 de febrero a las 8:37

avatar de usuario
Comunidad

Para capturar cambios sin una combinación, puede usar:

git fetch

para tomar cambios sin cambiar su rama actual.

  • Oh, guau, esto es agradable

    –Andrii Zymohliad

    11 de febrero a las 8:37

avatar de usuario
phill

Puede usar git checkout desde la sucursal a la que desea transferir los cambios:

git checkout <branch name> . 

Eso cambiará todos los archivos para que coincidan con la versión en la rama deseada. Entonces puedes comprometerte, cambiar, descartar lo que quieras.

¿Ha sido útil esta solución?