Existe alguma maneira de o git fornecer um log de confirmação para apenas confirmações que tocavam uma linha específica de um arquivo?
Como git blame
, mas git blame
mostrará o ÚLTIMO commit que tocou em uma linha específica.
Eu realmente gostaria de obter um log semelhante, não a lista de confirmações para qualquer lugar do arquivo, mas apenas as confirmações que tocavam uma linha específica.
Respostas:
Veja também Git: descubra quais confirmações já tocaram em várias linhas .
Desde o Git 1.8.4 ,
git log
é-L
necessário visualizar a evolução de uma série de linhas.Por exemplo, suponha que você observe a
git blame
saída de. Aqui-L 150,+11
significa "apenas olhe as linhas 150 a 150 + 11":E você quer conhecer a história do que é agora a linha 155.
Então use
git log
. Aqui,-L 155,155:git-web--browse.sh
significa "rastrear a evolução das linhas 155 a 155 no arquivo chamadogit-web--browse.sh
".fonte
git log commitA-hash -L 155,155:file-name
?Você pode obter um conjunto de confirmações usando o picareta.
Isso fornecerá todos os commits que afetaram esse texto nesse arquivo. Se o arquivo foi renomeado em algum momento, você pode adicionar --follow-parent.
Se você deseja inspecionar os commits em cada uma dessas edições, pode canalizar o resultado para o git show:
fonte
git log -S'the previous version of the line'
e assim por diante, exatamente como você terminariagit blame -L
. E será muito mais lento do quegit blame
, já que ele precisa procurar o texto em qualquer lugar, não apenas no local indicado.Tente usar o comando abaixo implementado no Git 1.8.4.
Então, no seu caso
upperLimit
elowerLimit
é o tocadoline_number
Mais informações - https://www.techpurohit.com/list-some-useful-git-commands
fonte
--pretty=short
é ignorado ao usar-L
. CorrijaUma maneira extremamente fácil de fazer isso é usar vim-fugitive . Basta abrir o arquivo no vim, selecione as linhas que você está interessado em usar
V
e digiteAgora você pode usar
:cnext
e:cprev
ver todas as revisões do arquivo em que essa linha é modificada. A qualquer momento, insira:Gblame
para ver as informações de sha, autor e data.fonte
Simplificando a resposta de @ matt -
git blame -L14,15 -- <file_path>
Aqui você será culpado por algumas falas
14 to 15
.Como a
-L
opção esperaRange
como um parâmetro, não podemos obter umBlame
para uma única linha usando a-L
opção` .Referência
fonte
Não acredito que haja algo embutido para isso. Isso é complicado pelo fato de ser raro uma única linha mudar várias vezes sem que o restante do arquivo mude substancialmente também; portanto, você tenderá a acabar mudando bastante os números das linhas.
Se você tiver sorte o suficiente para que a linha sempre tenha alguma característica de identificação, por exemplo, uma atribuição a uma variável cujo nome nunca foi alterado, você pode usar a opção regex
git blame -L
. Por exemplo:Mas isso só encontra a primeira correspondência para essa expressão regular; portanto, se você não tem uma boa maneira de corresponder à linha, não é muito útil.
Você poderia hackear alguma coisa, suponho. Não tenho tempo para escrever código agora, mas ... algo nesse sentido. Corra
git blame -n -L $n,$n $file
. O primeiro campo é o commit anterior tocado e o segundo campo é o número da linha nesse commit, pois ele pode ter sido alterado. Pegue-os e execute-ogit blame -n $n,$n $commit^ $file
, ou seja, a mesma coisa iniciando no commit antes da última vez que o arquivo foi alterado.(Observe que isso falhará se a última confirmação que alterou a linha for uma confirmação de mesclagem. A principal maneira de isso acontecer se a linha for alterada como parte de uma resolução de conflito de mesclagem).
Edit: Eu deparei com esta postagem na lista de discussão de março de 2011 hoje, que menciona isso
tig
egit gui
tem um recurso que o ajudará a fazer isso. Parece que o recurso foi considerado, mas não concluído, para o próprio git.fonte
Isso exigirá
git blame
que todas as revisões significativas mostrem a linha$LINE
do arquivo$FILE
:Como sempre, a culpa mostra o número da revisão no início de cada linha. Você pode acrescentar
para obter resultados agregados, algo como uma lista de confirmações que mudaram essa linha. (Não é bem assim, se apenas o código foi movido, isso pode mostrar o mesmo ID de confirmação duas vezes para diferentes conteúdos da linha. Para uma análise mais detalhada, você teria que fazer uma comparação atrasada dos
git blame
resultados para confirmações adjacentes. )fonte
Aqui está uma solução que define um alias do git, para que você possa usá-lo assim:
Exemplo de saída:
Você pode definir o alias no seu .gitconfig ou simplesmente executar o seguinte comando
Esta é uma linha única feia, então aqui está uma função bash equivalente ofuscada:
A solução de picareta ( git log --pickaxe-regex -S'REGEX ' ) fornecerá apenas adições / exclusões de linha, e não as outras alterações da linha que contêm a expressão regular.
Uma limitação desta solução é que a culpa retorna apenas a 1ª correspondência do REGEX; portanto, se existirem várias correspondências, a recursão poderá "saltar" para seguir outra linha. Certifique-se de verificar a saída do histórico completo para identificar esses "saltos" e, em seguida, corrija o REGEX para ignorar as linhas de parasitas.
Finalmente, aqui está uma versão alternativa que executa o git show em cada commit para obter o diff completo:
fonte
Você pode misturar
git blame
egit log
comandos para recuperar o resumo de cada confirmação no comando git blame e anexá-los. Algo como o seguinte script bash + awk. Ele anexa o resumo da confirmação como comentário de código embutido.Em uma linha:
fonte
No meu caso, o número da linha mudou muito ao longo do tempo. Eu também estava no git 1.8.3, que não suporta regex no "git blame -L". (RHEL7 ainda tem 1.8.3)
Oneliner:
Obviamente, isso pode ser transformado em um script ou uma função.
fonte