2010-04-28 14 views
10

Ho letto che Git aggiunge principalmente informazioni sulla cronologia del repository, cercando di ricordare ogni modifica apportata, ma che ci sono anche comandi che apportano modifiche irreversibili.Quali sono i comandi distruttivi in ​​git?

Quali sono i comandi a cui devo veramente prestare attenzione ed evitare di utilizzarli in modo errato perché non si può tornare indietro?

+0

Quando rispondi alla domanda di seguito, ricorda di spiegare cosa fa il comando! –

risposta

9

Qui ci sono due tipi di "distruttivo": comandi che sono distruttivi per la cronologia git e comandi che ignorano le modifiche nella copia di lavoro.

Comandi che scartano albero lavoro cambia:

  1. git reset
  2. git checkout

Come altri hanno già detto, la combinazione del reflog e il fatto che gli oggetti non immediatamente GIT scartare (a meno che non si attivi la pulizia automatica) significa che di solito è possibile annullare operazioni come git reset/rebase/merge.

Questi comandi, però, in realtà oggetti scarto git, eliminando la possibilità di annullare:

  1. git gc (per impostazione predefinita, prugne gli oggetti non raggiungibili che sono almeno 2 settimane)
+1

A mio parere, i comandi git più distruttivi che cambiano quelli che scaricano l'albero di lavoro. Dovrebbe essere sempre sicuro di "fare un backup" con 'git stash; git stash pop '. Puoi in seguito (fino al tuo limite di gc prune) recuperare versioni "perse" tramite comando come: gitk --all -n 5000 - tutti $ (git fsck | awk '/ dangling commit/{print $ 3}'; git log -g --pretty = 'format:% H') [questo aprirà gitk frontend con un massimo di 5000 commit compresi tutti i commit "persi"]. –

2

git resettare --hard non possono essere annullate

+0

true, when not commited – Lauri

7

Secondo http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/

$ git checkout foo.c 

... sovrascriverà tutte le modifiche locali potrebbe essere necessario foo.c senza chiedere.

+1

Abbastanza vero, è ancora più distruttivo di quanto pensassi. Ho appena fatto un 'git checkout 6bb33a8'. Sperando di ottenere il file che è stato modificato in quel commit, ma ha anche cancellato le mie modifiche graduali ad altri file, sostituendoli con i contenuti in quel commit. Ho pensato che potrebbe attaccare qualcosa nel reflog per proteggermi, ma non così fortuna. –

3

È possibile perdere le modifiche non impegnate utilizzando il comando git reset. Se le tue modifiche vengono confermate, sei protetto dal reflog per un certo numero di giorni prima che venga pulito da gc.

Ad esempio, se si checkout, rebase, reset o merge cui tutti introducono modifiche, è possibile tornare a una precedente impegnarsi eseguendo il comando reflog e utilizzando reset per reimpostare la testa per un vecchio commettere.

Problemi correlati