Pregunta Cómo seleccionar solo los cambios para un solo archivo, no la totalidad del compromiso


Necesito aplicar los cambios introducidos en una rama a otra rama. Puedo usar Cherry Pick para hacer eso. Sin embargo, en mi caso, quiero aplicar cambios que son relevantes solo para un archivo, no es necesario seleccionar el compromiso completo. ¿Como hacer eso?


74
2018-04-17 19:09


origen


Respuestas:


Tienes diferentes opciones basadas en lo que quieres lograr:

Si desea que los contenidos del archivo sean los mismos que en la rama de destino, puede usar git checkout <branch> -- <filename>. Sin embargo, esto no "elegirá" los cambios que ocurrieron en una única confirmación, sino que solo tomará el estado resultante de dicho archivo. Por lo tanto, 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 múltiples opciones. Podrías correr git cherry-pick -n, es decir, sin comprometerlo, edite la confirmación (por ejemplo, restablezca todos los archivos usando git reset -- . y solo agrega el archivo que realmente deseas cambiar usando git add <filename>) O puede crear el diff para el archivo y aplicar el diff luego:

git diff <branch>^..<branch> -- <filename> | git apply

104
2018-04-17 19:25



Crear un patch file y aplicarlo.

git diff branchname -- filename > patchfile
git apply patchfile

EDITAR:

Como necesita tomar los cambios de una confirmación, cree el parche de esta manera:

git show sha1 -- filename > patchfile

14
2018-04-17 19:21



Otra cosa útil que hacer es obtener el parche localmente y luego usar:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

Sin embargo, eso no es una elección genial.


9
2018-04-17 19:17



Git lo tiene todo listo :)

Solo usa git checkout <sha> <path-to-file>


5
2017-12-07 04:37



La respuesta mejor calificada indica que git checkout <branch> -- <filename>. Sin embargo, este enfoque solo funcionará si el archivo existe en la rama actual.


2
2018-01-03 06:50



Esto es lo que estás buscando:

git checkout target-branch sha1 path/to/file

sha1 es opcional


1
2018-04-17 19:18



Lo que tiendo a hacer es usar git ls-tree

solo haz:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'

Esto imprimirá todos los nombres de archivos que coincidan con su grep y le dará a SHA1 claves de los archivos en la confirmación.

Git show también se puede usar en archivos fuera de su sucursal. utilizando > desde su caparazón para canalizar la salida en un archivo le da el resultado que está buscando.


1
2018-03-06 10:35



git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

esto funciona si desea copiar un único archivo de otra rama a la rama de trabajo actual


1
2018-05-16 09:05



git reset HEAD~1

mueve los archivos a la etapa de precompromiso

git stash

elimina de la memoria

Ahora su rama está bastante limpia (revertida a la confirmación anterior)


-6
2017-07-22 18:56