É possível fazer com que o git produza uma diferença entre um arquivo específico como ele existe agora e como existia antes da última confirmação que o alterou?
Ou seja, se soubermos:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Em seguida, git diff 456def myfile
mostra a última alteração no myfile. É possível fazer o mesmo sem o conhecimento produzido pelo git log
; o que mudou no 123abc?
git diff HEAD^ <file_path>
HEAD^
é123abc
,HEAD^^
é456def
, e se havia outros commits que não afetaram esse arquivo , em seguida,HEAD^
se refere a eles)Respostas:
Isso existe, mas na verdade é um recurso de
git log
:Observe que
-p
também pode ser usado para mostrar o diff inline de um único commit:Opções utilizadas:
-p
(também-u
ou--patch
) está oculto nagit-log
página de manual e, na verdade, é uma opção de exibição paragit-diff
. Quando usado comlog
, mostra o patch que seria gerado para cada confirmação , juntamente com as informações de confirmação - e oculta as confirmações que não tocam na especificada<path>
. (Esse comportamento é descrito no parágrafo--full-diff
a seguir, o que faz com que o diff completo de cada confirmação seja mostrado.)-1
mostra apenas a alteração mais recente no arquivo especificado (-n 1
pode ser usado em vez de-1
); caso contrário, todas as diferenças diferentes de zero desse arquivo serão mostradas.--follow
é necessário para ver as alterações que ocorreram antes de uma renomeação.Até onde sei, essa é a única maneira de ver imediatamente o último conjunto de alterações feitas em um arquivo sem usar
git log
(ou semelhante) para contar o número de revisões intermediárias ou determinar o hash da confirmação.Para ver alterações nas revisões mais antigas, basta rolar pelo log ou especificar uma confirmação ou marca a partir da qual iniciar o log. (Obviamente, especificar uma confirmação ou marca retorna ao problema original de descobrir qual é a confirmação ou marca correta.)
Crédito onde o crédito é devido:
log -p
graças a esta resposta .--follow
opção.-n 1
opção e a atatko por mencionar a-1
variante.-p
"significa" semanticamente.fonte
git log -p filename
-n 1
parâmetro.git log -p -n 1 filename
-n 1
também pode ser substituído por-1
, não altera o resultado, apenas prefiro a sintaxe:git log -p -1 filename
git log -p -1 --skip=1 <path>
para exibir a segunda confirmação.Uma das maneiras de usar o git diff é:
E uma maneira comum de referir um commit do último commit é como um caminho relativo para o HEAD real. Você pode referenciar confirmações anteriores como HEAD ^ (no seu exemplo, será 123abc) ou HEAD ^^ (456def no seu exemplo), etc ...
Portanto, a resposta para sua pergunta é:
fonte
HEAD^
, mas é claro que isso não produziu nada. Não pensou em tentarHEAD^^
.HEAD~2
HEAD^^ myfile
realmente se refere ao penúltimo commit que foi alteradomyfile
; ele se referirá ao penúltimo commit geral. Existe alguma maneira de especificar "Quero ver a última alteração feita neste arquivo" sem especificar (parte de) o hash de confirmação ou contar o número de confirmações entre a última alteração feita nesse arquivo e a revisão atual?git log -p
está bem perto.Se você estiver bem usando uma ferramenta gráfica, isso funciona muito bem:
O gitk agora mostra todos os commits nos quais o arquivo foi atualizado. Marcar uma confirmação mostrará a diferença em relação à confirmação anterior na lista. Isso também funciona para diretórios, mas você também pode selecionar o arquivo a ser diferenciado para a confirmação selecionada. Super útil!
fonte
git difftool HEAD^ file
ougit difftool -d HEAD^ path