Existe uma maneira de listar todos os commits que alteraram um arquivo específico?
Existe uma maneira de listar todos os commits que alteraram um arquivo específico?
Respostas:
Os --follow
trabalhos para um arquivo específico
git log --follow -- filename
Diferença para outras soluções dadas
Observe que outras soluções incluem git log path
(sem o --follow
). Essa abordagem é útil se você deseja acompanhar, por exemplo, alterações em um diretório , mas tropeça quando os arquivos são renomeados (portanto, use --follow filename
).
--follow
contas para renomeações, então isso é mais robusto do quegit log -- path
--follow
aceita um caminho , que pode ser um arquivo, mas também um diretório. No caso deste último, ele será executado recursivamente e relatará alterações em todos os arquivos abaixo desse ponto. (Este comportamento não está documentado na página de manual e não pode ser permanente.)
git log filename?
git log filename
não segue a renomeação de arquivos, ou seja, mostrará todos os commits relativos a esse nome de arquivo (não ao arquivo real). Se você criar arquivos X
e Y
, alterou os dois, excluiu Y
e renomeou X
para Y
e também os alterou, e executar git log Y
, você receberá mensagens para o antigo Y
e o novo . E o contrário, --follow
você receberá confirmações sobre esse arquivo quando ele foi nomeado X
e quando ele foi nomeado Y
.
git log path
deve fazer o que quiser. Do git log
homem :
[--] <path>…
Show only commits that affect any of the specified paths. To prevent confusion with
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
Eu estive olhando isso de perto e todas essas respostas não parecem realmente me mostrar todos os commits em todos os ramos.
Aqui está o que eu descobri brincando com as opções de exibição de edição do gitk. Isso mostra todas as confirmações para um arquivo, independentemente da ramificação, local, reflog e remoto.
gitk --all --first-parent --remotes --reflog --author-date-order -- filename
Também trabalha com git log
:
git log --all --first-parent --remotes --reflog --author-date-order -- filename
--reflog
inclui confirmações que foram reformuladas / alteradas ou descartadas. Talvez isso deva ser óbvio, mas tentei usar isso git log
e estava tentando descobrir por que estava vendo confirmações aparentemente duplicadas!
Use o comando abaixo para obter confirmações para um arquivo específico:
git log -p filename
git log -p mybranch -- filename
ou apenas usar git log --all -- filename
para procurar em todos os ramos.
Deve ser tão simples quanto git log <somepath>
; verifique a página de manual ( git-log(1)
).
Pessoalmente, gosto de usar git log --stat <path>
para poder ver o impacto de cada confirmação no arquivo.
-p
se você quiser ver o diff completo, não apenas que ele teve algum número de linhas modificadas.
git show
em seguida, nos commits específicos que parecem ser importantes.
Como alternativa (desde o Git 1.8.4), também é possível obter todos os commits que alteraram uma parte específica de um arquivo. Você pode obter isso passando a linha inicial e o número da linha final.
O resultado retornado seria a lista de confirmações que modificaram esta parte específica. O comando é como:
git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
onde upperLimit
está o start_line_number
e lowerLimit
é oending_line_number
Mais informações - https://www.techpurohit.com/list-some-useful-git-commands
Como jackrabb1t apontou, --follow
é mais robusto, pois continua listando o histórico além de renomear / mover. Portanto, se você estiver procurando por um arquivo que não esteja atualmente no mesmo caminho ou que tenha sido renomeado por várias confirmações, --follow o rastreará.
Essa pode ser uma opção melhor se você deseja visualizar as alterações de nome / caminho:
git log --follow --name-status -- <path>
Mas se você quiser uma lista mais compacta, apenas com o que importa:
git log --follow --name-status --format='%H' -- <path>
ou mesmo
git log --follow --name-only --format='%H' -- <path>
A desvantagem é que --follow
só funciona para um único arquivo.
--follow
funciona para um único caminho , que pode ser um diretório. Se for aprovado em um diretório, ele será executado recursivamente e relatará alterações em todos os arquivos abaixo desse ponto.
Se você está tentando - seguir um arquivo excluído em uma confirmação anterior, use
git log --follow -- filename
git
iniciantes: use git log -p --follow -- filename
para exibir as alterações também. Observe também: "filename" pode ser um arquivo, um diretório ou um submódulo.
Se você deseja visualizar todas as confirmações que alteraram um arquivo, em todas as ramificações, use o seguinte:
git log --follow --all <filepath>
Se você deseja procurar todos os commits por filename
e não por filepath
, use:
git log --all -- '*.wmv'
Se você deseja ver todas as alterações feitas nas confirmações que alteraram um arquivo específico (em vez de apenas as alterações feitas no próprio arquivo), você pode passar --full-diff
:
git log -p --full-diff [branch] -- <path>
[branch]
gitk <path_to_filename>
Supondo que o pacote "gitk" já esteja instalado.
Se não estiver instalado, faça o seguinte:
sudo apt-get install gitk
E tente o comando acima. É para Linux ... Pode ajudar os usuários de Linux se eles querem uma GUI.
gitk
pacote inclui o Git for Windows.
Para obter apenas uma lista dos hashes de confirmação, use git rev-list
git rev-list HEAD <filename>
Resultado:
b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d
o que significa que 5 confirmações tocaram neste arquivo. É a ordem cronológica inversa, portanto, o primeiro commit na lista b7c4f0d7
é o mais recente.
No Linux, você pode usar o gitk para isso.
Pode ser instalado usando "sudo apt-get install git-gui gitk". Ele pode ser usado para ver confirmações de um arquivo específico por "gitk <Filename>".
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>
# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>