Não a exclusão de um branch no git removê-lo a partir da história?
-
26-09-2019 - |
Pergunta
Vindo do svn, apenas começando a se familiarizar com o git.
Quando um ramo é eliminada no git, ele é removido da história?
No svn, você pode facilmente se recuperar de um ramo, revertendo a operação delete (integração inversa).Como todos os exclui no svn, o ramo nunca é realmente excluído, é simplesmente removida da árvore atual.
Se o ramo é realmente excluído da história no git, o que acontece com as alterações que foram incorporadas a partir de que ramo?Eles são mantidos?
Solução
Ramos são apenas apontadores para compromete-se em git.Cada commit no git possui uma completa árvore de código fonte, ele é uma estrutura muito diferente do svn, onde todos os ramos e etiquetas (por convenção) ao vivo em separado "pastas" do repositório juntamente com o especial 'tronco'.
Se o branch foi incorporada em outro ramo antes era excluído, em seguida, todos os compromete-se ainda estará acessível a partir de outro ramo quando o primeiro ramo é excluído.Eles permanecem exatamente como eles foram.
Se o ramo é excluído sem ser mesclados em um outro ramo, em seguida, a compromete-se nesse ramo (até o ponto onde a bifurcação a partir de uma confirmação de que ainda é acessível) deixará de ser visível.
A compromete-se ainda serão mantidas no repositório, e é possível recuperá-los imediatamente após a exclusão, mas, eventualmente, eles vão ser coletado pelo coletor de lixo.
Outras dicas
No Git, ramos são apenas apontadores (referências) para compromete-se em um dirigido gráfico acíclico (DAG) de commits.Isso significa que a eliminação de um ramo remove apenas referências para compromete-se, o que pode tornar alguns compromete-se a DAG inacessível, portanto, invisível.Mas todos reconhecem que estavam excluídos do ramo ainda estaria no repositório, pelo menos até inacessível compromete-se obter podadas (e.g.usando git gc
).
Note que git branch -d
se recusam a eliminar um ramo se não puder ser a certeza de que a exclusão de que ele não iria deixar compromete-se inacessível.Você precisa usar o mais forte git branch -D
para forçar a exclusão de um ramo se pode deixar compromete-se inacessível.
Observe também que, inacessível compromete-se, se estiverem presentes, são apenas aqueles compromete-se entre a última dica de um excluído do ramo e de uma consolidação que tem mesclado para outro ramal existente, qualquer tagged cometer, ou o ponto de ramificação;o que for mais tarde.Por exemplo, na seguinte situação:
----O----*----*----/M----* <-- master <-- HEAD \ / \--.----.--/--x---y <-- deleted branch
só compromete-se 'x' e 'y' iria se tornar inacessível depois de eliminar o ramo.
Se você operado em um excluído sucursal no gc.reflogExpire
período, padrão de 90 dias, você teria a última dica de um excluído do ramo gravado na CABEÇA reflog (ver git reflog show HEAD
, ou git log --oneline --walk-reflogs HEAD
).Você deve ser capaz de usar a CABEÇA reflog para recuperar o que foi excluído do ponteiro.Note também que, neste caso, inacessível compromete-se em apenas um excluído do ramo estaria protegida da poda (remover) dentro do gc.reflogExpireUnreachable
período, que por padrão é de 30 dias.
Se você não pode encontrar a ponta de uma eliminado do ramo em reflog para a CABEÇA, você pode tentar usar git fsck
para encontrar o "inatingível cometer <sha1>"e examinar aqueles (via git show <sha1>
ou git log <sha1>
) para encontrar a ponta dos excluídos do ramo.
Independente de como você encontrar a ponta de um excluído do ramo, você pode desfazer exclusão, ou melhor, re-criar um excluiu ramo usando
git branch <deleted-branch> <found-sha1-id>
Note no entanto que reflog para um ramo seria perdido.
Há também git-resurrect.sh script em contrib/
o que ajuda a encontrar vestígios de um ramo com ponta de determinado nome, e ressuscitar (undelete) - la.
Se você está preocupado com galhos excluídos acidentalmente e não possui mais uma cópia local do seu repositório, há extensões para servidores Git Enterprise, como Gerrit, que detectarão reescritas de histórico e as exclusões de ramificação, apoiarão -os sob um referência especial para que eles pode ser restaurado, se necessário, e não será podado pela coleta de lixo. Os administradores da Gerrit ainda podem remover compromissos selecionados, se necessário, por motivos legais.