¿Cómo puedo restaurar solo unas pocas líneas de un file grabado en una confirmación determinada?

Quiero restaurar algunas líneas de un file grabado en una confirmación anterior. Puedo ver esas líneas ejecutándose

git log -p 

Como último recurso, estoy listo para simplemente copyr esas líneas de la salida de ese logging, pero eso lastimaría el corazón de mi purista y me parece bastante poco profesional.

No quiero simplemente ejecutar git checkout <file> porque eso descartaría los cambios locales realizados en <file> desde la confirmación en cuestión. En cambio, me gustaría fusionar los cambios de esa confirmación en <file> en el tree de trabajo utilizando solo commands puros de Git.

¿Cómo puedo hacer eso?

Use el pago interactivo

La siguiente syntax de git-checkout ,

 git checkout --patch <tree-ish> -- <paths> 

o equivalente,

 git checkout -p <tree-ish> -- <paths> 

le permite ver interactivamente hunks de uno o más files, enumerados en <paths> , como se registró en <tree-ish> (más comúnmente, un commit).

Consulte la página man de git-checkout para get más detalles.

Ejemplo

Para corregir ideas, he aquí un ejemplo de juguete (se omite la salida estándar irrelevante):

 # set things up $ mkdir test $ cd test $ git init # create some content and commit $ printf "Hello, world.\n" > README.md $ printf "foo\nbar\nbaz\n" > test.txt $ git add . $ git commit -m "initial commit" # modify the working tree $ printf "another line\n" >> README.md $ printf "foo\nfoo\n" > test.txt # now restre stuff from test.txt as recorded in master's tip $ git checkout -p master -- test.txt diff --git b/test.txt a/test.txt index 0d55bed..86e041d 100644 --- b/test.txt +++ a/test.txt @@ -1,2 +1,3 @@ foo -foo +bar +baz Apply this hunk to index and worktree [y,n,q,a,d,/,e,?]? y error: patch failed: test.txt:1 error: test.txt: patch does not apply The selected hunks do not apply to the index! Apply them to the worktree anyway? y # Sanity check: inspect the working tree # (the hunk "bar\nbaz" from test.txt was restnetworking, as desinetworking) $ cat test.txt foo bar baz # (README.md, on the other hand, was not affected, as desinetworking) $ cat README.md Hello, world. another line 

Si en la confirmación anterior solo cambiaste este file, y deseas deshacer todos esos cambios, simplemente hazlo:

 git revert SHA 

Si hubo más de un file, aquí hay una solución pura de git (y no excelente):

 git revert SHA --no-commit git reset git add path/to/file git checkout . git commit 

O una solución de patch git + (tampoco excelente):

 git diff -p SHA path/to/file > patch patch -R < patch git commit .