GIT: deshacer cambios a un file o carpeta por un desarrollador solo?

Posible duplicado:
git deshacer cambios en algunos files

Soy un desarrollador en solitario (bueno, estudiante en realidad) y me encuentro a menudo deseando recuperar los files a un estado anterior y deshacer los cambios que introdujeron errores en el progtwig. Deseo hacer esto en files individuales la mayor parte del time, pero puede desear hacerlo así como también en toda la carpeta en otros momentos. En teoría, esto podría extenderse a la restauración de files que he eliminado. Supongamos que tengo el estado anterior de los files y la carpeta guardada con una confirmación previa. No estoy tratando de borrar el compromiso anterior, solo retroceder y tener un logging de lo que he hecho. Soy la única persona que trabaja en los files, este no es un proyecto clonado desde un sitio de alojamiento.

Sé cómo hacer las cosas básicas extremas en Mercurial, y descubro que hg revert y hg update # hacen lo que quiero hacer en el mundo mercurial, pero aún no entiendo cómo lo hace. Quizás desee alojar un proyecto en Github y también esté interesado en aprender sobre git ya que se está convirtiendo en el jugador dominante en el universo de control de versiones. No tengo experiencia en subversión y no necesito references sobre cómo las cosas son diferentes de la subversión.

Puede que desee aprender a dividir mi propio proyecto en un par de versiones y luego fusionarlas, pero lo exploraré más adelante. Mi pregunta en este momento se aplica a deshacer los cambios a la única copy de files y carpetas en mi propio disco duro.

¿Alguna sugerencia sobre una introducción amigable para novatos a git? Ya sea en línea o en forma de libro está bien. Por favor, no me guíe a ningún recurso escrito por Scott Chacon; Creo que su estilo y libros / Peepcode PDF son extremadamente confusos. También tengo el libro Pragmatic Guide to Git de Swicegood, pero no me ha resultado muy útil. No debería ser tan difícil descubrir cómo deshacer cambios en git. He pasado horas buscando hasta ahora.

Tenga en count que soy un novato con control de versiones, así que sea amable.

Gracias.

Primero, haga un git log para ver su historial para que pueda decidir a qué versión desea "retrotraer". Vamos a llamarlo A Ahora, tienes algunas opciones.

  1. Puedes cortar una twig desde A y trabajar allí. Por lo general, esto es lo correcto, ya que a menudo sucede que no desea revertir por completo, sino que simplemente desea probar otra cosa. Esto se puede hacer usando git checkout -b retry A (crea y cambia a una twig llamada retry partir del commit A ). Ahora puede trabajar allí como si el rest de los cambios desde A no estuvieran allí.

  2. Asumiendo que estás en la twig master , puedes hacer un git reset --hard A para descartar todos los commits desde A y volver a ese estado. Por lo general, esta no es una buena idea, ya que es difícil seguir todos los cambios desde entonces (si los necesita).

  3. Una versión más "brain dead" que simplemente reemplaza el contenido de un solo file (digamos foo.c ) con su contenido a partir del "commit A es decir git cat-file -p A:foo.c > foo.c Entonces puede comprometer esta "nueva versión" del file. Esta no es una buena idea, ya que git no está consciente de que estás retrocediendo. Simplemente piensa en esto como un nuevo compromiso.

No estoy seguro si todo esto es claro para usted, pero si no, pregunte e intentaré aclarar.

Si desea revertir una confirmación, use git revert hash_of_the_commit . Esto se rastrea: la reversión es un nuevo compromiso en sí mismo.

Si desea revertir solo parte de una confirmación, una de las cosas que puede hacer es usar git diff :

 $ git diff HEAD~3 file.txt # will display a diff of file.txt between the current head and three # revisions prior to that $ git diff HEAD~3 file.txt | patch -R $ git add file.txt $ git commit -m "super commit message" # will revert that file to what it was in HEAD~3 

Necesitas el git checkout . Puede verificar los files individuales o las routes de las confirmaciones especificadas:

 git checkout commit_SHA1 -- your_file_name.here 

Puede ser confuso porque en la mayoría de los casos, el git checkout se usa para cambiar de sucursales.

Puedes usar cualquier método para identificar commit aquí, te sugiero que hagas git log o uses alguna interfaz gráfica de usuario y encuentres la identificación de SHA1 de tu commit.

Usted ha dicho que no le gustan los resources de Scott Chacon, pero puede ser útil.

Encontré su artículo sobre el command "reiniciar" muy útil y claro de entender. Solo después de eso, he entendido su uso. Enlace: http://progit.org/2011/07/11/reset.html

Al less puede ser útil para otros que lean esta pregunta.