En parte, cereza elegir un comprometerse con Git
-
20-09-2019 - |
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.
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
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
:
- Haga la selección completa de cereza.
-
git reset HEAD^
para convertir todo el palmitas cometer en cambios de trabajo unstaged. - Ahora
git stash save --patch
: seleccionar de forma interactiva el material no deseado para guardar .
- Git revierte los cambios escondidas de su copia de trabajo.
-
git commit
- 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