2009-01-29 25 views
14

Quiero reparar un archivo en una confirmación anterior. Esto podría afectar todas las confirmaciones ascendentes.que modifica un solo archivo en una confirmación anterior en git

¿Hay alguna manera fácil de hacerlo? ¿Me puede dar una guía de cómo hacer eso?

Muchas veces cuando me comprometo dos veces me parece que he tenido un error en la primera confirmación, y deseo corregir el error sin tener que 'reiniciar' mi última confirmación.

Para aclaración. Quiero cambiar el commit actual, es decir, quiero que se modifique el contenido de la confirmación pasada. IOW Quiero cambiar el historial!

Respuesta

20

Si sólo desea modificar la segunda a la última confirmación (por ejemplo, no hace mucho tiempo, sobre todo, no antes de que muchas ramas y se funde.), Entonces yo uso este procedimiento:

  1. git checkout -b tmp bad-commit
  2. fijar el
  3. archivos
  4. git commit --amend
  5. git rebase tmp master

Si tiene una fusión en el medio, puede probar rebase -i -p, pero los resultados pueden variar.

+2

Esto cambiará su historial. Después de la rebase, la confirmación accesible desde la punta de su rama, con el nombre correcto, será la confirmación fija. Cuando presionas, la confirmación incorrecta no se enviará al servidor. – jpalecek

+1

Cree que el último comando de rebase debe ser 'rebase --onto tmp bad-commit master'. Tal como está actualmente, la rebase intentaría aplicar el compromiso incorrecto al compromiso fijo que puede no tener efecto, pero que podría causar conflictos o preservar y cambios no deseados dependiendo de qué tan radical era la 'solución'. –

+0

@Charles Bailey: para estar 100% seguro, tendrías que usar tu comando. Sin embargo, generalmente no me molesto y causa un conflicto (que es fácil de resolver). – jpalecek

5

que parece:

Puede encontrar un ejemplo de rebase interactive en this comment: puede evitar la bifurcación temporal, pero de nuevo, es más complejo.

También rebase a menudo para limpiar el historial de desarrollo para que los cambios sean correctos y se agrupen correctamente.

Un ejemplo inventado:
cambio el nombre de la función foo a bar y comprometerse con un comentario que dice: "foo cambiado el nombre a la barra".
Luego paso a la siguiente característica o arreglo, y lo confirmo, y paso al siguiente.
¡A la mitad de eso, descubrí que me perdí una instancia de foo!
Integro mi trabajo en progreso (o uso git-stash), arreglo el 'foo' faltante y lo confirmo, luego uso git-rebase --interactive para unir todas las correcciones foo en una confirmación limpia.
Si no usé git-stash, entonces usaré git-commit --amend (otra forma de rebase) cuando finalmente termine la función que estaba en progreso.

Cuando reviso mis parches para revisarlos, todas las piezas son correctas y cuentan una historia coherente. Algunas veces uso git-rebase --interactive solo para hacer cambios adyacentes separados temporalmente que afectan los mismos bits, de modo que los cambios estén en contexto.

Cuestiones relacionadas