git blame
é ótimo para linhas modificadas e adicionadas, mas como posso descobrir quando uma linha que existia em uma confirmação anterior específica foi excluída? Estou pensando bisect
, mas esperava algo mais prático.
(Antes que você pergunte: neste caso, eu apenas fiz uma git log -p
e procurou através da linha de código e (a) algum idiota tinha apenas excluída a linha vital na submissão anterior e (b) eu era aquele idiota.)
git log -S<string> /path/to/file
deseja-c
ou-cc
que também mostre remoções durante a mesclagem (conflitos) #-c
e--cc
. @Steen: Correto, obrigado por apontar! Supervisão estúpida. Gostaria de poder editar o comentário. Adicionar um novo, depois excluir o meu e excluir o seu é muito complicado, eu acho :) #git blame
que tivesse uma opção para mostrar as linhas excluídas (talvez com tachado ou texto em vermelho) com a revisão na qual elas foram excluídas.Respostas:
Se você conhece o conteúdo da linha, este é um caso de uso ideal para:
que mostra as confirmações que introduzem ou removem uma instância dessa sequência. Há também o
-G<regex>
que faz a mesma coisa com expressões regulares! Consulteman git-log
e pesquise as opções-G
e-S
, ou a picareta (o nome amigável para esses recursos) para obter mais informações.A
-S
opção também é realmente mencionada no cabeçalho da página degit-blame
manual, na seção de descrição, onde fornece um exemplo usandogit log -S...
.fonte
git blame --reverse
método encontrou-lo embora.)-c
opção adicionalmente.Eu acho que o que você realmente quer é
Na página de manual :
Com
git blame reverse
, você pode encontrar a última confirmação na qual a linha apareceu. Você ainda precisa obter a confirmação que vem depois.Você pode usar o seguinte comando para mostrar um log git invertido. A primeira confirmação mostrada será a última vez que a linha aparecer e a próxima confirmação será quando ela for alterada ou removida.
fonte
git blame --reverse
a revisão será mostrada antes da mesclagem cronologicamente por último, não a revisão antes da mesclagem inicial em que a decisão foi tomada para não seguir a linha. Existe alguma maneira de encontrar a revisão mais antiga em que a linha parou de existir e não a mais recente?Apenas para completar a resposta de Cascabel :
Eu tive o mesmo problema mencionado aqui, mas a linha estava faltando, porque um commit de mesclagem de um ramo foi revertido e depois mesclado novamente, removendo efetivamente a linha em questão. A
--full-history
sinalização evita ignorar essas confirmações.fonte
git blame --reverse pode chegar perto de onde a linha é excluída. Mas, na verdade , não aponta para a revisão em que a linha é excluída. Aponta para a última revisão em que a linha estava presente . Então, se a revisão a seguir é uma confirmação simples, você tem sorte e obteve a revisão de exclusão. OTOH, se a revisão a seguir for um commit de mesclagem , as coisas podem ficar um pouco selvagens.
Como parte do esforço para criar o difflame , lidei com esse mesmo problema. Se você já possui o Python instalado na sua caixa e deseja experimentá-lo, não espere mais e informe-me como ele está.
https://github.com/eantoranz/difflame
fonte
Para alterações ocultas em confirmações de mesclagem
As confirmações de mesclagem automaticamente ocultam suas alterações na saída do log do Git. Ambos picareta e reverse-culpa não encontrou a mudança. Então a linha que eu queria tinha sido adicionada e removida mais tarde e eu queria encontrar a mesclagem que a removeu. O
git log -p -- path/file
histórico do arquivo apenas mostrou que ele foi adicionado. Aqui está a melhor maneira que encontrei para encontrá-lo:git log -p -U9999 -- path/file
Pesquise a alteração e, em seguida, pesquise "^ commit" - o primeiro "^ commit" é o commit em que o arquivo tinha essa linha pela última vez. O segundo "^ commit" é depois que desapareceu. O segundo commit pode ser o que o removeu. O
-U9999
objetivo é mostrar o conteúdo inteiro do arquivo (após cada vez que o arquivo foi alterado), assumindo que seus arquivos tenham no máximo 9999 linhas.Localiza todas as mesclagens relacionadas via força bruta (difira cada confirmação de mesclagem possível com seu primeiro pai, execute várias toneladas de confirmações)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(Tentei restringir mais o filtro de revisão, mas encontrei problemas e não o recomendo. As alterações de adição / remoção que eu procurava estavam em ramos diferentes que foram mesclados em momentos diferentes e A ... B não incluiu quando as alterações foram mescladas na linha principal.)
Mostre uma árvore Git com esses dois commits (e muito do histórico complexo do Git foi removido):
git log --graph --oneline A B ^$(git merge-base A B)
(A é o primeiro commit acima, B é o segundo commit acima)Mostrar histórico de A e histórico de B menos histórico de A e B.
Versão alternativa (parece mostrar o caminho mais linearmente do que a árvore de histórico regular do Git - no entanto, eu prefiro a árvore de histórico regular do Git):
Três, não dois pontos - três pontos significa "r1 r2 - e não $ (git merge-base - todos os r1 r2). É o conjunto de confirmações que é acessível a partir de r1 (lado esquerdo) ou r2 (direita lado), mas não de ambos. " - fonte: "man gitrevisions"
fonte