Lo principal que querrás aquí es git add -p
( -p
es sinónimo de --patch
). Esto proporciona una forma interactiva de registrar el contenido, permitiéndole decidir si cada trozo debe entrar e incluso permitiéndole editar manualmente el parche si es necesario.
Para usarlo en combinación con cherry-pick:
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-commit, y gracias a Felix Rabe por señalar que necesita reiniciar! Si solo quiere dejar algunas cosas fuera del commit , podría usar git reset <path>...
para desestabilizar solo esos archivos).
Por supuesto, puede proporcionar rutas específicas add -p
si es necesario. Si está comenzando con un parche, puede reemplazarlo cherry-pick
por apply
.
Si realmente quieres un git cherry-pick -p <commit>
(esa opción no existe), puedes usar
git checkout -p <commit>
Eso diferenciará la confirmación actual contra la confirmación que especifique, y le permitirá aplicar trozos de esa diferencia individualmente. Esta opción puede ser más útil si la confirmación que está realizando tiene conflictos de fusión en parte de la confirmación que no le interesa. (Tenga en cuenta, sin embargo, que checkout
difiere de cherry-pick
: checkout
intenta aplicar <commit>
los contenidos por completo, cherry-pick
aplica la diferencia de el commit especificado de su padre. Esto significa que checkout
puede aplicar más que solo ese commit, que podría ser más de lo que desea).
cherry-pick -n
aparentemente no dejaron los cambios organizados; la convención es definitivamente que las--no-commit
opciones se detienen justo antes de la confirmación, es decir, con todos los cambios organizados. Agregaré el reinicio a la respuesta.git checkout -p <F>
no no simplemente conseguir que los cambios de F, se hace que ABCDEF todo en puré juntos y le permite descifrar qué parte de que desea . Reducir eso a solo algunos de los cambios de F es un dolor. Por otro lado,git cherry-pick -n <F>
solo obtienes los cambios de F, y si alguno de esos cambios entra en conflicto, te lo ayuda de manera útil para que puedas descubrir cómo fusionarte correctamente.git reset
eliminaría los archivos almacenados yadd -p
simplemente diría 'nada que agregar'.Sé que estoy respondiendo una vieja pregunta, pero parece que hay una nueva forma de hacerlo con la verificación interactiva:
Crédito para ¿Puedo elegir interactivamente trozos de otro git commit?
fuente
Suponiendo que los cambios que desea están en la cabecera de la rama desde la que desea los cambios, use git checkout
para un solo archivo:
para múltiples archivos solo en cadena:
fuente
Sobre la base de la respuesta de Mike Monkiewicz , también puede especificar uno o más archivos para pagar desde el sha1 / branch suministrado.
Esto le permitirá elegir de manera interactiva los cambios que desea aplicar a su versión actual del archivo.
fuente
Si desea especificar una lista de archivos en la línea de comando y hacer todo en un solo comando atómico, intente:
git apply --3way <(git show -- list-of-files)
--3way
: Si un parche no se aplica limpiamente, Git creará un conflicto de fusión para que puedas ejecutarlogit mergetool
. Omitir--3way
hará que Git renuncie a los parches que no se aplican limpiamente.fuente
Si "seleccionar en parte la cereza" significa "dentro de los archivos, elegir algunos cambios pero descartar otros", se puede hacer incorporando
git stash
:git reset HEAD^
para convertir todo el compromiso seleccionado en cambios de trabajo no organizados.git stash save --patch
: seleccione interactivamente material no deseado para guardar.git commit
git stash drop
.Consejo: si le da un nombre al alijo de cambios no deseados:
git stash save --patch junk
si olvida hacer (6) ahora, más tarde reconocerá el alijo por lo que es.fuente
Use
git format-patch
para cortar la parte del compromiso que le interesa ygit am
aplicarlo a otra ramafuente