2010-08-08 10 views
7

Asumamos que tenemos un repositorio y 5 se compromete:¿Es posible revocar confirmaciones?

  • cometen 1
  • comprometen 2
  • cometer 3
  • cometen 4
  • cometen 5

Y ahora se dan cuenta compromete 4 y 5 son una mala idea. Quiero eliminar por completo todos los cambios confirmados en commit 4 y 5. ¿Cómo hacerlo?

+0

Iría con revertir si ha enviado a un repositorio público. de lo contrario, cualquiera de las otras opciones está bien. – xenoterracide

Respuesta

4

git revert commit_hash

revierte commit dado. Tenga en cuenta que revertir es otra confirmación que descarta los cambios desde commit_hash, sin eliminar el commit dado del repositorio.

3

probablemente me creo una nueva rama de cometer 3.

git checkout -b commit3 

y luego reajustar maestro de ese cometer

http://git-scm.com/docs/git-rebase

por supuesto, está utilizando ramas puntuales para mantener su las ramas de desarrollo se separan hasta que sepa que son una buena idea, ¿no?

6

Si comete 4 y 5 son sólo en su repositorio y no han sido empujado o tirado por cualquier otro repositorio, puede simplemente:

git restablecer SHA1_HASH_OF_COMMIT_3 --hard

Usted puede encontrar el hash SHA1 de una confirmación usando git log o puede usar técnicas de nomenclatura más avanzadas, consulte git help rev-parse en particular la sección 'ESPECIFICAR REVISIONES'.

El uso de este comando dejará las confirmaciones 4 y 5 como inalcanzables desde la punta de la rama. Sin embargo, las confirmaciones no se perderán, ya que esas confirmaciones se mantienen en el reflog de la sucursal. Puede usar git reflog para identificar una confirmación inalcanzable. La restauración se puede hacer con otra git reset --hard. Esta página here lo describe bastante bien.

Se recomienda que ejecute git gc de forma regular; algunos comandos también hacen esto automáticamente. Esto esencialmente realiza 'tareas domésticas' en el repositorio, como "comprimir revisiones de archivos (para reducir el espacio en disco e incrementar el rendimiento) y eliminar objetos inalcanzables". Los objetos inalcanzables se eliminan del repositorio después de (un valor predeterminado de) 30 días. Esto se puede cambiar usando la opción de configuración gc.reflogExpireUnreachable.

+0

"hasta que ejecute' git gc' "es engañoso: se invoca a sí mismo automáticamente y, en general, el usuario no necesita ejecutarlo. La confirmación tampoco se considerará inalcanzable siempre que esté en los reflogs, que tardan 90 días en caducar. Incluso si elimina la rama (y con ella sus reflogs), el valor predeterminado es solo para podar objetos de más de 30 días. Upshot: no va a desaparecer pronto. – Cascabel

+0

@Jefromi Estoy de acuerdo, es engañoso. Disculpas por una respuesta bastante apresurada. He actualizado mi respuesta con un poco más de detalle. –

Cuestiones relacionadas