Domanda

Per chi proviene da svn, appena iniziando a prendere confidenza con git.

Quando un ramo viene eliminato in git, viene rimosso dalla storia?

In svn, si può facilmente recuperare un ramo ritornando l'operazione di eliminazione (merge inversa). Come tutte le eliminazioni in SVN, la filiale è mai realmente cancellato, è solo rimosso dalla struttura corrente.

Se il ramo è effettivamente cancellato dalla storia in git, cosa succede ai cambiamenti che sono stati uniti da quel ramo? Sono mantenute?

È stato utile?

Soluzione

Filiali sono solo puntatori a commit in Git. In git ogni commit ha un albero sorgente completo, è una struttura molto diversa da svn in cui tutti i rami e tag (per convenzione) vivono in 'Cartelle' separate del repository a fianco del 'tronco' speciale.

Se il ramo è stata incorporata in un altro ramo prima che fosse cancellato poi tutti i commit saranno ancora raggiungibile dal ramo quando il primo ramo viene cancellato. Essi rimangono esattamente come erano.

Se il ramo viene cancellato senza essere fuse in un altro ramo poi i commit in quel ramo (fino al punto in cui il fork di un commit che è ancora raggiungibile) cesserà di essere visibile.

I commit verrà salvata nel repository ed è possibile recuperarli subito dopo l'eliminazione, ma alla fine si sarà garbage collection.

Altri suggerimenti

In Git, i rami sono solo puntatori (riferimenti) a commit in un grafo orientato aciclico (DAG) di commit. Ciò significa che l'eliminazione di un ramo rimuove solo i riferimenti ai commit, che potrebbero rendere alcune commit nel DAG irraggiungibile, quindi invisibili. Ma tutti i commit che erano su un ramo cancellato sarebbero ancora nel repository, almeno fino a quando i commit irraggiungibili vengono potate (per esempio usando git gc).

Si noti che git branch -d sarebbe rifiutato di eliminare un ramo se non può essere sicuri che l'eliminazione non avrebbe lasciato commit irraggiungibili. È necessario utilizzare il git branch -D più forte per forza la cancellazione di un ramo se potrebbe lasciare commit irraggiungibili.

Si noti inoltre che i commit irraggiungibili, se presenti, sono solo i commit tra l'ultima punta di un ramo cancellato e di un commit che ha ottenuto è fusa ad un altro ramo già esistente, qualsiasi tagged commettere, o il punto di diramazione; se successiva. Ad esempio nella seguente situazione:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

solo commit 'x' e 'y' sarebbe diventato irraggiungibile dopo l'eliminazione del ramo.

Se collegato a un ramo eliminato entro il periodo gc.reflogExpire, default 90 giorni, si avrebbe l'ultima punta di un ramo cancellato registrato nel HEAD reflog (vedi git reflog show HEAD, o git log --oneline --walk-reflogs HEAD). Si dovrebbe essere in grado di usare la testa reflog per recuperare il puntatore cancellato. Si noti inoltre che in questo caso, si impegna non raggiungibili in appena un ramo eliminata sarebbe stato protetto dalla potatura (rimozione) entro il periodo gc.reflogExpireUnreachable, che di default è di 30 giorni.

Se non riesci a trovare la punta di un ramo appena cancellato in reflog per la testa, si può provare a utilizzare git fsck di trovare "irraggiungibile commettere ", ed esaminare quelli (via git show <sha1> o git log <sha1>) per trovare la punta del ramo cancellato.

indipendente su come trovare la punta di un ramo eliminato, è possibile annullare la cancellazione, o meglio ricreare un ramo appena cancellato tramite

git branch <deleted-branch> <found-sha1-id>

Si noti tuttavia che reflog per un ramo sarebbe perso.


C'è anche git-resurrect.sh copione in contrib/ che aiuta a trovare tracce di una punta ramo con nome di battesimo e risorgere (undelete) di esso.

Se siete preoccupati per rami eliminati accidentalmente e non si dispone di una copia locale del repo più a lungo, ci sono estensioni di enterprise server Git come Gerrit che rileverà riscrive la storia e le cancellazioni di filiale, li backup sotto un ref speciale in modo che possano essere ripristinati in caso di necessità e non saranno potate per la raccolta dei rifiuti. Gli amministratori possono ancora Gerrit Elimina selezionati si impegna, se necessario, per motivi legali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top