Digamos que eu tenha um gráfico como este:
A---B---C---D (master)
\
\-E---F (HEAD)
Se o fizer git log --all --oneline
, receberei todos os seis dos meus commits.
Mas se o gráfico for
A---B---C---D (master, HEAD)
\
\-E---F
Não verei E e F. Posso fazer com que o git me conte todos os commits, incluindo aqueles em ramos que não são nomeados?
obrigado
commit --amend
ourebase
e um acidentalmente órfão ao trabalhar com um HEAD desanexado, por exemplo.git commit --amend
etc. deixar becos sem saída, compromissos perdidos. Fiz algumas reformulações e outros enfeites e acabei com alguns commits inacessíveis a partir de quaisquer ramos, e me senti um pouco sujo deixando-os no repositório. Agora, o pensamento não é mais tão perturbador. :)git fsck --unreachable
não fornece isso. Eu apenas tentei. A melhor abordagem é a--reflog
opção paragit log
, como kenorb respondeu . O que é especialmente interessante nisso é que, combinado com--graph
, você obtém um contexto visual fácil de analisar, muito parecido com o ilustrado na pergunta original. Por exemplo, tente:git log --graph --all --oneline --reflog
Experimentar:
que lista todos os commit de git fingindo que todos os objetos mencionados por reflogs (
git reflog
) estão listados na linha de comando como<commit>
.fonte
Quando resolvo esse problema, uso o seguinte comando:
Isso permite visualizar confirmações recentes que se tornaram sem cabeça.
Eu tenho isso embrulhado em um auxiliar de script chamado
~/bin/git-reflog-gitk
.fonte
when the tips of branches and other references were updated in the *local repository*
. Você pode querer usargit log --reflog
se quiser fazer isso para alterações de ref não locaisO que salvou minha vida foi o seguinte comando:
Lá você encontra uma tela com confirmações de histórico feitas para git como esta:
Nesse ponto, você só precisa encontrar o
HEAD@{X}
necessário, criar uma ramificação temporária e passar para ela da seguinte maneira:Dessa forma, você terá um ramo temporário com seu commit perdido, sem rebasear ou quebrar ainda mais seu repositório git.
Espero que isto ajude...
fonte
Como a resposta de @Kieran, mas para o console:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
fonte
git log --all
. Um exemplo rápido: após agit reset --hard @^
confirmação do seu HEAD @ {0}, apenas estará no reflog e, comogit reflog
não suporta,--graph
você deve passar os commitsgit log --graph
para obter uma representação visual.--reflog
vez de$(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
comgit log --oneline --all --graph --decorate --reflog
, eles são quase idênticos, exceto --reflog incluiu detalhes como entradas WIP.reflog
por que não usarlog --reflog
?Como eu resolvo esse problema? Use
git fsck
e registre-se!Primeiro, crie um arquivo contendo confirmações e blobs perdidos (inacessíveis). (OBSERVAÇÃO: se você fez algo assim
git gc
, o lixo coletará todos os commits e você não os encontrará aqui!)Isso fornece um arquivo como este:
Você pode abrir esse arquivo com o editor de texto favorito para copiar os hashes de commit / blog a partir daí. (as macros * tosse * vim funcionam muito bem para essa tosse *)
Agora você pode fazer logon novamente desse commit com algo parecido
git log --oneline <commit hash>
. Como alternativa, gitk, tig ou qualquer outro visualizador de git deve funcionar.No seu caso, se você encontrar o hash para confirmação F, o log mostrará algo assim,
Rápido e fácil! Agora você pode encontrar o contexto por trás de todos esses commits dangling.
PS: Sim, eu sei, postagem tardia, mas bem, alguém pode encontrá-lo aqui e achar útil. (Provavelmente eu em 6 meses quando eu pesquisar isso novamente no Google)
fonte
Tive sorte em recuperar o commit observando o reflog, localizado em
.git/logs/HEAD
Eu tive que ir até o final do arquivo e encontrei o commit que acabei de perder.
fonte
Vamos
git log
às vezes não é bom para obter todos os detalhes commits, de modo a ver isso ...Para Mac: Entre no seu projeto git e digite:
para ver todos vocês confirmados nisso, ou:
para ver todos vocês confirmam nisso,
então você pode editar em qualquer navegador favorito.
fonte
@bsimmons
Em seguida, crie uma ramificação para cada um:
Agora, muitas ferramentas mostrarão uma visualização gráfica desses commits perdidos.
fonte
Se você usar a GUI do Git Extensions, ele poderá mostrar uma visualização gráfica de confirmações pendentes se você marcar "Exibir -> Mostrar referências de reflog". Isso mostrará comprometimentos pendentes na árvore, como todos os outros referenciados. Dessa forma, é muito mais fácil encontrar o que você está procurando.
Veja esta imagem para demonstração. As confirmações C2, C3, C4 e C5 na imagem estão pendentes, mas ainda visíveis.
fonte
me salvou! Perdi meu tempo mesclando HEAD e não consegui encontrar meus compromissos comprometidos! Não é exibido na árvore de origem, mas
git log --reflog
mostra todos os meus commits locais antesfonte