Eu tenho um arquivo a.txt
.
cat a.txt
> hello
O conteúdo de a.txt
é "olá".
Eu me comprometo.
git add a.txt
git commit -m "first commit"
Eu então mudo a.txt
para um test
dir.
mkdir test
mv a.txt test
Eu então faço meu segundo commit.
git add -A
git commit -m "second commit"
Finalmente, edito a.txt
para dizer "adeus" em vez disso.
cat a.txt
> goodbye
Eu faço meu último compromisso.
git add a.txt
git commit -m "final commit"
Agora, aqui está a minha pergunta:
Como faço para diferenciar o conteúdo a.txt
entre meu último commit e meu primeiro commit?
Eu tentei:,
git diff HEAD^^..HEAD -M a.txt
mas não funcionou. git log --follow a.txt
detecta corretamente a renomeação, mas não consigo encontrar um equivalente para git diff
. Existe um?
Respostas:
O problema com a diferença entre
HEAD^^
eHEAD
é que você tem uma.txt
em ambos os commits, então apenas considerando esses dois commits (que é o que diff faz), não há renomeação, há uma cópia e uma mudança.Para detectar cópias, você pode usar
-C
:Resultado:
A propósito, se você restringir seu diff a apenas um caminho (como você faz em
git diff HEAD^^ HEAD a.txt
você nunca vai ver os renomeamentos ou cópias porque você excluiu tudo, exceto um único caminho e renomeia ou copia - por definição - envolve dois caminhos.fonte
-- <old-path> <new-path>
... veja minha resposta.git show -C [commit]
e ele reconheceu o arquivo renomeado e me mostrou o diff entre os arquivos. Perfeito.Para diferenciar a renomeação de um arquivo específico, use
-M -- <old-path> <new-path>
(-C
também funciona).Portanto, se você renomeou e alterou um arquivo no último commit, poderá ver as alterações com:
Isso produz:
(
// a.txt
linhas adicionadas para ajudar o git a detectar a renomeação)Se o git não estiver detectando a renomeação, você pode especificar um limite de baixa similaridade com
-M[=n]
, digamos, 1%:Dos documentos do git diff :
fonte
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Você também pode fazer:
git diff rev1:file1 rev2:file2
que, para o seu exemplo, seria
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Observe o explícito
./
- caso contrário, esse formato assume que os caminhos são relativos à raiz do repo. (Se você estiver na raiz do repo, é claro que pode omitir isso.)Isso não depende da detecção de renomeação, pois o usuário está explicitamente informando exatamente o que comparar. (Portanto, também é útil em algumas outras circunstâncias, como comparar arquivos entre diferentes ramos svn em um ambiente git-svn.)
fonte
Se sua renomeação de commit foi testada, mas ainda não foi confirmada, você pode usar:
fonte