Respostas:
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óximas old_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
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire remove entradas de reflog anteriores a esse momento; o padrão é 90 dias.
Com "<pattern>
" (por exemplo "refs/stash
") no meio, a configuração se aplica apenas aos árbitros que correspondem ao<pattern>
.
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 mesmo git log
, mas não necessariamente o mesmo git reflog
.
Aqui está a explicação do reflog
livro Pro Git :
Uma das coisas que o Git faz em segundo plano enquanto você trabalha fora é manter um reflog - um registro de onde estão as suas referências HEAD e ramo nos últimos meses.
Você pode ver seu reflog usando
git reflog
:$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
Sempre que sua dica de agência é atualizada por qualquer motivo, o Git armazena essas informações para você nesse histórico temporário. E você pode especificar confirmações mais antigas com esses dados também.
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
:
O subcomando
expire
é usado para remover entradas mais antigas de reflog.Para excluir entradas únicas do reflog, use o subcomando
delete
e especifique a entrada exata (por exemplogit reflog delete master@{2}
).
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, digite git 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 usando git checkout
e executando git 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 entradas git log
.
Referências: http://www.lornajane.net/posts/2014/git-log-all-branches
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.
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.
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:
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.
Na verdade, reflog é um apelido para
git log -g --abbrev-commit --pretty=oneline
então a resposta deve ser: é um caso específico.
git log
, -g
é a forma abreviada de --walk-reflogs
. Então, isso não explica nada.