2013-05-01 11 views
5

Uno dei punti di forza di Git è che, poiché funziona con i puntatori, è relativamente facile annullare una vasta gamma di attività, tra cui deleting a commit or commits o creating and deleting remote branches. In molti casi, tutto quello che devi fare è resettare correttamente il puntatore HEAD del ramo corrente nella posizione desiderata e voilà, passo indietro. Questo comprende una vasta gamma di casi.Quali sono alcune azioni in Git che sono difficili/impossibili da annullare?

Oltre all'eliminazione di un intero repository o di una bad push, qual è l'azione più banale che non può essere annullata o estremamente difficile da annullare in un repository Git standard?

+3

Non capisco il senso di questa domanda. – Mat

+1

I * do * capisco il punto di questa domanda e quelli simili. In sostanza, sta chiedendo "Dove sono i draghi?" Questa domanda è lontana da "non costruttiva", ma è più adatta per lo scambio di schedari di programmatori. Quando si inizia con una nuova tecnologia, gli sviluppatori spesso vogliono sapere dove si trovano i draghi, le insidie ​​e le trappole esplosive. –

risposta

3
  • git clean elimina i file non monitorate. Non possono essere ripristinati con git.

  • L'unione con un albero di lavoro sporco può causare un problema difficile da ripristinare.

Quindi in breve, le cose che non sono tracciate da git non possono essere ripristinate da git. Tutto il resto è ripristinabile.

+0

In realtà, non tutto può essere ripristinato da git. L'eliminazione di un ramo sembra essere permanente. Esistono anche modi non ovvi per la cancellazione del ramo, ad es. 'git push --mirror REMOTE'; quando il tuo locale non ha rami che si trovano sul telecomando, il ramo remoto viene rimosso in modo non interattivo. ([Cfr. L'estratto delle pagine di aiuto di git] (https://git-scm.com/docs/git-push#_options_a_id_options_a): "--mirror [...] I ref locali appena creati verranno inviati al telecomando fine, i ref aggiornati localmente saranno forzati all'aggiornamento sul terminale remoto e ** i riferimenti cancellati verranno rimossi ** dal terminale remoto ") –

3

Un esempio di un difficile da annullare l'azione potrebbe essere:

git branch -D some-unmerged-branch-such-as-master 
git gc --prune=now --aggressive 

Il primo elimina il riferimento ad alcuni commit. Il secondo elimina tutti i commit senza riferimenti.

Spero che questa domanda sia solo una questione di curiosità oziosa, piuttosto che voler trasgredire il repository di qualcuno, ma a causa della ridondanza inerente al controllo della versione distribuita, non sono troppo preoccupato.

+0

Questa combinazione di opzioni farà anche il bombardamento degli oggetti a cui fa riferimento' reflog'? – Christopher

+0

Questo è sicuramente più vicino alla curiosità oziosa della malizia. Sono più interessato alle possibili limitazioni delle capacità di controllo del codice sorgente di Git. – joshin4colours

3

Di gran lunga l'errore più comune "difficile da annullare" mi imbatto tra chi è nuovo a git sono abusi di git stash, perché git stash pop non è sempre reversibili con git stash. Considerare:

git init /tmp/trash && cd /tmp/trash  # make a new repo 
echo A > A        # create a file 
git add A 
git commit -m "Initial commit"   # add and commit it 
echo B > A        # ... now change it 
git stash        # ... and stash it 
echo C > A        # and change it and commit it again 
git add A 
git commit -m "Another commit" 
git stash pop       # now pop the stash 

Il pop tenterà di automerge A e getterà un conflitto, ma non si può semplicemente di nuovo fuori dalla comparsa colpendo git stash di nuovo. Questo è un esempio abbastanza banale, ma è facile entrare in una brutta situazione se si nascondono spesso grandi serie di cambiamenti e si cambiano frequentemente rami divergenti, spuntando lungo la strada. Credo che git stash drop sia anche permanente, cioè non ci sono reti di sicurezza se si rilascia la scorta sbagliata.

In generale, utilizzare stash per ciò che è stato progettato: nascondere un indice di lavoro sporco per passare a un altro ramo, correggere un errore, eseguire il commit, push e tornare allo stato originale. Se cerchi di usarlo per gestire molte modifiche su molti rami, ti morderà inevitabilmente senza molta cura.

+0

È una vecchia voce, ma in questo caso puoi semplicemente "resettare --hard". 'stash pop' non farà cadere automaticamente la voce di scorta nel caso. – MirMasej

0

Nella mia esperienza l'azione irreversibile più comune che le persone eseguono è git reset --hard. Quando molte persone scrivono git reset, --hard sembra venire troppo naturale quando in realtà hanno solo bisogno di un reset, forse con --keep.

Problemi correlati