Pregunta Deshacer una base de datos de git


¿Alguien sabe cómo deshacer fácilmente un git rebase?

La única forma en que se me ocurre es ir manualmente:

  • git pago con el padre de compromiso a ambas ramas
  • luego crea una rama de temperatura desde allí
  • elige todas las confirmaciones a mano
  • reemplace la rama en la que fui rediseñado por la rama creada manualmente

En mi situación actual, esto va a funcionar porque puedo detectar fácilmente las confirmaciones de ambas ramas (una era mis cosas, la otra eran las de mi colega).

Sin embargo, mi enfoque me parece poco óptimo y propenso a errores (digamos que acaba de volver a trabajar con 2 de mis propias sucursales).

¿Algunas ideas?

Aclaración: estoy hablando de una rebase durante la cual se reprodujeron un montón de confirmaciones. No solo uno.


2428
2017-09-25 17:59


origen


Respuestas:


La forma más fácil sería encontrar el compromiso de la sucursal tal como estaba inmediatamente antes de que la rebase comenzara en el reflog...

git reflog

y reiniciar la rama actual (con las advertencias habituales de estar absolutamente seguro antes de reiniciar con el --hard opción).

Supongamos que el compromiso anterior era HEAD@{5} en el registro de ref:

git reset --hard HEAD@{5}

En Windows, es posible que deba citar la referencia:

git reset --hard "HEAD@{5}"

Puede verificar la historia del candidato cabeza anterior simplemente haciendo un git log HEAD@{5} (Windows:  git log "HEAD@{5}")

Si no ha desactivado por reflogs de rama, debería poder hacer git reflog branchname@{1} como una rebase separa la cabeza de la rama antes de volver a colocarla en la cabeza final. Verificaría esto dos veces, aunque no lo he verificado recientemente.

Por defecto, todos los reflogs están activados para repositorios no desnudos:

[core]
    logAllRefUpdates = true

3360
2017-09-25 19:56



En realidad, rebase guarda tu punto de partida para ORIG_HEAD así que esto es generalmente tan simple como:

git reset --hard ORIG_HEAD

sin embargo, el reset, rebase y merge todos guardan su original HEAD puntero en ORIG_HEAD entonces, si has hecho alguno de esos comandos desde la rebase que estás tratando de deshacer, entonces tendrás que usar el reflog.


1166
2018-03-28 13:24



La respuesta de Charles funciona, pero es posible que desee hacer esto:

git rebase --abort

para limpiar después de la reset.

De lo contrario, puede obtener el mensaje "Interactive rebase already started".


317
2017-07-27 18:21



Restablecer la rama al objeto de confirmación colgante de su antiguo consejo es, por supuesto, la mejor solución, ya que restaura el estado anterior sin gastar ningún esfuerzo. Pero si ha perdido esas confirmaciones (por ejemplo, porque ha recogido basura de su depósito mientras tanto, o este es un clon nuevo), siempre puede volver a establecer la base de la bifurcación. La clave de esto es la --onto cambiar.

Digamos que tienes una rama temática llamada imaginativamente topic, que te has separado master cuando la punta de master fue el 0deadbeef cometer. En algún momento mientras estaba en el topic rama, lo hiciste git rebase master. Ahora quieres deshacer esto. Así es cómo:

git rebase --onto 0deadbeef master topic

Esto tomará todas las confirmaciones en topic que no están en master y reproducirlos encima de 0deadbeef.

Con --onto, puedes reorganizar tu historial en casi cualquier forma que sea.

Que te diviertas. :-)


74
2017-09-26 02:08



De hecho, puse una etiqueta de respaldo en la rama antes de realizar cualquier operación no trivial (la mayoría de las rebases son triviales, pero lo haría si se ve complejo en algún lugar).

Entonces, restaurar es tan fácil como git reset --hard BACKUP.


61
2018-05-12 20:57



En caso Has empujado tu rama al repositorio remoto (por lo general es su origen) y luego has hecho una rebase exitosa (sin fusión) (git rebase --abort da "Sin rebase en progreso") puede fácilmente reiniciar rama utilizando mando:

git reset --hard origin / {branchName}

Ejemplo:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean

52
2017-09-28 12:43



En caso de que no haya completado la rebase y en el medio de ella, lo siguiente funciona:

git rebase --abort

48
2017-10-15 20:20