A página do manual diz que o log mostra os logs de confirmação e o reflog gerencia as informações do reflog. O que exatamente são as informações de reflog e o que elas têm que o log não possui? O log parece muito mais detalhado.
fonte
A página do manual diz que o log mostra os logs de confirmação e o reflog gerencia as informações do reflog. O que exatamente são as informações de reflog e o que elas têm que o log não possui? O log parece muito mais detalhado.
git log
mostra a cabeça atual e sua ascendência. Ou seja, ele imprime os pontos de confirmação HEAD para, então seu pai, pai e assim por diante. Ele atravessa a ancestralidade do repositório, pesquisando recursivamente os pais de cada commit.
(Na prática, algumas confirmações têm mais de um pai. Para ver um log mais representativo, use um comando como git log --oneline --graph --decorate
.)
git reflog
não atravessa a ancestralidade da HEAD. O reflog é uma lista ordenada dos commits que o HEAD apontou: desfaz o histórico do seu repo. O reflog não faz parte do repositório propriamente dito (é armazenado separadamente para os próprios commits) e não é incluído em pushes, buscas ou clones; é puramente local.
Além disso: entender o reflog significa que você não pode realmente perder dados do seu repo depois que ele foi confirmado. Se você acidentalmente redefinir para uma confirmação mais antiga, ou fizer uma nova recuperação incorreta ou qualquer outra operação que "remova" visualmente, você poderá usar o reflog para ver onde estava antes e git reset --hard
voltar àquela ref para restaurar o estado anterior. Lembre-se de que as referências não implicam apenas o commit, mas toda a história por trás dele.
.git/logs/refs/<branch>
entradas têm o formato<old_rev> <new_rev> [...] <timestamp> [...]
. Você pode tentar concatenar e classificar por carimbo de data e hora. No entanto, algumas linhas 'new_rev
podem não coincidir com as próximasold_rev
, caso em que suspeito que o reflog será inválido. Você pode tentar inserir entradas falsas para "consertar" a sequência, mas isso me parece muito problemático.git log
mostra o log de confirmação acessível a partir das referências (cabeças, tags, controles remotos)git reflog
é um registro de todas as confirmações que são ou foram referenciadas no seu repositório a qualquer momento.É por isso que
git reflog
(uma gravação local removida após 90 dias por padrão) é usada quando você executa uma operação "destrutiva" (como excluir uma ramificação), para recuperar o SHA1 que foi referenciado por essa ramificação.Veja
git config
:git reflog
é frequentemente referência como " sua rede de segurança "Em caso de problemas, o conselho geral, quando o git log não mostra o que você está procurando, é:
Novamente, reflog é uma gravação local do seu SHA1.
Ao contrário de
git log
: se você enviar seu repositório para um repositório upstream , verá o mesmogit log
, mas não necessariamente o mesmogit reflog
.fonte
Aqui está a explicação do
reflog
livro Pro Git :O
reflog
comando também pode ser usado para excluir entradas ou expirar entradas do reflog muito antigas. Da documentação oficial do Linux Kernel Git parareflog
:fonte
git log
fornece as mesmas informações? Desculpe se isso parece óbvio, eu sou muito novo no GIT e gostaria de aprender algumas coisas básicas antes do meu primeiro OMG.HEAD
ponteiro) e o que confirma que eles apontam. Isso faz sentido? Em uma nota lateral,log
também é possível mostrar informações de reflog, mas você deve passar um sinalizador de opção especial como argumento--walk-reflogs
.Fiquei curioso sobre isso também e só quero elaborar e resumir um pouco:
git log
mostra um histórico de todos os seus commits para o ramo em que você está. Faça o check-out de uma ramificação diferente e você verá um histórico de confirmação diferente. Se você deseja ver o histórico de confirmação para todas as ramificações, digitegit log --all
.git reflog
mostra um registro de suas referências como o Cupcake disse. Há uma entrada sempre que um commit ou checkout é feito. Tente alternar entre duas ramificações algumas vezes usandogit checkout
e executandogit reflog
após cada finalização da compra. Você verá a entrada principal sendo atualizada sempre como uma entrada de "checkout". Você não vê esses tipos de entradasgit log
.Referências: http://www.lornajane.net/posts/2014/git-log-all-branches
fonte
Eu gosto de pensar na diferença entre git log e reflog como sendo a diferença entre um registro privado e um registro público.
Privado x público
Com o git reflog, ele acompanha tudo o que você fez localmente. Você se comprometeu? Reflog rastreia. Você fez uma reinicialização completa? Reflog rastreia. Você alterou um commit ? Reflog rastreia. Tudo o que você fez localmente, há uma entrada para isso no reflog.
Isso não é verdade para o log. Se você alterar uma confirmação, o log mostrará apenas a nova confirmação. Se você fizer uma redefinição e voltar alguns commit no seu histórico, aqueles que você pulou não aparecerão no log. Quando você envia suas alterações para outro desenvolvedor ou para o GitHub ou algo parecido, apenas o conteúdo rastreado no log será exibido. Para outro desenvolvedor, parecerá que as redefinições nunca aconteceram ou as reparações nunca aconteceram.
O log é polido. O reflog é lapidário.
Então, sim, eu gosto da analogia 'privada versus pública'. Ou talvez uma analogia melhor entre log e reflog seja 'polida vs lapidária'. O reflog mostra todas as suas tentativas e erros. O log mostra apenas uma versão limpa e polida do seu histórico de trabalho.
Dê uma olhada nesta imagem para enfatizar o ponto. Ocorreram várias alterações e redefinições desde que o repositório foi inicializado. O reflog mostra tudo isso. No entanto, o comando log faz parecer que houve apenas um commit contra o repositório:
Voltar à ideia da 'rede de segurança'
Além disso, como o reflog monitora as coisas que você alterou e confirma a redefinição , ele permite que você volte e encontre essas confirmações, pois fornecerá os IDs de confirmação. Supondo que seu repositório não tenha sido removido de confirmações antigas, isso permite ressuscitar itens que não são mais visíveis no log. É assim que o reflog às vezes acaba salvando a pele de alguém quando ele precisa recuperar algo que julgou ter perdido inadvertidamente.
fonte
Na verdade, reflog é um apelido para
então a resposta deve ser: é um caso específico.
fonte
git log
,-g
é a forma abreviada de--walk-reflogs
. Então, isso não explica nada.