Respostas:
Você precisa usar -M para permitir que o git detecte automaticamente o arquivo movido durante a difusão. Usar apenas git diff
como mencionado não funciona para mim.
Tão simplesmente: git diff -M
deve fazê-lo.
A documentação para esta opção é:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
?
git diff
. A execução git diff -M
em um único arquivo (renomeado) não informa uma renomeação.
git log --follow -- file_after_move.txt
funciona bem. Ele mostra toda a história, inclusive antes da mudança. Alguma ideia? Estou executando git version 2.11.0.windows.1
.
-C
opção para detectar cópias é útil e semelhante. Usei-o -M
para olhar para um diff em que havia refatorado um arquivo em dois (sem nenhum nome correspondente ao original).
Além do que knittl escreveu , você sempre pode usar:
git diff HEAD:./oldfilename newfilename
onde HEAD:./oldfilename
significa oldfilename no último commit (em HEAD), relativo ao diretório atual.
Se você não tiver um git novo o suficiente, teria que usar:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
para o diretório e não adicionar --
antes do commit:path
par. O Git parece ser muito exigente com sintaxe aqui.
<commit-ish>:<pathname>
sintaxe é um identificador de objeto, algo como Git-ish; depois que o --
Git espera apenas nomes de arquivos.
Com o git 2.9 (junho de 2016), você não precisará -M
mais adicionar . git diff
usa -M
por padrão.
Consulte commit 5404c11 , commit 9501d19 , commit a9276a6 , commit f07fc9e , commit 62df1e6 (25 de fevereiro de 2016) por Matthieu Moy ( moy
) .
(Mesclado por Junio C Hamano - gitster
- na confirmação 5d2a30d , 03 de abril de 2016)
diff
: ativardiff.renames
por padrãoA detecção de renomeação é um recurso muito conveniente, e os novos usuários não precisam procurar na documentação para se beneficiar.
As possíveis objeções à ativação da detecção de renomeação são que, às vezes, falha e às vezes é lento. Mas a detecção de renomeação já está ativada por padrão em vários casos como "
git status
" e "git merge
", portanto, a ativaçãodiff.renames
não altera fundamentalmente a situação. Quando a detecção de renomeação falha, ela agora falha consistentemente entre "git diff
" e "git status
".Essa configuração não afeta os comandos de encanamento, portanto, scripts bem escritos não serão afetados.
git diff -M
ativa a detecção de renomeação como outros disseram (e como o @VonC apontou, ela é ativada por padrão no git 2.9). Mas se você tiver um grande conjunto de alterações, a detecção inexata de renomeação ainda poderá ser desativada novamente. O Git exibirá um aviso como o seguinte, fácil de perder em meio ao diff que você está visualizando:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
Nesse caso, defina a opção de configuração conforme sugerido pelo git, por exemplo
git config diff.renamelimit 450
e execute novamente o seu comando diff.
Por qualquer motivo, usar HEAD:./oldfilename
(ou caminho absoluto) não funcionou para mim, mas HEAD:oldfilename
funcionou (obrigado cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
simplesmente execute git diff
sem argumentos, ou git diff -- newfilename
. O git é inteligente o suficiente para comparar os arquivos / conteúdos corretos (ou seja, conteúdo original antes de renomear com conteúdo alterado após renomear)
git mv
inserir um único arquivo e comparar o estado faseado com outro ramo idêntico produzirá a diferença "tudo foi excluído e recriado novamente", a menos que -M
seja usado.
git diff -- yourRenamedFile
será suficiente. Veja minha resposta abaixo