2010-06-30 14 views
7

he hecho 2 commit (Y no he empujado) en Git, donde 'Commit 2' es el más reciente ':¿Cómo puedo hacer retroceder 1 de cambio de archivos en mi confirmación anterior

git log -2 
commit 791962d776f66253d656586b097b2677eaa983d1 
Author: michael <[email protected](none)> 
Date: Tue Jun 29 23:20:58 2010 -0700 

    Commit 2 

commit b743075e81f6fe25fe48ddbef2b5e7cc06623533 
Author: michael <[email protected](none)> 
Date: Tue Feb 16 23:09:53 2010 -0800 

    Commit 1 

Y en mi comprometerse 1 b743075e81f6fe25fe48ddbef2b5e7cc06623533, toqué/cambiado un número de archivos:

dir1/file1.cpp 
    dir1/file1.h 
    dir1/file2.cpp 
    dir1/file2.h 

mi pregunta es, ¿cómo puedo hacer retroceder mis cambios que le hice a dir1/file2.cpp, dir1/file2.h de cometer 1? ¿Y mantener todo lo demás igual?

Gracias.

Respuesta

5

La solución más simple sería, desde su última comprometerse (cabeza) a:

  • checkout esos dos archivos en la versión anterior,
  • agregarlos,
  • y luego comprometerse.
 
    git checkout b743075e81 -- dir1/file2.cpp 
    git checkout b743075e81 -- dir1/file2.h 
    git add dir1/file2.cpp # only if you made additional changes 
    git add dir1/file2.h # only if you made additional changes 
    git commit -m "revert dir1/file2.cpp and dir1/file2.h" 

Como Chris Johnsen menciones en los comentarios:

git checkout con pathspecs actualiza el índice (como git reset con pathspecs) y el árbol de trabajo, por lo git add no se necesita menos cambios adicionales son hecho después del pago.

+0

Esta es, de hecho, la única opción en su sano juicio, si ya ha utilizado 'git push' para enviar sus confirmaciones al origen. –

+0

* git checkout * con pathspecs actualiza el índice (como * git reset * con pathspecs) y el árbol de trabajo, por lo que * git add * no es necesario a menos que se realicen cambios adicionales después del pago. –

+0

No he hecho un 'git push'. – michael

0

Uso siguiente comando para hacer retroceder el archivo con el archivo previamente comprometida basado en el hash comprometerse y nombre del archivo que se necesita para revertir

git reset <commit hash> <filename> 

Para su utilización requisito

git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.cpp 

git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.h 
+0

Esto funciona, pero puede ser confuso porque solo "revierte" las entradas de índice, no el árbol de trabajo (a diferencia de 'git checkout treeish - pathspecs' que actualiza tanto el índice como el árbol de trabajo). –

3

Si Ya has empujado tus commits al origen, entonces las otras soluciones descritas aquí (usando git reset o git checkout, seguidas por git commit) es tu única opción. .

Sin embargo, si no ha presionado sus cambios, sin embargo, y que desea eliminar todos los rastros que los archivos se han cometido alguna vez, un rebase interactivo es una buena opción. Utilice el siguiente comando para reubicar sus dos últimas confirmaciones:

git rebase --interactive HEAD~2 

Se abrirá un editor que muestra sus dos confirmaciones. Desea editar el archivo para mostrar lo siguiente, luego guardar; en particular, desea cambiar pick en frente de su primera comprometerse a edit:

edit b743075 Commit 1 
pick 791962d Commit 2 

Git entonces nos sitúan en un estado en el que podemos editar el primer commit (sin tocar el segundo).Se dice que se puede modificar el commit con git commit --amend, pero en realidad quiere hacer un reset a la confirmación antes de la cabeza, y deshacer por completo:

git reset HEAD^ 

Esto colocará los cambios de Commit 1 de nuevo en su árbol de trabajo. Entonces, git add sólo los archivos que desea conservar, y volver a comprometerse ellos utilizando git commit:

git add dir1/file1.cpp 
git add dir1/file1.h 
git commit -m "Commit 1" 

Por último, hacer un restablecimiento completo para eliminar los archivos que no desee conservar de su árbol de trabajo, y el acabado el rebase:

git reset --hard 
git rebase --continue 

Cuando el rebase es completa, su repositorio tendrá ambas confirmaciones, pero no hay rastros de los archivos file2.*.

Cuestiones relacionadas