Si corro git branch -d XYZ
, ¿hay alguna forma de recuperar la rama? ¿Hay alguna manera de retroceder como si no hubiera ejecutado el comando borrar rama?
git
branch
git-branch
prosseek
fuente
fuente
Respuestas:
Sí, deberías poder hacer
git reflog
y encontrar el SHA1 para la confirmación en la punta de tu rama eliminada, luego sologit checkout [sha]
. Y una vez que esté en ese compromiso, puede simplementegit checkout -b [branchname]
recrear la rama desde allí.Gracias a @Cascabel por esta versión condensada / de una sola línea.
Puedes hacerlo en un solo paso:
fuente
git checkout -b <branch> <sha>
.<sha>
. Por ejemplo, como se mencionó anteriormente -git checkout -b <branch> <sha>
CMD+K
)git reflog --no-abbrev
para ver completo<sha>
que se abrevia por defecto.git checkout remotes/origin/deleted_branch
.La mayoría de las veces las confirmaciones inalcanzables se encuentran en el registro. Entonces, lo primero que debe intentar es mirar el reflog usando el comando
git reflog
(que muestra el reflog paraHEAD
).Quizás algo más fácil si el commit era parte de una rama específica que aún existe es usar el comando
git reflog name-of-my-branch
. Funciona también con un control remoto, por ejemplo, si forzó el empuje (consejo adicional: siempre prefiera en sugit push --force-with-lease
lugar que evite mejor los errores y sea más recuperable).Si sus commits no están en su reflog (tal vez porque lo eliminó una herramienta de terceros que no escribe en el reflog), recuperé una rama con éxito al restablecer mi rama al sha del commit encontrado usando un comando como ese ( crea un archivo con todas las confirmaciones pendientes):
Si debe usarlo más de una vez (o si desea guardarlo en algún lugar), también puede crear un alias con ese comando ...
y úsalo con
git rescue
Para investigar las confirmaciones encontradas, puede mostrar cada confirmación utilizando algunos comandos para examinarlas.
Para mostrar los metadatos de confirmación (autor, fecha de creación y mensaje de confirmación):
Para ver también las diferencias:
Una vez que haya encontrado su confirmación, cree una rama en esta confirmación con:
Para los que están bajo Windows y le gustan las GUI, puede recuperar fácilmente los commits (y también los archivos por etapas no comprometidos) con GitExtensions utilizando la función
Repository
=>Git maintenance
=>Recover lost objects...
Un comando similar para recuperar fácilmente archivos borrados eliminados: https://stackoverflow.com/a/58853981/717372
fuente
Si desea utilizar una GUI, puede realizar toda la operación con gitk.
Esto le permitirá ver el historial de confirmación de la rama como si la rama no se hubiera eliminado. Ahora simplemente haga clic derecho en la confirmación más reciente de la rama y seleccione la opción de menú
Create new branch
.fuente
La solución más votada en realidad hace más de lo solicitado:
o
moverlo a la nueva sucursal junto con todos los cambios recientes que haya olvidado confirmar. Esta puede no ser su intención, especialmente cuando está en el "modo de pánico" después de perder la rama.
Una solución más limpia (y más simple) parece ser la única (después de encontrar la
<sha>
congit reflog
):Ahora ni su rama actual ni los cambios no comprometidos se ven afectados. En cambio, solo se creará una nueva rama hasta el final
<sha>
.Si no es la punta, seguirá funcionando y obtendrá una rama más corta, entonces puede volver a intentar con un
<sha>
nombre de rama nuevo y nuevo hasta que lo haga correctamente.Finalmente, puede cambiar el nombre de la rama restaurada correctamente a lo que se llamó o cualquier otra cosa:
No es necesario decir que la clave del éxito fue encontrar el compromiso correcto
<sha>
, así que nombra tus compromisos sabiamente :)fuente
Agregando a la respuesta tfe : también está el script git-resurrect.sh en el
contrib/
área de las fuentes de Git (en el repositorio git.git), que podría ayudarlo.fuente
Usé los siguientes comandos para buscar y recuperar mi rama eliminada. Los primeros pasos son de la descripción de gcb.
Ahora busque el id de confirmación de git (GIT-SHA) en función de los comentarios de confirmación y úselo en el siguiente comando. Verifique una nueva sucursal llamada NEW-BRANCH con el GIT-SHA encontrado anteriormente:
fuente
Si no tiene un reflog, por ejemplo. debido a que está trabajando en un repositorio desnudo que no tiene habilitado el reflog y que la confirmación que desea recuperar se creó recientemente, otra opción es encontrar objetos de confirmación creados recientemente y revisarlos.
Desde el interior del
.git/objects
directorio ejecute:Esto busca todos los objetos (commits, archivos, etiquetas, etc.) creados en las últimas 12 horas y los filtra para mostrar solo commits. Verificar estos es un proceso rápido.
Sin embargo, probaría el script git-ressurect.sh mencionado en la respuesta de Jakub primero.
fuente
man find
: "-ctime n - El estado del archivo se modificó por última vez n * hace 24 horas". Entonces, también deberíamos cambiar 12 a 0.5 para tener el comportamiento esperado de las últimas 12 horas.Para usuarios de GitHub sin Git instalado:
Si desea restaurarlo desde el sitio web de GitHub , puede usar su API para obtener una lista de eventos relacionados con el repositorio:
primero
encuentra esos SHA (hashes de confirmación):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... o para repositorios privados:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(se le pedirá la contraseña de GitHub)
próximo
• Vaya a las ramas y elimine esa.
• En la misma página, sin recargar , abra DevTools, Panel de red. Ahora prepárate ...
• Haga clic en restaurar. Notará una nueva "línea". Haga clic derecho sobre él y seleccione "Copiar como cURL" y guarde este texto en algún editor.
• Añadir al final de la línea copiada de código, éste:
-H "Cookie="
.Ahora debería obtener algo como:
Último paso
PD
Me doy cuenta de que esta puede no ser la "solución más simple" o la solución "correcta", pero se ofrece en caso de que alguien lo encuentre útil.
fuente
git reflog
y, por lo tanto, fue útil, por ejemplo, cuando eliminó una rama remota y perdió el acceso a la computadora que se hizo desde entonces, por lo que no se puede obtener nada útilreflog
. Tenga en cuenta que cuando use OAuth o la autenticación de dos factores en Github, elcurl
comandocurl -u username:token https://api.github.com/user
curl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
Según tengo entendido, si otra rama puede alcanzar la rama que se va a eliminar, puede eliminarla de forma segura utilizando
y tu trabajo no se pierde. Recuerde que una rama no es una instantánea, sino un puntero a una. Entonces, cuando eliminas una rama, eliminas un puntero.
Ni siquiera perderá trabajo si elimina una rama a la que no puede llegar otra. Por supuesto, no será tan fácil como verificar el hash de confirmación, pero aún puede hacerlo. Es por eso que Git no puede eliminar una rama a la que no se puede llegar mediante el uso
-d
. En cambio tienes que usarEsto es parte de un video de Scott Chacon sobre Git. Verifique el minuto 58:00 cuando habla de ramas y cómo eliminarlas.
Introducción a Git con Scott Chacon de GitHub
fuente
reflog
son simplemente exageradas.Asegúrese de realizar todo esto localmente y confirme que su repositorio esté en el estado que desea antes de pasar a Bitbucket Cloud. También puede ser una buena idea clonar su repositorio actual y probar estas soluciones primero.
2. Para restaurar la rama, use:
Si no conoce el 'sha' de la parte superior de su cabeza, puede:
Si sus commits no están en su reflog:
2.Puede mostrar cada confirmación utilizando uno de estos:
fuente
Para recuperar una rama eliminada, primero revise el historial de reflog,
Donde n se refiere a los últimos n commits. Luego encuentre la cabeza adecuada y cree una rama con esa cabeza.
fuente
Reescribí una rama del control remoto para tratar de borrar algunas confirmaciones que no quería e iba a elegir las correctas que quería. Por supuesto, escribí mal los SHA ...
Así es como los encontré (principalmente una interfaz / interacción más fácil de las cosas en las respuestas aquí):
Primero, genere una lista de confirmaciones sueltas en su registro. Haga esto lo antes posible y deje de funcionar, ya que el basurero puede tirarlos.
Esto crea un
lost
archivo con todas las confirmaciones que tendrá que ver. Para simplificar nuestra vida, eliminemos solo el SHA:Ahora tiene un
commits
archivo con todas las confirmaciones que debe buscar.Suponiendo que está utilizando Bash, el paso final:
Esto le mostrará la información de diff y commit para cada uno de ellos. Y espera a que presiones Enter. Ahora escriba todos los que desee, y luego selecciónelos. Una vez que haya terminado, simplemente presione Ctrl-C.
fuente
GRAN SÍ
Si está utilizando GIT, siga estos sencillos pasos https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
si está usando smartgit y ya empuja esa rama para ir al origen, busque esa rama y haga clic derecho y luego finalice la compra
fuente
Primero vaya a git batch, muévase a su proyecto como:
Todos ustedes tienen una lista de los cambios y el número de referencia toma el número de referencia y luego
sale del estudio de Android o del git betcha. otra solución toma el número de referencia y ve al estudio de Android, haz clic en las ramas de git y luego haz clic en la etiqueta de pago o en la revisión más allá del número de referencia y luego jaja, tienes las ramas.
fuente
Agregando a la respuesta de tfe, puede recuperarse con este proceso mencionado, a menos que sus confirmaciones no sean basura recolectada. La rama de Git es simplemente un puntero a una confirmación particular en el árbol de confirmación. Pero si elimina el puntero y las confirmaciones en esa rama no se fusionan con otra rama existente, entonces git lo trata como confirmaciones colgantes y las elimina durante la recolección de basura, que puede ejecutarse automáticamente periódicamente.
Si su rama no se fusionó con una rama existente, y si se recolectó basura, perderá todas las confirmaciones hasta el punto desde donde se bifurcó la rama de una rama existente.
fuente
Un problema relacionado: llegué a esta página después de buscar "cómo saber qué son las ramas eliminadas".
Mientras borraba muchas ramas viejas, sentí que borré por error una de las ramas más nuevas, pero no sabía el nombre para recuperarlo.
Para saber qué ramas se eliminaron recientemente, haga lo siguiente:
Si vas a tu URL de Git, que se verá así:
Luego puede ver el feed, de lo que se elimina, por quién, en el pasado reciente.
fuente
Hice esto en la computadora que eliminé la rama:
git reflog
respuesta:
y recupero la rama con este comando:
git checkout -b newBranchName 74b2383
fuente
Simplemente usando
git reflog
no me devolvió elsha
. Solo elcommit id
(que tiene 8 caracteres de largo y un sha es mucho más largo)Entonces solía
git reflog --no-abbrev
Y luego haga lo mismo que se mencionó anteriormente:
git checkout -b <branch> <sha>
fuente
SI está utilizando VSCode ... y sincronizó su rama con el servidor en algún momento antes de eliminarlo ...
Tenga en cuenta que git branch delete solo elimina la copia local, no la copia en el servidor. Primero, en el panel de Git (icono de git en la barra de herramientas izquierda), mire a través de las ramas y vea si su rama todavía está allí debajo de "origin / your_branch_name". Si es así, simplemente seleccione eso y debería recuperar su código (sugiera que copie / pegue / guarde inmediatamente en otro lugar).
Si no vio un "origin / your_branch_name", instale la extensión GitLens. Esto le permite hurgar visualmente en los repositorios del servidor y ubicar la copia que sincronizó con el servidor. Si tiene múltiples repositorios, tenga en cuenta que puede ser necesario tener al menos un archivo abierto desde el repositorio deseado para que el repositorio aparezca en GitLens. Entonces:
Abra el panel de GitLens
Expande el repositorio
Debería ver una lista de categorías: Sucursales / Colaboradores / Controles remotos / Alijos / etc.
Debería encontrar YourLostTreasure en "Ramas" o posiblemente en "Controles remotos -> Orígenes". Con suerte, verá una rama con el nombre deseado; si la expande, debería ver los archivos que cambió en esa rama. Haga doble clic en los nombres de los archivos para abrirlos e inmediatamente haga una copia de seguridad de ese código.
Si no ve de inmediato su rama perdida, mire y si encuentra algo prometedor, ábralo inmediatamente y tome el código. Tuve que hurgar un poco hasta que encontré TheGoldenBranch, e incluso entonces al código le faltaban los últimos uno o dos guardados (posiblemente porque no pude sincronizar con el servidor antes de intentar -un-Branch-Merge-pero-accidentalmente-haciendo clic- Branch-Delete). Mi búsqueda se prolongó innecesariamente porque cuando encontré la rama por primera vez, no estaba completamente seguro de que el nombre fuera correcto, así que seguí buscando y me llevó algo de tiempo volver a encontrar esa primera rama. (Por lo tanto, Carpe Carpum y luego seguir buscando).
fuente