Qual é a diferença entre git reflog e log?

158

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.

Noich
fonte

Respostas:

221

git logmostra 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 reflognã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 --hardvoltar à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.

ben_h
fonte
26
Uma palavra de cautela: às vezes, você PODE perder dados porque as entradas de reflog não persistem eternamente - elas são eliminadas em determinadas condições. Veja esta resposta e os documentos para git-reflog e git-gc . Geralmente, se a operação destrutiva não ocorreu mais de duas semanas atrás, você provavelmente está seguro.
Mcmlxxxvi 14/07/2015
@mcmlxxxvi Tenho duas pastas locais para o mesmo repositório, posso mesclar os reflogs das duas pastas?
Tmx
@ TMX, eu não entendo bem o seu caso - o que você quer dizer com duas pastas locais para o mesmo repositório ? Se você possui dois clones do mesmo repositório, atualizados e deseja "mesclar" o histórico de edições, as .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_revpodem 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.
Mcmlxxxvi 27/0318
62
  • 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 reflogexpire 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>.

internet Segura

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, é:

" Mantenha a calma e usegit reflog "

mantenha a calma

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.

VonC
fonte
14

Aqui está a explicação do refloglivro 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 reflogcomando 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 deletee especifique a entrada exata (por exemplo git reflog delete master@{2}).

Comunidade
fonte
Mas o não git logfornece 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.
NoJul
2
O log do Git é um registro dos seus commit . O reflog, como declara o livro Pro Git, é um registro de suas referências (basicamente, seus ponteiros de ramificação e seu HEADponteiro) e o que confirma que eles apontam. Isso faz sentido? Em uma nota lateral, logtambém é possível mostrar informações de reflog, mas você deve passar um sinalizador de opção especial como argumento --walk-reflogs.
3
Além disso, como você é iniciante no Git, eu recomendo que você leia o livro Pro Git, foi assim que aprendi a maior parte do que aprendi sobre o Git. Eu recomendo os capítulos 1-3 e 6-6.5. Também recomendo que você aprenda como refazer a interatividade e a não interatividade.
8

Fiquei curioso sobre isso também e só quero elaborar e resumir um pouco:

  1. git logmostra 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.

  2. git reflogmostra 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 checkoute executando git reflogapó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

mitch
fonte
1

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:

O log é polido.  Re-registro é lapidá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.

Cameron McKenzie
fonte
-6

Na verdade, reflog é um apelido para

 git log -g --abbrev-commit --pretty=oneline

então a resposta deve ser: é um caso específico.

user10028634
fonte
9
Em git log, -gé a forma abreviada de --walk-reflogs. Então, isso não explica nada.
Adrian W