stash - ignorar cambios git
¿Puedo recuperar una rama después de su eliminación en Git? (15)
Agregando a tfe answer : también está el script git-resurrect.sh en el contrib/
area de las fuentes Git (en el repositorio git.git), lo 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 reflog los mensajes de pago y con-r
también se fusionan los mensajes. Con-m
y-t
, el historial de todos los refs se analiza en busca deMerge <name> into other
/Merge <other> into <name>
(respectivamente) asigna los temas, lo cual es bastante lento pero le permite resucitar las ramas de temas de otras personas.
Si ejecuto git branch -d XYZ
, ¿hay alguna forma de recuperar la rama? ¿Hay alguna forma de volver atrás como si no ejecutara el comando eliminar rama?
Agregando a la respuesta de tfe, puede recuperarse con este proceso mencionado, a menos que sus confirmaciones no sean recolectadas como basura. La rama 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 otras existentes, entonces git lo trata como confirmaciones colgantes y las elimina durante la recolección de basura, que puede ejecutarse automáticamente de forma periódica.
Si su rama no se fusionó con una rama existente, y si se recolectó la basura, perderá todas las confirmaciones hasta el punto desde donde se bifurcó la rama desde una rama existente.
Asegúrese de realizar todo esto localmente y confirme que su repo 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.
Si acaba de eliminar la rama, verá algo como esto en su terminal:
Rama eliminada (era)
2. Para restaurar la rama, use:
git checkout -b
Si no conoce el ''sha'' de la parte superior de su cabeza, puede:
Encuentre el ''sha'' para la confirmación en la punta de su rama eliminada usando:
git reflog
Para restaurar la rama, usa:
git checkout -b
Si tus compromisos no están en tu reflog:
Puedes intentar recuperar una rama restableciendo tu rama al sha de la confirmación encontrada usando un comando como:
git fsck --full --no-reflogs - inalcanzable --los últimos encontrados | grep commit | corte -d / -f3 | xargs -n 1 git log -n 1 --pretty = oneline> .git / lost-found.txt
2. Luego puede mostrar cada confirmación usando uno de estos:
git log -p git cat-file -p
La mayoría de las veces los compromisos inalcanzables están en el reflog. 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 la confirmación era parte de una rama específica que aún existe es usar el comando git reflog name-of-my-branch
. También funciona con un control remoto, por ejemplo, si forzaste el empuje.
Si sus confirmaciones no están en su reflog (tal vez porque se eliminó por una herramienta de terceros que no escribe en el reflog), recuperé exitosamente una rama al restablecer mi rama a la sha de la confirmación encontrada usando un comando como ese crea un archivo con todas las confirmaciones colgantes):
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 lo usara más de una vez (o quisiera guardarlo en algún lugar), también podría 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 git rescue
con git rescue
Para investigar las confirmaciones encontradas, puede mostrar cada confirmación utilizando algunos comandos para examinarlos.
Para visualizar 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
La mejor solución votada en realidad hace más de lo solicitado:
git checkout <sha>
git checkout -b <branch>
o
git checkout -b <branch> <sha>
muévalo a la nueva rama junto con todos los cambios recientes que podría haber olvidado confirmar. Puede que esta no sea 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 de una sola línea (después de encontrar el <sha>
con git reflog
):
git branch <branch> <sha>
Ahora ni su rama actual ni los cambios no comprometidos se ven afectados. En su lugar, solo se creará una nueva rama hasta el <sha>
.
Si no es la sugerencia, seguirá funcionando y obtendrá una rama más corta, luego puede volver a intentarlo con el nuevo <sha>
y el nuevo nombre de la rama hasta que lo haga correctamente.
Finalmente, puede cambiar el nombre de la rama restaurada con éxito a lo que se llamó o cualquier otra cosa:
git branch -m <restored branch> <final branch>
No hace falta decir que la clave del éxito fue encontrar el compromiso correcto <sha>
, así que nombre sus compromisos sabiamente :)
Para recuperar una rama eliminada, primero vaya a través del historial de reflog,
git reflog -n 60
Donde n se refiere a las últimas n confirmaciones. Luego encuentra la cabeza adecuada y crea una rama con esa cabeza.
git branch testbranch HEAD@{30}
Primero ve a git batch el movimiento a tu proyecto como:
cd android studio project
cd Myproject
then type :
git reflog
Todos tienen una lista de los cambios y el número de referencia toma el número de referencia y luego el pago.
de Android Studio o del git betcha. otra solución toma el número de referencia y ve a android studio, haz clic en las ramas de git hacia abajo, luego haz clic en la etiqueta de verificación o en la revisión, pasa el número de referencia y luego lol tienes las sucursales.
Reubicé una sucursal desde el control remoto para intentar borrar algunas confirmaciones que no quería e iba a seleccionar las correctas que quería. Por supuesto escribí mal los SHA ...
Aquí es cómo 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 tan pronto como sea posible y deje de trabajar, ya que el recolector de basura puede descargarlos.
git fsck --full --no-reflogs --unreachable --lost-found > lost
Esto crea un archivo lost
con todas las confirmaciones que tendrá que mirar. Para simplificar nuestra vida, recortemos solo la SHA de ella:
cat lost | cut -d/ -f3 > commits
Ahora tienes un archivo de commits
con todas las confirmaciones que debes 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 pulses Enter . Ahora escriba todos los que desee y luego cójalos. Después de que haya terminado, simplemente presione Ctrl-C.
Sí, debería poder hacer git reflog
y encontrar el SHA1 para la confirmación en la punta de su rama eliminada, luego solo git checkout [sha]
. Y una vez que esté en ese compromiso, puede simplemente git checkout -b [branchname]
para recrear la rama desde allí.
Según tengo entendido, si otra rama puede acceder a 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 borras una rama, borras un puntero.
Ni siquiera perderá el trabajo si elimina una rama a la que no puede acceder otra. Por supuesto, no será tan fácil como revisar 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 acceder utilizando -d
. En su lugar tienes que usar
git branch -D [branch]
Esto es parte de un video obligatorio de Scott Chacon sobre Git. Verifique el minuto 58:00 cuando él habla sobre las sucursales y cómo eliminarlas.
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 con el botón derecho en la confirmación más reciente de la rama y seleccione la opción de menú Create new branch
.
Si no tienes un reflog, por ejemplo. Debido a que está trabajando en un repositorio simple que no tiene el reflog habilitado y la confirmación que desea recuperar se creó recientemente, otra opción es encontrar objetos de confirmación creados recientemente y revisarlos.
Desde dentro del directorio .git/objects
ejecute:
find . -ctime -12h -type f | sed ''s/[./]//g'' | git cat-file --batch-check | grep commit
Esto encuentra todos los objetos (confirmaciones, archivos, etiquetas, etc.) creados en las últimas 12 horas y los filtra para mostrar solo confirmaciones. La comprobación de estos es entonces un proceso rápido.
Sin embargo, probaría el script git-ressurect.sh mencionado en la respuesta de Jakub .
Un problema relacionado: llegué a esta página después de buscar "cómo saber qué son las ramas eliminadas".
Mientras eliminaba muchas ramas antiguas, sentí que erróneamente eliminé una de las ramas más nuevas, pero no sabía el nombre para recuperarla.
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.
Utilicé los siguientes comandos para encontrar 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) basado en los comentarios de confirmación y utilícelo en el siguiente comando. Verifique una nueva sucursal llamada NEW-BRANCH con el GIT-SHA encontrado anteriormente:
$ git checkout -b NEW-BRANCH GIT-SHA
Para usuarios de GitHub sin Git instalado:
Si desea restaurarlo desde el sitio web de GitHub , puede hackear su sitio web;)
• En primer lugar, encuentre esos SHA (cometer hashes):
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)
• Luego, vaya a GitHub y cree una nueva rama temporal que se eliminará para siempre ( Chrome es preferible).
• Ir a las sucursales y eliminar esa.
• En la misma página, sin volver a cargar , abra DevTools, Panel de red. Ahora prepara ...
• Haga clic en restaurar. Notarás una nueva "línea". Haga clic derecho en él y seleccione "Copiar como cURL" y guarde este texto en algún editor.
• Agregue al final de la línea de código copiada, esta: -H "Cookie="
.
Deberías obtener ahora algo así:
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
• Paso final: reemplace "BranchSHA" con su hash SHA y BranchName con el nombre deseado (por cierto, es un gran truco cambiar el nombre de rama desde la web). Si no fuiste demasiado lento, debes hacer esta solicitud de todos modos. Por ejemplo, simplemente copiar y pegar en un terminal.
PD
Lo sé, no es una solución muy simple o correcta, pero en caso de que alguien, sin una contraseña de root y una máquina virtual, durante el hackathon tenga que hacer algo así de raro ... Es totalmente real, así que gracias por tomarse su tiempo. y buena suerte :)
ACTUALIZAR
Ahaha, estoy tan emocionada por el hecho de que alguien en la World Wide Web encontró mi respuesta y, en realidad, después de leerla, me pareció graciosa o útil, y mi respuesta tan alucinante, demente y tan incorrecta en la práctica :) Es un mundo maravilloso Alrededor y nosotros, programadores y programadores, somos una de las partes más locas de esto. <3