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 .