Git: o que é um commit / blob pendente e de onde eles vêm?

148

Estou procurando as informações básicas sobre commits e blobs pendurados.

Meu repo parece bem. Mas eu corri git fsckpela primeira vez para ver o que fazia e tenho uma longa lista de 'blobs pendentes' e um único 'commit pendente'.

O que são essas coisas? De onde eles vieram? Eles indicam algo incomum (bom ou ruim) sobre o estado do meu repo?

duvida1
fonte

Respostas:

95

Durante o trabalho com seu repositório git, você pode acabar saindo das operações e fazendo outras movimentações que causam blobs intermediários, e até algumas coisas que o git faz por você para ajudar a evitar a perda de informações.

Eventualmente (condicionalmente, de acordo com a página de manual do git gc ), ele executará a coleta de lixo e limpará essas coisas. Você também pode forçá-lo invocando o processo de coleta de lixo git gc,.

Para obter mais informações sobre isso, consulte Manutenção e recuperação de dados no site git-scm.

Uma execução manual do GC sairá por padrão 2 semanas antes do tempo de execução deste comando de uma rede de segurança. De fato, é recomendável executar o GC ocasionalmente para ajudar a garantir o desempenho do seu repositório git. Porém, como qualquer coisa, você deve entender o que está fazendo antes de destruir as coisas que podem ser importantes para você.

vgoff
fonte
10
Portanto, é justo dizer que 1) a menos que eu ache que há algo errado com meu repositório, é seguro removê-los git gce 2) Eu não preciso me preocupar com isso, porque esses bits pendentes são normais e já estão com o git lidar com eles?
Duvida # 29/13 /
7
Isso seria uma avaliação justa.
vgoff
9
Além disso, sempre que você adiciona um arquivo ao git, mas não confirma a versão exata do arquivo, você acaba com um blob pendente. Nada com o que se preocupar.
precisa saber é o seguinte
7
duvid1ejack - De um modo geral, você não deve executar a coleta de lixo manualmente. É um mau hábito entrar e o git faz a coleta de lixo quando necessário de qualquer maneira. A desvantagem de executá-lo manualmente é que você perdeu a capacidade de recuperar blobs pendentes e confirmações que talvez você não queira agora, mas no futuro. Depois de executar a coleta de lixo, você tira algumas funcionalidades poderosas de reversão do git. Use com cuidado e, como exceção, não como regra. --- Apenas deixe o git fazer as coisas.
Elias Lynn
95

Dangling blob = Uma alteração que chegou à área / índice de preparação, mas nunca foi confirmada. Uma coisa que é surpreendente com o git é que, uma vez adicionado à área de preparação, você sempre pode recuperá-lo, porque esses blobs se comportam como confirmados por terem um hash também !!

Confirmação dangling = uma confirmação que não está diretamente vinculada a nenhuma confirmação filho, ramificação, tag ou outra referência. Você pode recuperá-los também!

Elijah Lynn
fonte
5
Os "antepassados" deveriam ler "descendentes"? Em geral, você não pode alcançar nenhum commit do git através de seus ancestrais.
Phil Miller
@Novelocrat Eu tive o mesmo pensamento, concordo que provavelmente deveria ler descendentes.
stkent
1
Eu ainda leio "ascendentes" em sua resposta. Parece que sua edição de 2 de julho não corrigiu o erro de digitação.
214156 #
Como você recupera um blob pendurado?
HelloGoodbye 19/01
1
@ElijahLynn Você está certo. Eu acho que li um pouco rápido demais as discussões. Um commit dangling não tem nenhum descendente / filho e não é referenciado por uma tag ou ramificação.
Iclman
44

COMO remover todos os commits dangling do seu repositório git de http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

git reflog expire --expire=now --all
git gc --prune=now

Verifique se realmente deseja removê-los, pois você pode decidir que precisa deles, afinal.

qxo
fonte
5
Na realidade, a maioria dos usuários nunca deve precisar disso e, se o fizer, provavelmente é para um caso de uso programático. O espaço em disco economizado ou a velocidade aumentada removendo confirmações pendentes não valem o esforço na minha opinião.
Elijah Lynn
1
Isso responde a uma pergunta diferente.
Elijah Lynn
5

Um commit dangling é um commit que não está associado à referência, ou seja, não há como alcançá-lo.

Por exemplo, considere o diagrama abaixo. Suponha que excluamos o recurso featureX sem mesclar suas alterações, e o commit D se tornará um commit pendente porque não há nenhuma referência associada a ele. Se ele tivesse sido mesclado no master, as referências HEAD e master teriam apontado para confirmar D e ele não estaria mais danificado, mesmo que excluíssemos o featureX. Leia a nota após o diagrama para entender melhor isso.

O Git coleta automaticamente de lixo (ou seja, descarta) comprometimentos pendentes. Podemos usar o git reflogpara recuperar um ramo (de confirmações pendentes) que foi excluído sem mesclá-lo. Só podemos recuperar confirmações excluídas se ele estiver presente no armazenamento de objetos local. Se o lixo foi coletado, não podemos recuperá-lo.

insira a descrição da imagem aqui

Observe que o nome de uma ramificação, ou seja, o rótulo da ramificação, é na verdade uma referência à confirmação mais recente em uma ramificação, ou seja, a ponta da ramificação. No diagrama acima, featureX, master e HEAD são apenas referências a confirmações específicas. featureX e master labels referem-se às confirmações mais recentes em suas respectivas ramificações. HEAD geralmente se refere à ponta do ramo atualmente com check-out (mestre neste caso). Se você efetuar o check-out de um commit mais antigo em sua ramificação atual, o HEAD estará em um estado desanexado, ou seja, ele apontará para o commit mais antigo, em vez do mais recente. Observe também que HEAD é chamado de referência simbólica porque, na verdade, aponta para o rótulo da ramificação atual e qualquer rótulo da ramificação sempre aponta para a ponta da ramificação. Portanto, em circunstâncias normais, o HEAD indica indiretamente o último commit.

Como um aparte, observe que o Git representa seu gráfico / histórico de confirmação como um gráfico acíclico direcionado . Cada confirmação tem uma referência ao pai. Portanto, as setas em um diagrama de confirmação apontam de confirmação filho para confirmação pai. Precisamos de uma referência ao commit filho mais recente para alcançar os commit mais antigos em um branch.

PS - O diagrama e entendimento acima foram obtidos neste curso gratuito . Embora o curso seja bastante antigo, o conhecimento ainda é relevante.

MasterJoe2
fonte