GIT ripristina l'ultima HEAD staccata


87

Per favore, ho un grosso problema nel mio progetto: questo è lo scenario. Ho un progetto xcode in GIT. Oggi mi sono reso conto che l'ultimo commit ha rotto alcuni test, quindi ho controllato il commit precedente. Ho usato SourceTree e questo è l'avvertimento

In questo modo la tua copia di lavoro diventerà una "HEAD staccata", il che significa che non sarai più su un ramo. Se vuoi eseguire il commit dopo questo, probabilmente vorrai controllare di nuovo un ramo o crearne uno nuovo. Va bene?

Ho lavorato per un'intera giornata e alla fine ho impegnato tutto. Quindi avevo bisogno di unire il mio lavoro sul ramo di sviluppo, quindi controllo il ramo di sviluppo e ... il mio lavoro è sparito all'istante :(

So che è stato sbagliato staccare la mia HEAD e Sourcetree mi ha avvertito ... ma c'è un modo per ripristinare il mio lavoro?


Un thread correlato per lo stesso problema qui e gli aspetti tecnici su come accade qui .
RBT

Risposte:


259

Se digiti git reflog, ti mostrerà la cronologia delle revisioni HEADpuntate. La tua testa distaccata dovrebbe essere lì dentro. Una volta trovato, fai git checkout -b my-new-branch abc123o git branch my-new-branch abc123(dov'è abc123lo SHA-1 della TESTA staccata) per creare un nuovo ramo che punti alla tua testa staccata. Ora puoi unire quel ramo a tuo piacimento.

Generalmente, se controlli un ramo dopo aver lavorato su una testa staccata, Git dovrebbe dirti il ​​commit dalla testa staccata su cui eri stato, in modo che tu possa ripristinarlo se necessario. Non ho mai usato SourceTree, quindi non so se trasmette quel messaggio. Ma se ha mostrato quel messaggio, allora dovresti essere in grado di usarlo per trovare il commit e di nuovo usare git checkout -bo git branchper creare un ramo da quel commit.


5
Grazie Brian. Mi hai salvato la giornata.
Muzammil

Brian, mi hai salvato la vita! Grazie!!
cldrr

Sono nuovo in git .. ottengo fatal: A branch named 'mybranch' already exists.Come aggiungere un ramo esistente?
Ramesh Murugesan,

1
Come PSA per tutti coloro che ringraziano Brian: se stai facendo un lavoro che non vuoi perdere, spostalo su un telecomando (es. Github) ogni poche ore. Quando una meteora cade sul tuo computer, sarai contento di averlo fatto. Se non sei ancora pronto per condividerlo con i collaboratori, mettilo in un ramo che nessuno conosce per ora e poi ribasalo in master in seguito.
MatrixManAtYrService

1
Inoltre, se si tratta di un singolo commit perso che è appena svanito e l'hai trovato lì, puoi riportarlo con git cherry-pick e5b2f7b, dov'è e5b2f7blo SHA-1 del commit lì.
Aidin

10

In Sourcetree, puoi farlo utilizzando la GUI.

Per prima cosa trova il commit "perso" cercando un messaggio nella cronologia dei comandi (vista: Mostra output del comando). Probabilmente sarà nel comando "Switching Branch" dopo il commit che hai perso. In quel messaggio, si spera che vedrai il commento di commit con un ID di commit 1234567.

Porta quell'ID commit al passaggio successivo.

Premi il pulsante "Branch" nella barra degli strumenti in alto e dovresti ottenere una finestra di dialogo "New Branch" dove puoi specificare un certo commit. Metti quell'ID di commit lì, specifica un nuovo nome di ramo, premi Crea ramo e dovresti ottenere un nuovo ramo con il tuo commit perso!

inserisci qui la descrizione dell'immagine


funziona davvero. Assicurati di vedere il commento corretto con l'ID commit.
Hammad Khan

@blalond Ciao, dopo aver letto la tua risposta, ho una piccola domanda: quando in SourceTree faccio doppio clic su un commit precedente (per verificarlo) ricevo lo stesso messaggio che ciò causerebbe una testa distaccata, quindi mi chiedo cosa significa quando le persone dicono che puoi semplicemente tornare a qualsiasi revisione precedente con git? Come posso tornare a un commit particolare, quindi? Grazie

5

Se non vuoi mantenere le modifiche di HEAD scollegato e vuoi andare all'ultimo branch commit usa direttamente il comando sottostante.

git checkout - 

Nota: cancellerò tutte le modifiche nella HEAD scollegata.


L'OP ha chiesto di mantenere il proprio lavoro. Questo non risponde alla domanda originale. La semplice aggiunta dell'opzione per mantenerla in un ramo renderebbe utile questa risposta.
manuelvigarcia

1

Un mio collega ha appena avuto questa situazione. Nel suo caso, c'erano commit in testa distaccata - lavorano in R-Studio - e lo strumento li ha avvertiti che potevano creare il ramo con questo e quel riferimento SHA ... ma poiché l'unica opzione era "Chiudi" --duh !! era una casella di informazioni - hanno chiuso la finestra di dialogo e hanno perso le informazioni per sempre ...

Grazie al reflogcomando abbiamo potuto vedere che le modifiche non sono andate perse. Ma nel nostro caso, git branchnon ha funzionato come previsto ... o un arrivo git pullha incasinato in qualche modo. Abbiamo dovuto pescare le modifiche dal reflog al ramo appena creato:

 git cherry-pick 0b823d42..3cce27fc

che ha inserito tutti i commit che volevamo nel ramo. Quindi potremmo unire il ramo in developsenza problemi.

Nel caso in cui ciò sia informativo per chiunque, abbiamo identificato i commit sulla testa distaccata in reflogosservando quelli tra quelli contrassegnati con "checkout" (che identificano lo spostamento del ramo):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

Quelli che volevamo erano HEAD@{8}a HEAD@{6}(entrambi inclusi). Quindi li abbiamo ottenuti:

git cherry-pick 0b823d42..3cce27fc

Quindi la solita risoluzione di merge e commit finale ci ha lasciato con il branch lost_changes che ospita il lavoro a testa distaccata che pensavamo perduto. Questa volta fonderlo in sviluppo è stato un passo avanti veloce.


0

Ho provato questo scenario e ho scoperto che git mi dice SHA-1 dell'ultimo commit:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

Hai visto questo messaggio?


no. o forse non faccio caso. Sto cercando un backup su timemachine; (
IgnazioC

1
@IgnazioC Non è necessario guardare un backup. Hai dato un'occhiata alla mia risposta? git reflogdovrebbe mostrarti ciò di cui hai bisogno.
Brian Campbell

0

testa staccata va bene fintanto che si vuole fare Nessun cambiamento.

Se vuoi ripristinare un commit, puoi usare git revert su un ramo specifico

Se vuoi lavorare fuori testa distaccata e fare impegni; creare un nuovo ramo (e successivamente unirlo);


Si! conosciamo le regole. Ma quando i colleghi lavorano sulla testa distaccata e poi abbandonano questi impegni, chiedono risposte, non regole.
manuelvigarcia

0
  1. Per prima cosa, corri git reflogper visualizzare la cronologia.
  2. La revisione più vecchia sarà l'ultima nell'elenco.
  3. Passa al commit desiderato usando git checkout -b temp e35d2b3qui e35dd23 è il valore hash del tuo commit.
  4. Questo è tutto. Ora aggiungi solo git. eccetera....

Accettalo come risposta se risolve il tuo problema. Altrimenti condividi il tuo commento.

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.