español - sig in github
Git: Recuperar rama eliminada(remota) (8)
- averiguar la identificación coimmit
git reflog
- recuperar la sucursal local que eliminó por error
git branch need-recover-branch-name commitID
- 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