Necesito aplicar los cambios introducidos en una rama a otra rama. Puedo usar una selección de cerezas para hacer eso. Sin embargo, en mi caso, quiero aplicar cambios que son relevantes solo para un archivo, no necesito seleccionar la confirmación completa. ¿Como hacer eso?
108
Respuestas:
Tienes diferentes opciones en función de lo que quieras conseguir:
Si desea que el contenido del archivo sea el mismo que en la rama de destino, puede usar
git checkout <branch> -- <filename>
. Sin embargo, esto no "seleccionará" los cambios que ocurrieron en una única confirmación, sino que simplemente tomará el estado resultante de dicho archivo. Entonces, si agregó una línea en una confirmación, pero las confirmaciones anteriores cambiaron más, y solo desea agregar esa línea sin esos otros cambios, entonces una verificación no es lo que desea.De lo contrario, si desea aplicar el parche introducido en una confirmación a un solo archivo, tiene varias opciones. Puede ejecutar
git cherry-pick -n
, es decir, sin comprometerlo, editar el compromiso (por ejemplo, restablecer todos los archivos usandogit reset -- .
y solo agregar el archivo que realmente desea cambiar usandogit add <filename>
). O puede crear la diferencia para el archivo y aplicar la diferencia luego:fuente
Crea un
patch file
y aplícalo.EDITAR:
Como necesita tomar los cambios de una confirmación, cree el parche de esta manera:
fuente
git diff sha1
(ogit diff branch
- es lo mismo si la rama apunta al mismo hash) solo producirá una diferencia del directorio de trabajo actual en relación con ese hash, pero no los cambios introducidos por una confirmación por sí sola.git checkout
con un nombre de archivo es el martillo adecuado para este clavo. Ambas opciones son innecesariamente complejas.checkout
no funcionará, ya que puede involucrar otros cambios anteriores no deseados y puede que no contenga cambios realizados en la rama actual.Otra cosa útil que puede hacer es obtener el parche localmente y luego usar:
Sin embargo, eso no es una selección de cerezas.
fuente
Git tiene todo listo :)
Solo usa
git checkout <sha> <path-to-file>
fuente
esto funciona si desea que un solo archivo de otra rama se copie a la rama de trabajo actual
fuente
Esto es lo que buscas:
sha1 es opcional
fuente
Lo que suelo hacer es usar
git ls-tree
solo haz:
Esto imprimirá todos los nombres de archivo que coincidan con su grep y le dará claves SHA1 de los archivos en la confirmación.
Git show también se puede usar en archivos fuera de su rama. usar
>
desde su shell para canalizar la salida a un archivo le da el resultado que está buscando.fuente
Puedes intentar hacer esto:
Por ejemplo:
fuente
mueve los archivos a la etapa de confirmación previa
quita de la memoria
Ahora su rama está bastante limpia (volvió a la confirmación anterior)
fuente