volver ver recuperar pendientes log commits borrado anterior git git-checkout

git - ver - recuperar commit borrado



¿Cómo puedo restaurar solo unas pocas líneas de un archivo grabado en una confirmación dada? (2)

Utilizar checkout interactivo

La siguiente sintaxis de git-checkout ,

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

o equivalente,

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

le permite consultar de forma interactiva los fragmentos de uno o más archivos, enumerados en <paths> , como se registra en <tree-ish> (más comúnmente, un commit).

Vea la página del manual de git-checkout para más detalles.

Ejemplo

Para arreglar ideas, aquí hay 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 restore 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 restored, as desired) $ cat test.txt foo bar baz # (README.md, on the other hand, was not affected, as desired) $ cat README.md Hello, world. another line

Quiero restaurar algunas líneas de un archivo grabado en una confirmación anterior. Puedo ver esas líneas corriendo

git log -p

Como último recurso, estoy listo para copiar simplemente esas líneas de la salida de ese registro, pero eso lastimaría el corazón de mi purista y parece 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 su lugar, me gustaría combinar los cambios de esa confirmación en <file> en el árbol de trabajo utilizando solo comandos puros de Git.

¿Cómo puedo hacer eso?


Si en la confirmación anterior solo cambió este archivo y desea deshacer todos esos cambios, simplemente haga lo siguiente:

git revert SHA

Si hubiera más de un archivo, aquí hay una solución git pura (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 es genial):

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