sig español git github

español - sig in github



Git: Recuperar rama eliminada(remota) (8)

  1. averiguar la identificación coimmit

    git reflog

  2. recuperar la sucursal local que eliminó por error

    git branch need-recover-branch-name commitID

  3. push need-recover-branch-name nuevamente si borró la rama remota también antes

    git push origen need-recover-branch-name

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

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

En mi sistema, (al parecer) recuperé las ramas 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 repositorio central. Por algún motivo, estas ramas se eliminaron de mi sistema local y del repositorio 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 [email protected]: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 ramas 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 ramas.

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 configuración de repositorio

user.name=Craig Walker [email protected] 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/* [email protected]: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


Creo que tienes una configuración no coincidente para ''fetch'' y ''push'', por lo que esto ha provocado que fetch fetch / push no funcione correctamente. Afortunadamente, ha buscado las ramas 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


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

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 copia de seguridad

Antes de intentar cualquier cambio, crea un archivo tar o zip simple o tu repositorio local completo. De esa forma, si no te gusta lo que sucede, puedes volver a intentarlo desde un repositorio restaurado.

Opción A: Reconfigurar como un espejo

Si tiene la intención de utilizar su repositorio 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 ramas normales toman el lugar de las ramas de seguimiento remoto habituales).

Opción B: reconfigurar como un control remoto normal

Pero dado que parece que está utilizando este repositorio remoto con varios repositorios 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 repositorio remoto. Si no te gusta lo que dice que va a hacer, recupera tu copia de seguridad (tar / zip) y prueba con la otra opción.


Los datos todavía existen en github, puede crear una nueva rama 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


No soy un experto Pero puedes intentar

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

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


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


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 rama, pero todavía tiene los compromisos disponibles para la selección selectiva.


solo dos comandos salvan mi vida

1. Esto listará 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