Git: Recuperar twig eliminada (remota)

Necesito recuperar dos twigs de Git que de alguna manera borré durante un empujón.

Estas dos twigs se crearon en un sistema diferente y luego se enviaron a mi repository "compartido" (github).

En mi sistema, (al parecer) recuperé las twigs durante una recuperación:

~/myfolder> git fetch remote: Counting objects: 105, done. remote: Compressing objects: 100% (58/58), done. remote: Total 62 (delta 29), reused 0 (delta 0) Unpacking objects: 100% (62/62), done. From github.com:mygiturl * [new branch] contact_page -> origin/contact_page 731d1bb..e8b68cc homepage -> origin/homepage * [new branch] new_pictures -> origin/new_pictures 

Inmediatamente después hice un esfuerzo para enviar mis cambios locales al repository central. Por algún motivo, estas twigs se eliminaron de mi sistema local y del repository central:

 ~/myfolder> git push Counting objects: 71, done. Delta compression using up to 2 threads. Compressing objects: 100% (43/43), done. Writing objects: 100% (49/49), 4.99 KiB, done. Total 49 (delta 33), reused 0 (delta 0) To git@github.com:mygiturl.git - [deleted] contact_page + e8b68cc...731d1bb homepage -> homepage (forced update) bb7e9f2..e0d061c master -> master - [deleted] new_pictures e38ac2e..bb7e9f2 origin/HEAD -> origin/HEAD 731d1bb..e8b68cc origin/homepage -> origin/homepage e38ac2e..bb7e9f2 origin/master -> origin/master * [new branch] origin/contact_page -> origin/contact_page * [new branch] origin/new_pictures -> origin/new_pictures 

No es terriblemente fácil quitar las twigs de la máquina de su lugar de nacimiento, así que me gustaría tratar de recuperarlas de mi local si es posible.

Toda la información de "deshacer" git que he buscado en google tiene que ver con la recuperación de commits perdidos. No creo que se aplique aquí, ya que no tengo UID de compromiso para estas twigs.

Me gustaría saber cómo puedo recuperarlos. También me gustaría saber cómo fueron borrados en primer lugar y cómo puedo evitar esto en el futuro.

EDITAR: a pedido, aquí está mi configuration de repository

 user.name=Craig Walker user.email=github@softcraft.ca alias.unadd=reset HEAD core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true core.ignorecase=true remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* remote.origin.url=git@github.com:MyGitURL.git remote.origin.mirror=true branch.master.remote=origin branch.master.merge=refs/heads/master alias.undo=reset --hard alias.test=push -f ci HEAD:master alias.st=status alias.ci=commit alias.br=branch alias.co=checkout alias.ch=checkout alias.df=diff alias.lg=log -p alias.who=shortlog -s -- remote.ci.url=ContinuousIntegrationGitURL remote.ci.fetch=+refs/heads/*:refs/remotes/ci/* branch.photo.remote=origin branch.photo.merge=refs/heads/photos remote.foo.url=FooGitURL remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/* branch.homepage.remote=origin branch.homepage.merge=refs/heads/homepage 

No soy un experto Pero puedes intentar

 git fsck --full --no-reflogs | grep commit 

para encontrar el compromiso HEAD de la twig eliminada y recuperarlos.

Las twigs eliminadas no se pierden, se copyron en origen / página_contacto y origen / nuevas_picturas "twigs de seguimiento remoto" por la búsqueda que mostró (también fueron empujadas hacia atrás por el empuje que mostró, pero fueron empujadas hacia refs / controles remotos / origen / en lugar de references / cabezas /). Comtesting git log origin/contact_page y git log origin/new_pictures para ver si tus copys locales están "actualizadas" con lo que creas que debería estar allí. Si se aplicaron nuevas confirmaciones a esas twigs (de algún otro repository) entre la extracción y la inserción que mostró, es posible que las haya "perdido" (pero probablemente podría encontrarlas en el otro repository que más recientemente presionó esas twigs) .

Fetch / Push Conflict

Parece que está buscando en un 'modo remoto' normal (los refs / heads remotos se almacenan localmente en refs / remotes / origin /), pero presionando en 'mirror mode' (los refs locales / son empujados a refs remotos /) . Verifique su .git / config y concilie las configuraciones remote.origin.fetch y remote.origin.push .

Hacer una copy de security

Antes de intentar cualquier cambio, crea un file tar o zip simple o tu repository local completo. De esa manera, si no te gusta lo que sucede, puedes intentar nuevamente desde un repository restaurado.

Opción A: Reconfigurar como un espejo

Si tiene la intención de utilizar su repository remoto como un espejo del suyo local, haga esto:

 git branch contact_page origin/contact_page && git branch new_pictures origin/new_pictures && git config remote.origin.fetch '+refs/*:refs/*' && git config --unset remote.origin.push && git config remote.origin.mirror true 

También es posible que desee eliminar todos sus refs / remotes / origin / refs, ya que no son útiles si está operando en modo espejo (sus twigs normales toman el lugar de las twigs de seguimiento remoto habituales).

Opción B: reconfigurar como un control remoto normal

Pero dado que parece que está utilizando este repository remoto con varios repositorys de "trabajo", probablemente no quiera usar el modo espejo. Puede intentar esto:

 git config push.default tracking && git config --unset remote.origin.push git config --unset remote.origin.mirror 

Luego, eventualmente querrá eliminar los refs / remotos / refs de origen falsos en su repo remoto: git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures …

Prueba de empuje

Pruebe git push --dry-run para ver qué haría git push sin tener que hacer ningún cambio en el repository remoto. Si no te gusta lo que dice que va a hacer, recupera tu copy de security (tar / zip) y testing con la otra opción.

solo dos commands salvan mi vida

1. Esto listrá todos los HEAD anteriores

 git reflog 

2. Esto revertirá la CABEZA para confirmar que has eliminado.

 git reset --hard <your deleted commit> ex. git reset --hard b4b2c02 

Los datos todavía existen en github, puede crear una nueva twig a partir de los datos anteriores:

 git checkout origin/BranchName #get a readonly pointer to the old branch git checkout –b BranchName #create a new branch from the old git push origin BranchName #publish the new branch 

Creo que tienes una configuration no coincidente para 'fetch' y 'push', por lo que esto ha provocado que fetch fetch / push no funcione correctamente. Afortunadamente, ha buscado las twigs que posteriormente eliminó, por lo que debería poder recrearlas con un impulso explícito.

 git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures 

Si su organización utiliza JIRA u otro sistema similar que esté vinculado a git, puede encontrar los commits detallados en el ticket y hacer clic en los enlaces a los cambios del código. Github elimina la twig, pero todavía tiene los compromisos disponibles para la selección selectiva.

Puede parecer demasiado cauteloso, pero con frecuencia cierro una copy de lo que he estado trabajando antes de hacer cambios en el control de código fuente. En un proyecto de Gitlab en el que estoy trabajando, recientemente eliminé una twig remota por error que quería conservar después de fusionar una request de fusión. Resultó que todo lo que tenía que hacer para recuperarlo con el historial de compromisos era presionar de nuevo. La request de fusión aún fue rastreada por Gitlab, por lo que todavía muestra la label azul 'fusionada' a la derecha de la sucursal. Todavía comprimí mi carpeta local en caso de que sucediera algo malo.