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?
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?
Respuestas:
Sí, deberías poder hacer git reflog
y encontrar el SHA1 para la confirmación en la punta de tu rama eliminada, luego solo git checkout [sha]
. Y una vez que esté en ese compromiso, puede simplemente git 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:
git checkout -b <branch> <sha>
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 para HEAD
).
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 su git 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):
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
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 ...
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
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):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Para ver también las diferencias:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Una vez que haya encontrado su confirmación, cree una rama en esta confirmación con:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
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
Si desea utilizar una GUI, puede realizar toda la operación con gitk.
gitk --reflog
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
.
La solución más votada en realidad hace más de lo solicitado:
git checkout <sha>
git checkout -b <branch>
o
git checkout -b <branch> <sha>
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>
con git reflog
):
git branch <branch> <sha>
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:
git branch -m <restored branch> <final branch>
No es necesario decir que la clave del éxito fue encontrar el compromiso correcto <sha>
, así que nombra tus compromisos sabiamente :)
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.
git-resurrect <name>
intenta encontrar rastros de una punta de rama llamada<name>
e intenta resucitarla. Actualmente, se busca en el registro de registro los mensajes de pago y-r
también se combinan los mensajes. Con-m
y-t
, el historial de todas las referencias se escanea paraMerge <name> into other
/Merge <other> into <name>
(respectivamente) comprometer temas, lo cual es bastante lento pero le permite resucitar las ramas de temas de otras personas.
Usé los siguientes comandos para buscar y recuperar mi rama eliminada. Los primeros pasos son de la descripción de gcb.
$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\ -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline
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:
$ git checkout -b NEW-BRANCH GIT-SHA
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:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
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.
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:
curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
Ú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.
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 útil reflog
. Tenga en cuenta que cuando use OAuth o la autenticación de dos factores en Github, el curl
comando curl -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
git branch -d [branch]
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 usar
git branch -D [branch]
Esto es parte de un video de Scott Chacon sobre Git. Verifique el minuto 58:00 cuando habla de ramas y cómo eliminarlas.
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.
Deleted branch <your-branch> (was <sha>)
2. Para restaurar la rama, use:
git checkout -b <branch> <sha>
Si no conoce el 'sha' de la parte superior de su cabeza, puede:
git reflog
git checkout -b <branch> <sha>
Si sus commits no están en su reflog:
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
2.Puede mostrar cada confirmación utilizando uno de estos:
git log -p <commit>
git cat-file -p <commit>
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.
git fsck --full --no-reflogs --unreachable --lost-found > lost
Esto crea un lost
archivo con todas las confirmaciones que tendrá que ver. Para simplificar nuestra vida, eliminemos solo el SHA:
cat lost | cut -d\ -f3 > commits
Ahora tiene un commits
archivo con todas las confirmaciones que debe buscar.
Suponiendo que está utilizando Bash, el paso final:
for c in `cat commits`; do git show $c; read; done
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.
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
Primero vaya a git batch, muévase a su proyecto como:
cd android studio project
cd Myproject
then type :
git reflog
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.
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.
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í:
https://your-website-name/orgs/your-org-name/dashboard
Luego puede ver el feed, de lo que se elimina, por quién, en el pasado reciente.
Hice esto en la computadora que eliminé la rama:
git reflog
respuesta:
74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git
y recupero la rama con este comando:
git checkout -b newBranchName 74b2383
Simplemente usando git reflog
no me devolvió el sha
. Solo el commit 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>
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).