Archivos borrados accidentalmente durante la rebase de git. ¿Puedo rehacerlo?

Hice git rebase origin/master en mi proyecto para ponerme en path con el upstream.

Borré algunos files durante la resolución del conflicto (no en el último commit) ya que pensé que no los necesitaría en mi twig. Pero los necesito

Pude pagar en la parte superior en otro lugar, copyr esos files en mi repository y crear una confirmación diciendo "lo siento", pero eso no es nada agradable. Prefiero "deshacer" la eliminación.

Intenté ejecutar git rebase -i <parent of the deleting commit> acuerdo con esta respuesta y marcar la confirmación de eliminación con e para editar. Pero no veo ningún file en escena. Todo lo que puedo hacer es modificar la confirmación y eso solo me permite editar el post de confirmación, por lo que sé.

Entonces, ¿cómo puedo deshacer la eliminación en mi última confirmación?


Para simplificar y completar, agregaré el set de commands que utilicé:

 git rebase -i <parent_of_the_wrong_commit> # mark e next to the deleting commit and copy its hash git reset HEAD^ git checkout -- the/accidentally/deleted/directory git add . git commit -c <the_copied_hash> git rebase --continue 

Todo lo que puedo hacer es modificar el compromiso y eso solo me permite editar el post de compromiso, por lo que sé.

No es verdad. Cuando edite un compromiso como ese, puede hacer cualquier cosa que normalmente haría.

Para solucionar su problema, hay dos mejores methods que conozco

1. Anule todo e intente de nuevo

Usa git reflog para encontrar los commit (s) que conociste antes de la rebase. luego use git reset --hard <commit> para reparar el master y vuelva a intentarlo.

2. Arregle la rebase como está

Como describió antes, puede corregir la rebase con la bandera interactiva.

Cuando se abandona en la línea de command para la confirmación interrumpida, tome nota de la identificación de confirmación (copie al portapapeles).

A continuación, git reset HEAD^ que deshará el commit roto y colocará esos cambios en su directory de trabajo.

Ahora git add --patch solo los cambios que deseas ( git add --patch ).

Realice una confirmación con los cambios en etapas con:

  • git commit – nueva confirmación con un nuevo post
  • git commit -c <commit from before> – commit nuevo con el mismo post que antes (desde el portapapeles)

Luego borre los malos cambios que todavía están en su directory de trabajo con el git checkout -- .

Con eso estás listo para terminar la rebase con git rebase --continue .

Buena suerte

También vale la pena señalar la posibilidad de que los cambios en sus compromisos no fueran muy atómicos. Si las eliminaciones fueron separadas de otros cambios, esto hubiera sido una simple cuestión de descartar la confirmación del error durante una rebase interactiva.

El rebasamiento interactivo con la estrofa de edición tal como lo hizo fue exactamente correcto, simplemente está confundido acerca de la modificación del compromiso. Si agrega cambios al índice ( git add ... ) y hace un git commit --amend -C HEAD , el estado actual del índice reemplaza el estado de la confirmación tal como estaba antes, lo que significa que puede agregar cambios adicionales o deshacer cambios a la última confirmación. ( -C HEAD toma el post de confirmación de HEAD commit, por lo que se modifica, sin la necesidad o la capacidad de editarlo)