Como um commit desaparece do log de um arquivo?

9

Então eu fiz uma alteração em um arquivo, empurrei para o repositório principal e o vi lá. David puxou do repo e fez - bem, algo - e não podia ver minha mudança. Como David é uma típica vítima da Microsoft, pedi a ele para empurrar o que ele tinha de volta para o repositório e eu olharia para ele lá.

git log --name-only produz

commit 194b7f5dbb59d29ace340a376f10906752978db5
Merge: 484df79 afc2dec
Author: David Good <david@company.com>
Date:   Sat Sep 24 11:47:14 2011 -0700

[ David's merge ]

commit afc2dec4a828de05350c39526eeecf9d3a15e465
Author: Michael <info@company.com>
Date:   Sat Sep 24 10:58:54 2011 -0700

[ my changes ]

backend/theimportantfile.js

commit e4e2f9ce9df3adf5ed0547ed16521eb742cc2ac1
Author: Michael <info@company.com>
Date:   Sat Sep 24 10:47:09 2011 -0700

[ some other thing ]

mas git log backend/theimportantfile.js produz

commit eb470fe1792220779b14e90337f74fb216fc9f7f
Author: David Good <david@company.com>
Date:   Mon Sep 12 17:20:25 2011 -0700

[ comment ]

commit 63ddd2be020092a4bf65d1eac106ece5fd7fbbd3
Author: David Good <david@company.com>
Date:   Fri Sep 9 16:23:53 2011 -0700

[ comment ]

Então, de acordo com o git, backend/theimportantfile.js não foi tocado em semanas, mas também foi alterado há duas horas com o commit afc2dec. Como posso rastrear o que aconteceu?

    
por Malvolio 24.09.2011 в 21:22
fonte

3 respostas

2

Parece que a fusão de David é o que você fez. Eu digo isso porque a fusão parece ter "revertido" suas mudanças.

#this command will show you if anything 'strange' happened during the merge"

git show 194b7f

Se esse comando não der uma saída interessante, talvez David tenha se fundido a uma estratégia 'nossa' ou tenha feito o 'cp my files' em um local temporário; git merge; sobrescrever arquivos conflitantes; git commit 'workflow.

Independentemente de como esse estado foi atingido, a mesclagem precisa ser descartada e refeita, já que é obviamente defeituosa. Você também pode considerar alterar seu fluxo de trabalho de tal forma que David não precise mais fazer mesclagem, mas envie solicitações de pull informais (ou formais) e cuide da mesclagem.

    
por Frosty 04.10.2011 / 16:24
fonte
2

Não tenho certeza se essa é a natureza do seu problema, mas, por padrão, git log às vezes filtrará os commits que acha que não são "úteis" ou "interessantes" para entender o estado final de uma árvore de commit. De os git log docs :

  

Às vezes, você está interessado apenas em partes do histórico, por exemplo, os commits modificando um determinado < path & gt ;. Mas há duas partes de History Simplification , uma parte é selecionar os commits e a outra é como fazê-lo, pois existem várias estratégias para simplificar o histórico.

     

As seguintes opções afetam o modo como a simplificação é realizada:

     

Default mode
  Simplifica a história para a história mais simples, explicando o estado final da árvore. Mais simples porque remove alguns ramos secundários se o resultado final for o mesmo (ou seja, mesclar ramificações com o mesmo conteúdo).

Em vez de usar o modo padrão, você pode passar o sinalizador --full-history em seu arquivo e ver se o commit "ausente" aparece dessa maneira:

git log --full-history -- backend/theimportantfile.js

Do git log docs:

  

--full-history
  O mesmo que o modo padrão, mas não remove algum histórico.

Editar

Eu sei que isso funciona algumas vezes porque eu experimentei uma situação em que eu tinha um commit X in master que continha uma alteração em um arquivo theFile . Commit X foi então escolhido em anotherBranch por um colega de trabalho, então vamos chamar o novo commit Y . Então anotherBranch foi mesclado em master .

Quando fizemos

git log -- theFile

não veríamos Y na lista de confirmações, apenas X , mas quando usamos

git log --full-history -- theFile

somente então X e Y aparecerão. Eu acho que o Git não mostrou Y por padrão porque introduziu uma mudança idêntica no estado final da árvore de commit, já que ela foi escolhida a partir de X .

    
por user456814 25.05.2013 / 19:08
fonte
1

Parece que ele pode ter tido um conflito de mesclagem e resolvido aceitando sua versão (que provavelmente era um arquivo inexistente) em vez da sua. Você pode trazer o arquivo de volta. Veja como ressuscitar um arquivo ou pasta

    
por shadowland 27.10.2011 / 18:16
fonte