Vindo do svn, apenas começando a se familiarizar com o git.
Quando um ramo é excluído no git, ele é removido do histórico?
No svn, você pode recuperar facilmente uma ramificação revertendo a operação de exclusão (mesclagem reversa). Como todas as exclusões no svn, o ramo nunca é realmente excluído, apenas é removido da árvore atual.
Se o ramo for realmente excluído do histórico no git, o que acontece com as alterações que foram mescladas nesse ramo? Eles são mantidos?
fonte
No Git, ramificações são apenas ponteiros (referências) para confirmações em um gráfico acíclico direcionado (DAG) de confirmações. Isso significa que a exclusão de uma ramificação remove apenas referências a confirmações, o que pode tornar algumas confirmações no DAG inacessíveis, invisíveis. Mas todas as confirmações que estavam em uma ramificação excluída ainda estariam no repositório, pelo menos até que as confirmações inacessíveis sejam removidas (por exemplo, usando
git gc
).Observe que
git branch -d
se recusaria a excluir uma ramificação se não tiver certeza de que a exclusão não deixaria confirmações inacessíveis. Você precisa usar o mais fortegit branch -D
para forçar a exclusão de uma ramificação, se ela puder deixar confirmações inacessíveis.Observe também que confirmações inacessíveis, se estiverem presentes, são apenas aquelas confirmadas entre a última dica de uma ramificação excluída e uma confirmação que foi mesclada com outra ramificação existente, qualquer confirmação marcada ou o ponto de ramificação; o que for mais tarde. Por exemplo, na seguinte situação:
somente confirma 'x' e 'y' se tornam inacessíveis após a exclusão da ramificação.
Se você operasse em uma ramificação excluída dentro do
gc.reflogExpire
período, padrão 90 dias, você teria a última dica de uma ramificação excluída registrada no reflog HEAD (consultegit reflog show HEAD
ougit log --oneline --walk-reflogs HEAD
). Você poderá usar o reflog HEAD para recuperar o ponteiro excluído. Observe também que, nesse caso, confirmações inacessíveis em apenas uma ramificação excluída estariam protegidas contra remoção (remoção) dentro dogc.reflogExpireUnreachable
período, que por padrão é de 30 dias.Se você não conseguir encontrar a ponta de uma ramificação excluída no reflog para HEAD, tente usar
git fsck
a opção "consolidação inacessível <sha1>" e examine-as (viagit show <sha1>
ougit log <sha1>
) para encontrar a ponta da ramificação excluída.Independentemente de como você encontra a ponta de uma ramificação excluída, você pode desfazer a exclusão ou, em vez disso, recriar uma ramificação excluída usando
Observe, no entanto, que o reflog para uma ramificação seria perdido.
Há também o script git-resurrect.sh, no
contrib/
qual ajuda a encontrar vestígios de uma dica de ramificação com nome determinado e a ressuscitá-la (cancelar a exclusão).fonte
git reflog show HEAD
listei o commit e criei um novo ramo, como você disse, perfeito.Se você estiver preocupado com filiais excluídas acidentalmente e não tiver mais uma cópia local de seu repositório, existem extensões para servidores Git corporativos como o Gerrit que detectam reescrições de histórico e exclusões de filiais, fazendo o backup com uma ref especial para que pode ser restaurado, se necessário, e não será podado pela coleta de lixo. Os administradores da Gerrit ainda podem remover confirmações selecionadas, se necessário por motivos legais.
fonte