Rescatando archivos y confirmando desde "no branch" en git

10

Comencé a trabajar en algunos archivos que tenía en un submódulo de git en otro proyecto. Sin embargo, como era un submódulo de git, nunca se desprendió de "master" y, en cambio, solo se revisó el encabezado y se colocaron todos los archivos de la carpeta en "no branch".

Ahora que hice algunos cambios por accidente en estos archivos, me di cuenta de que estaba trabajando en un "no rama", submódulo de mi proyecto.

¿Cómo puedo obtener esos archivos en una rama (como maestro) para poder rescatarlos?

Xeoncross
fuente

Respuestas:

24

Puedes usar git reflog para encontrar los compromisos "perdidos":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
mipadi
fuente
Sí, esto funcionó muy bien! excepto que hice un git merge $COMMIT_SHA Una vez estuve en la otra rama.
Xeoncross
3

El estado de "no rama" se llama una CABEZA separada. Se llama así porque la referencia HEAD no está adjunta a ninguna rama, sino que apunta directamente a un compromiso. Para adjuntar HEAD a una rama que apunta a la confirmación HEAD actual, use git checkout -b branchname.

Puede actualizar de forma segura una rama existente para incluir las confirmaciones en HEAD con esta secuencia:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

O, equivalentemente, usando la notación de reflog. HEAD@{1} Para evitar tener que realizar la rama temporal:

git checkout branchname
git merge HEAD@{1}

Usar la rama temporal sería una buena idea si no fuera a hacer la fusión inmediatamente.

Si desea sobrescribir por la fuerza una rama existente para que apunte a la confirmación en HEAD, puede usar git branch -f branchname && git checkout branchname. Si el commit en HEAD no está basado en la punta actual de nombre de rama esto resultará en un cambio de no avance rápido a nombre de rama que normalmente quieres evitar (se ve como un historial de reescritura).

Chris Johnsen
fuente
Tenga en cuenta que esta respuesta asume que HEAD sigue apuntando al último commit-that-was-not-on-a-a-branch. Si ha movido la CABEZA desde entonces y solo ahora se ha dado cuenta de lo que sucedió, es posible que deba buscar esa confirmación perdida en el reflog (consulte la respuesta de mipadi).
LarsH
1

Para añadir a respuestas anteriores:

Mientras aún estás en una HEAD separada, puedes agregar una etiqueta:

git tag <some-tag>

Esto agregará un etiqueta al commit, que lo hará visible en gitk y otras herramientas.

data
fuente