Pregunta

Estoy trabajando en 2 ramas diferentes: versión y Desarrollo .

Me di cuenta de que todavía necesidad de integrar algunos cambios que se cometieron a la versión rama de vuelta en el Desarrollo rama.

El problema es que no necesito todo el compromiso, sólo algunos trozos en ciertos archivos, por lo que un simple

git cherry-pick bc66559

no hacer el truco.

Cuando hago un

git show bc66559

Puedo ver el diff, pero realmente no sé una buena manera de aplicar esa parte de mi árbol de trabajo actual.

¿Fue útil?

Solución

Lo básico que va a querer aquí es git add -p (-p es sinónimo de --patch). Esto proporciona una manera interactiva para comprobar en el contenido, que le permite decidir si cada trozo debe entrar, e incluso lo que le permite editar manualmente el parche, si es necesario.

Para usarlo en combinación con la cereza-escoge:

git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset                   # unstage the changes from the cherry-picked commit
git add -p                  # make all your choices (add the changes you do want)
git commit                  # make the commit!

(Gracias a Tim Henigan por recordarme que git-cherry-pick tiene una opción --no-comprometerse, y gracias a Felix Rabe para señalar que es necesario restablecer! Si sólo desea dejar algunas cosas de la confirmación, usted podría utilizar git reset <path>... a unstage sólo esos ficheros.)

Por supuesto, puede proporcionar rutas específicas para add -p si es necesario. Si vas a empezar con un parche que podría reemplazar el cherry-pick con apply.


Si usted realmente quiere un git cherry-pick -p <commit> (esa opción no existe), su puede usar

git checkout -p <commit>

Eso diff la corriente cometen en contra de la confirmación se especifica, y permitirá aplicar trozos de ese diff de forma individual. Esta opción puede ser más útil que la de comprometerse usted está tirando en los conflictos de fusión ha de comprometerse parte de la que no está interesado en (Tenga en cuenta, sin embargo, que se diferencia de checkout cherry-pick:. checkout trata de aplicar el contenido del <commit> por completo, se aplica cherry-pick el diff de la confirmación especificada desde su matriz. Esto significa que checkout puede aplicar algo más que esa confirmación, que podría ser más de lo que desea.)

Otros consejos

Sé que estoy respondiendo a una vieja pregunta, pero parece que hay una nueva manera de hacer esto con el registro de salida de forma interactiva:

git checkout -p bc66559

¿Puedo interactiva recoger trozos de otro git commit ?

Suponiendo que los cambios que usted quiere están a la cabeza de la rama desea que los cambios de, el uso git checkout

para un solo archivo:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

para múltiples archivos cadena acaba de margarita:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb

Mike Monkiewicz responder también puede especificar una o más archivos a la comprobación de la SHA1 / rama suministrado.

git checkout -p bc66559 -- path/to/file.java 

Esto le permitirá elegir de forma interactiva los cambios que desea han aplicado a su versión actual del archivo.

Si desea especificar una lista de archivos en la línea de comandos, y obtener toda la cosa hecha en un solo comando atómica, trate de:

git apply --3way <(git show -- list-of-files)

--3way: Si un parche no se aplica limpiamente, Git va a crear un conflicto de combinación para que pueda ejecutar git mergetool. Omitiendo --3way hará Git renunciar a los parches que no se aplican limpiamente.

Si "en parte cherry picking" medios "dentro de los archivos, la elección de algunos cambios, pero descartando los demás", se puede hacer mediante la incorporación de git stash:

  1. Haga la selección completa de cereza.
  2. git reset HEAD^ para convertir todo el palmitas cometer en cambios de trabajo unstaged.
  3. Ahora git stash save --patch: seleccionar de forma interactiva el material no deseado para guardar
  4. .
  5. Git revierte los cambios escondidas de su copia de trabajo.
  6. git commit
  7. Bote el alijo de cambios no deseados: git stash drop.

Consejo: si se le da el alijo de cambios no deseados de su nombre:. git stash save --patch junk continuación, si se olvida de hacer (6) ahora, más tarde se le reconocen el alijo por lo que es

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top