Salvataggio di file e commit da "no branch" in git


11

Ho iniziato a lavorare su alcuni file che avevo in un sottomodulo git con un altro progetto. Tuttavia, poiché si trattava di un sottomodulo git, non ha mai estratto "master" e invece ha semplicemente verificato la testa e inserito tutti i file nella cartella in "nessun ramo".

Ora che ho apportato alcune modifiche per caso a questi file, mi sono appena reso conto che stavo lavorando in un "no branch", sottomodulo del mio progetto.

Come posso ottenere quei file in un ramo (come master) in modo da poterli salvare?

Risposte:


28

Puoi usare git reflogper trovare i commit "persi":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

Sì, ha funzionato alla grande! tranne che una git merge $COMMIT_SHAvolta ero nell'altro ramo.
Xeoncross

3

Lo stato "no branch" è chiamato HEAD distaccato. Si chiama così perché il riferimento HEAD non è associato a nessun ramo, ma punta direttamente a un commit. Per collegare HEAD a un ramo che punta al commit HEAD corrente, utilizzare git checkout -b branchname.

Puoi aggiornare in modo sicuro una filiale esistente per includere i commit su HEAD con questa sequenza:

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

O, equivalentemente, usando la notazione reflog HEAD@{1}per evitare di dover creare il ramo temporaneo:

git checkout branchname
git merge HEAD@{1}

L'uso del ramo temporaneo sarebbe una buona idea se non avessi intenzione di eseguire immediatamente l'unione.

Se si desidera sovrascrivere forzatamente un ramo esistente per puntare al commit su HEAD, è possibile utilizzare git branch -f branchname && git checkout branchname. Se il commit su HEAD non si basa sull'attuale punta del nome del ramo, ciò comporterà una modifica non rapida al nome del ramo che di solito si desidera evitare (viene visto come cronologia della riscrittura).


Si noti che questa risposta presuppone che HEAD stia ancora puntando all'ultimo commit che non era su un ramo. Se da allora hai spostato HEAD e solo ora ti sei reso conto di quello che è successo, potresti dover cercare quel commit perso nel reflog (vedi la risposta di mipadi).
LarsH

1

Per aggiungere alle risposte precedenti:

Mentre sei ancora su una HEAD staccata, puoi aggiungere un tag:

git tag <some-tag>

Ciò aggiungerà un tag al commit, che lo renderà visibile in gitke altri strumenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.