2013-07-19 2 views
44

Sto usando l'albero dei sorgenti. Avevo creato una serie di modifiche multiple e per errore l'ho cancellata. C'è un modo per recuperarli?Recupera lo stash cancellato in Git usando SourceTree

+0

Si sta utilizzando per SourceTree Windows o Mac? La versione per Mac è stata costantemente all'avanguardia rispetto alla versione di Windows in termini di funzionalità. –

+2

Eventualmente correlato: [Recuperare la copia abbandonata in git] (http://stackoverflow.com/q/89332/456814). –

+0

@Cupcake Ho usato la versione Mac. – Tushar

risposta

40

La memoria viene salvata internamente come un commit unione a cui fa riferimento un elenco di barre.

git fsck può trovare oggetti penzolanti. Troverai non solo la tua scorta eliminata, ma probabilmente anche altre cose ... quindi dovrai cercare i commit che potrebbero essere la tua scorta (git show <ID> per visualizzare le informazioni rilevanti su un oggetto e decidere se è la quello che stai cercando).

Una volta che hai fatto tutto ciò che devi fare è reinserirlo nella lista delle finestre. L'elenco è memorizzato in .git/logs/refs/stash e una linea ha il seguente formato:

<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash> 

Ecco un esempio di lavoro:

16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <[email protected]> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4 

Basta sintetizzare una linea per la scorta si vuole ri-insert (il nome/mail/timestamp/descrizione non avere per essere precisi) e dovresti essere in grado di usarlo di nuovo normalmente.

Buona caccia!

+0

Ho eseguito il comando '' 'git fsck''' e mi ha dato circa 100 guids. C'è un modo più semplice per aggirare questo? Intendo qualcosa di più visivo? – Tushar

+0

è impossibile passare attraverso 100 guids! Si prega di suggerire un modo più semplice. – Tushar

+3

Questo è l'unico modo che conosco. Tuttavia, probabilmente è possibile ridurlo un po 'usando questo: 'git fsck --unreachable'; e per ottenere direttamente una lista con dettagli, forse qualcosa di simile: 'for i in $ (git fsck --unreachable --no-dangling 2> |/dev/null | grep commit | cut -d '' -f3); do git --no-pager log -1 $ i; fatto | di meno –

20

Come nella precedente risposta, è possibile utilizzare git fsck per elencare gli oggetti a cui lo non fa riferimento a nulla che includa la scorta cancellata. Ma, è possibile utilizzare git show per filtrare quella lista di oggetti da mostrare solo stashes come:

git fsck 2> /dev/null | 
    awk '/commit/{print $3}' | 
    git show --stdin --merges --grep '^WIP on' 

Se si conosce quando la scorta è stato creato, inoltre è possibile aggiungere un argomento come --since '2 days ago' alla finale linea per limitare ulteriormente l'output. Spero che questo ridurrà la lista a una dimensione gestibile.

Una volta individuato lo stash corretto, prendere nota del suo ID di commit ed è possibile utilizzare git stash apply COMMITID per applicarlo come se non fosse stato eliminato.

+2

L'opzione "since" non funziona per me – IcedDante

9

Come afferma Jan Krüger sopra, git fsck è la strada da percorrere. Tuttavia, se ti trovi incapace (per qualsiasi ragione) di sintetizzare correttamente una riga nel tuo file stash e far apparire la scorta nell'elenco disponibile, puoi usare direttamente git stash apply <guid>, senza aggiungere la linea. Questo applicherà immediatamente (non impegnarsi) le modifiche del file al tuo ramo attuale.

52

Sulla base delle risposte di cui sopra, ecco un semplice sequenza:

Aprire una finestra di terminale e cd in una cartella sotto il repository. Poi:

git fsck | awk '{print $3}' > tmp.txt 
cat tmp.txt | xargs git show > tmp2.txt 

Ora aperto tmp2.txt nell'editor, individuare il codice perduto, e trovare il commit-id su di esso. Quindi applica il codice:

git stash apply <commit id> 
rm tmp.txt tmp2.txt 

Mi ha salvato la vita! Ringrazio davvero tutti coloro che hanno risposto a questa domanda. Benedico il creatore di git Linus Torvalds per aver conservato materiale cancellato nel database git. Genio!!

+0

Sono abbastanza nuovo da git e questo mi ha assolutamente salvato la vita, i giorni di lavoro recuperati. Grazie – RyuAkamatsu

+0

concordo. Ho appena seguito questi passaggi e ho recuperato 3 giorni di lavoro dopo aver inavvertitamente cancellato (fatto scoppiare) una scorta. – bholben

+0

risposta migliore che ho visto. grazie un pacco! – Andrew

1
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less 

Quindi trovare l'ID di commit #.

e fare

git stash apply {commit#} 
4

Un'altra soluzione è:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log 

trovare l'autore e impegnarsi informazioni (data, hash, autore ecc)

git stash store <hash-id-of-specific-commit> 
+0

Ho provato alcuni script ma questo ha funzionato senza errori o fornendomi dati casuali/n. – Zammbi