Récupérer des fichiers et des validations depuis «aucune branche» dans git

11

J'ai commencé à travailler sur certains fichiers que j'avais dans un sous-module git dans le cadre d'un autre projet. Cependant, comme il s'agissait d'un sous-module git, il n'a jamais extrait "master" et a simplement extrait la tête et placé tous les fichiers dans le dossier "no branch".

Maintenant que j'ai apporté des modifications par accident à ces fichiers, je viens de réaliser que je travaillais dans un sous-module "sans branche" de mon projet.

Comment puis-je obtenir ces fichiers dans une branche (comme maître) afin de pouvoir les sauver?

Xeoncross
la source

Réponses:

28

Vous pouvez utiliser git reflogpour trouver les commits "perdus":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
mipadi
la source
Oui, cela a très bien fonctionné! sauf que je l'ai fait une git merge $COMMIT_SHAfois que j'étais dans l'autre branche.
Xeoncross
3

L'état «sans branche» est appelé HEAD détaché. Il est appelé ainsi car la référence HEAD n'est attachée à aucune branche, mais pointe directement sur une validation. Pour attacher HEAD à une branche qui pointe vers la validation HEAD actuelle, utilisez git checkout -b branchname.

Vous pouvez mettre à jour en toute sécurité une branche existante pour inclure les validations dans HEAD avec cette séquence:

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

Ou, de manière équivalente, en utilisant la notation reflog HEAD@{1}pour éviter d'avoir à créer la branche temporaire:

git checkout branchname
git merge HEAD@{1}

Utiliser la branche temporaire serait une bonne idée si vous n'alliez pas faire la fusion immédiatement.

Si vous souhaitez écraser de force une branche existante pour pointer vers la validation sur HEAD, vous pouvez l'utiliser git branch -f branchname && git checkout branchname. Si la validation sur HEAD n'est pas basée sur la pointe actuelle du nom de la branche, cela entraînera une modification non rapide vers le nom de la branche que vous souhaitez généralement éviter (elle est considérée comme un historique de réécriture).

Chris Johnsen
la source
Notez que cette réponse suppose que le HEAD pointe toujours vers le dernier commit-that-was-not-on-a-branch. Si vous avez déplacé la TÊTE depuis lors et que vous ne vous êtes rendu compte que de ce qui s'est passé, vous devrez peut-être rechercher ce commit perdu dans le reflog (voir la réponse de mipadi).
LarsH
1

Pour ajouter aux réponses précédentes:

Pendant que vous êtes toujours sur une tête détachée, vous pouvez ajouter une balise:

git tag <some-tag>

Cela ajoutera une balise au commit, ce qui la rendra visible dans gitket dans d' autres outils.

Les données
la source