Como posso visualizar o histórico de alterações de um arquivo individual no Git, detalhes completos com o que mudou?
Eu cheguei até:
git log -- [filename]
que me mostra o histórico de consolidação do arquivo, mas como faço para obter o conteúdo de cada uma das alterações no arquivo?
Estou tentando fazer a transição do MS SourceSafe e isso costumava ser um simples right-click
→ show history
.
Respostas:
Para isso, eu usaria:
ou para seguir o nome do arquivo e renomear
fonte
Você pode usar
para permitir que o git gere os patches para cada entrada de log.
Vejo
para mais opções - ele pode realmente fazer muitas coisas legais :) Para obter apenas o diff de um commit específico, você pode
ou qualquer outra revisão por identificador. Ou use
para procurar as alterações visualmente.
fonte
git log --follow -p -- path-to-file
Isso mostrará todo o histórico do arquivo (incluindo o histórico além de renomear e com diffs para cada alteração).
Em outras palavras, se o arquivo nomeado
bar
já tiver sido nomeadofoo
,git log -p bar
(sem a--follow
opção) mostrará apenas o histórico do arquivo até o ponto em que foi renomeado - ele não mostrará o histórico do arquivo quando conhecido comofoo
. O usogit log --follow -p bar
exibirá o histórico inteiro do arquivo, incluindo quaisquer alterações no arquivo quando ele era conhecido comofoo
. A-p
opção garante que as diferenças sejam incluídas para cada alteração.fonte
--follow
garante que você veja as renomeações de arquivos (2.)-p
garante que você veja como o arquivo é alterado (3.) é apenas linha de comando.--
foi adicionado, mas não sei por que isso o torna melhor? O que é que faz?--
opção informa ao Git que chegou ao final das opções e que tudo o que se segue--
deve ser tratado como argumento. Poisgit log
isso só faz diferença se você tiver um nome de caminho que comece com um traço . Digamos que você queira conhecer o histórico de um arquivo com o nome infeliz "--follow":git log --follow -p -- --follow
--
é útil porque também pode proteger contrarevision
nomes que correspondam ao nome do arquivo digitado, o que pode ser assustador. Por exemplo: Se você tivesse uma ramificação e um arquivo nomeadosfoo
,git log -p foo
mostraria até o histórico do log do gitfoo
, não o histórico do arquivofoo
. Mas o @DanMoulding está certo que, como o--follow
comando usa apenas um único nome de arquivo como argumento, isso é menos necessário, pois não pode ser arevision
. Eu acabei de aprender isso. Talvez você estivesse certo em deixar isso de fora da sua resposta; Não tenho certeza.Se você preferir ficar com base em texto, convém usar o tig .
Instalação rápida:
# apt-get install tig
$ brew install tig
Use-o para visualizar o histórico em um único arquivo:
tig [filename]
ou procure o histórico detalhado de repositórios:
tig
Semelhante ao
gitk
mas baseado em texto. Suporta cores no terminal!fonte
tig -- path/to/specific/file
git whatchanged -p filename
também é equivalente agit log -p filename
neste caso.Você também pode ver quando uma linha de código específica dentro de um arquivo foi alterada
git blame filename
. Isso imprimirá um ID de confirmação curto, o autor, o carimbo de data e hora e a linha de código completa para todas as linhas do arquivo. Isso é muito útil depois que você encontra um bug e deseja saber quando ele foi introduzido (ou quem foi a culpa).fonte
filename
não é opcional no comandogit blame filename
.Usuários do SourceTree
Se você usar o SourceTree para visualizar seu repositório (é gratuito e bastante bom), clique com o botão direito do mouse em um arquivo e selecione Log Selecionado
A exibição (abaixo) é muito mais amigável que o gitk e a maioria das outras opções listadas. Infelizmente (no momento) não há uma maneira fácil de iniciar essa exibição na linha de comando - a CLI do SourceTree atualmente apenas abre repositórios.
fonte
Para mostrar qual revisão e autor modificou pela última vez cada linha de um arquivo:
ou se você quiser usar a poderosa GUI de culpa:
fonte
Resumo de outras respostas depois de ler e tocar um pouco:
O comando de linha de comando usual seria
Mas você também pode usar o gitk (gui) ou o tig (text-ui) para fornecer maneiras muito mais legíveis para o ser humano.
Sob debian / ubuntu, o comando de instalação para essas ferramentas encantadoras é o esperado:
E atualmente estou usando:
para que eu possa digitar
gdf dir
para obter um histórico focado de tudo no subdiretóriodir
.fonte
--all
é para todos os ramos, o resto é explicado em @ Dan respostaAdicione este alias ao seu .gitconfig:
E use o comando como este:
A saída será quase exatamente igual à saída do gitk. Aproveitar.
fonte
git lg -p filename
- ele retorna uma bela diff do arquivo pesquisado.Ultimamente eu descobri
tig
e achei muito útil. Há alguns casos em que eu gostaria que fosse A ou B, mas na maioria das vezes é bem legal.Para o seu caso,
tig <filename>
pode ser o que você está procurando.http://jonas.nitro.dk/tig/
fonte
Você pode usar o vscode com o GitLens , é uma ferramenta muito poderosa. Após instalar o GitLens, vá para a guia GitLens, selecione
FILE HISTORY
e você pode navegar por ele.fonte
Eu escrevi git-playback para esse propósito exato
Isso tem o benefício de exibir os resultados na linha de comando (como
git log -p
) e também permitir que você percorra cada confirmação usando as teclas de seta (comogitk
).fonte
Ou:
gitx -- <path/to/filename>
se você estiver usando gitx
fonte
Você também pode tentar isso, listando os commits que alteraram uma parte específica de um arquivo (implementado no Git 1.8.4).
O resultado retornado seria a lista de confirmações que modificaram esta parte específica. Comando:
em que upperLimit é o número_de_instrução e lowerLimit é o número de linha de término do arquivo.
Mais detalhes em https://www.techpurohit.com/list-some-useful-git-commands
fonte
Se você quiser ver todo o histórico de um arquivo, inclusive em todas as outras ramificações, use:
fonte
Com as excelentes Git Extensions , você chega a um ponto no histórico em que o arquivo ainda existia (se tiver sido excluído, caso contrário, vá para HEAD), alterne para a
File tree
guia, clique com o botão direito do mouse no arquivo e escolhaFile history
.Por padrão, ele segue o arquivo através das renomeações e a
Blame
guia permite ver o nome em uma determinada revisão.Ele tem algumas dicas menores, como aparecer
fatal: Not a valid object name
naView
guia ao clicar na revisão de exclusão, mas eu posso conviver com isso. :-)fonte
Se você estiver usando a GUI do git (no Windows) no menu Repositório, poderá usar "Visualizar histórico do mestre". Destaque uma confirmação no painel superior e um arquivo no canto inferior direito e você verá o diff dessa confirmação no canto inferior esquerdo.
fonte
SmartGit :
fonte
A resposta que eu estava procurando e que não estava nesse segmento é ver as alterações nos arquivos que eu havia preparado para confirmar. ie
fonte
git diff origin/master
para mostrar as diferenças completas entre sua filial local e a filial principal (que podem ser atualizadas de forma remota viagit fetch
)Se você usa o TortoiseGit, poderá clicar com o botão direito do mouse no arquivo e fazer
TortoiseGit --> Show Log
. Na janela exibida, verifique se:Show Whole Project
opção ' ' não está marcada.All Branches
opção ' ' está marcada.fonte
git diff -U <filename>
dar-lhe um diff unificado.Deve ser colorido em vermelho e verde. Caso contrário, execute:
git config color.ui auto
primeiro.fonte
Se você estiver usando o eclipse com o plug-in git, ele possui uma excelente visualização de comparação com o histórico. Clique com o botão direito do mouse no arquivo e selecione "comparar com" => "histórico"
fonte
Provavelmente, eu sou sobre onde o OP estava quando isso começou, procurando algo simples que me permita usar o git difftool com o vimdiff para revisar as alterações nos arquivos no meu repositório a partir de um commit específico. Eu não estava muito feliz com as respostas que estava encontrando, então juntei esse script git inc remental rep orter (gitincrep) juntos e isso tem sido útil para mim:
Chamado sem argumentos, isso começará no início do histórico do repositório, caso contrário, começará com o hash de confirmação abreviado que você fornecer e prosseguirá para o presente - você pode pressionar Ctrl-C a qualquer momento para sair. Qualquer argumento após o primeiro limitará os relatórios de diferença para incluir apenas os arquivos listados entre eles (que eu acho que é o que o OP queria, e eu recomendaria para todos os projetos, exceto pequenos). Se você estiver verificando alterações em arquivos específicos e quiser começar desde o início, precisará fornecer uma sequência vazia para arg1. Se você não é um usuário do vim, pode substituir o vimdiff por sua ferramenta de diff favorita.
O comportamento é gerar os comentários de confirmação quando alterações relevantes são encontradas e começar a oferecer execuções vimdiff para cada arquivo alterado (esse é o comportamento do git difftool , mas funciona aqui).
Essa abordagem provavelmente é bastante ingênua, mas, analisando muitas das soluções aqui e em um post relacionado, muitas envolveram a instalação de novas ferramentas em um sistema onde eu não tenho acesso de administrador, com interfaces que tinham sua própria curva de aprendizado. O script acima fez o que eu queria sem lidar com nada disso. Analisarei as muitas sugestões excelentes aqui quando precisar de algo mais sofisticado - mas acho que isso responde diretamente ao OP.
fonte
Eu encontrei uma solução muito simples para encontrar rapidamente o histórico do arquivo.
Isso mostraria a história de todos os commits.
fonte