Como mostro as alterações que foram testadas?

2141

Eu realizei algumas mudanças a serem confirmadas; como posso ver o diff de todos os arquivos preparados para a próxima confirmação? Estou ciente do status do git , mas gostaria de ver as diferenças reais - e não apenas os nomes dos arquivos que estão em teste.

Vi que a página de manual do git-diff (1) diz

git diff [--opções] [-] […]

Este formulário é para exibir as alterações feitas em relação ao índice (área de preparação para a próxima confirmação). Em outras palavras, as diferenças são o que você poderia dizer ao git para adicionar mais ao índice, mas ainda não o fez. Você pode preparar essas alterações usando o git-add (1).

Infelizmente, não consigo entender isso. Deve haver uma única linha útil para a qual eu possa criar um apelido, certo?

Frerich Raabe
fonte
76
git status -vfunciona também Veja minha resposta abaixo
VonC
3
@VonC Eu sempre uso isso, mas estou direcionado para less, como em: git status -v | less- pedaços gerenciáveis ​​:)
Senhor Office

Respostas:

2613

Deve ser apenas:

git diff --cached

--cachedsignifica mostrar as alterações no cache / índice (ou seja, alterações em etapas) em relação à atual HEAD. --stagedé um sinônimo para --cached.

--stagede --cachednão aponta HEAD, apenas diferença em relação a HEAD. Se você escolher o que confirmar usando git add --patch(ou git add -p), --stagedretornará o que está preparado.

CB Bailey
fonte
35
Se você quiser apenas os nomes de arquivos, faça o seguinte git diff --name-only --cachedpor post no stackoverflow.com/a/4525025/255187
Michel Hébert
4
Use isso com, em git difftool --stagedvez de git diff --stagediniciar a ferramenta visual diff padrão em cada arquivo. difftoolpode ser substituído por diffoutros argumentos também.
LightCC
E você pode usar git difftool --staged -dpara diferenciar os dois diretórios em uma ferramenta visual, em vez de um arquivo por vez.
Robert Bernstein
já que esta é marcada como resposta e mostrando primeiro ele deve incluir git diff no topo, então git [[outros]], apenas meus 2 centavos
Vitaliy Terziev
E para visualizar as alterações em um único arquivo faseado, o seguinte funcionará:git diff --cached -- <stagedfile>
ObviousChild
1605

Um gráfico simples torna isso mais claro:

Simple Git diffs

git diff

Mostra as alterações entre o diretório ativo e o índice. Isso mostra o que foi alterado, mas não é preparado para uma confirmação.

git diff --cached

Mostra as alterações entre o índice e o HEAD (que é o último commit neste ramo). Isso mostra o que foi adicionado ao índice e preparado para uma confirmação.

git diff HEAD

Mostra todas as alterações entre o diretório ativo e o HEAD (que inclui alterações no índice). Isso mostra todas as alterações desde a última confirmação, independentemente de terem sido preparadas ou não para confirmação.

Também :

Há um pouco mais de detalhes no 365Git.

Abizern
fonte
8
Receio que isso seja ingênuo (como geralmente acontece com qualquer explicação do git). Se você tiver modificações locais foo.ce não executar git add foo.c, ele nãofoo.c estará no índice ; não é preparado para confirmação. Se git diff foo.cingenuamente comparado ao trabalho foo.ccom o índice, ele teria que mostrar uma diferença gigante entre um arquivo vazio / inexistente e todo o conteúdo de foo.c. Então, de fato, quando um arquivo não existe no índice, ele git diffrecua, para esse arquivo, ao usar a HEADcópia.
Kaz
9
@ Kaz, a rigor, o índice não é uma lousa em branco. É uma cópia virtual da HEADqual as alterações faseadas são aplicadas. Lembre-se de que o Git funciona salvando alterações, não salvando arquivos inteiros. Quando você monta um arquivo, ele apenas armazena as alterações feitas. Se o índice estiver em branco como você sugere, ele não saberá como salvar as alterações no índice e precisará salvar o arquivo inteiro como "recém-adicionado" - o que está errado.
ADTC
8
@Kaz Tanto o índice como o arquivo HEADterão a versão inalterada do foo.carquivo (eles não são cópias físicas, mas apenas cópias lógicas para você e para mim. Para o Git, eles são exatamente o mesmo fluxo de dados a que todos os commit que já envolveram esse arquivo se referem. ) Então, quando você faz isso git diffno totalmente sem estágio, foo.cele não está realmente voltando ao HEADfato de estar fazendo a diferença com o Index (que por acaso contém exatamente a mesma versão do arquivo HEAD). Portanto, o gráfico está correto.
ADTC
2
Olá, gostaria de saber o que significa " índice " nesse contexto? Obrigado!
Gab是好人
2
@TomRussell git status -vé equivalente a git diff --cached(mais git statusclaro)
wisbucky
54

Se você estiver interessado em uma visualização visual lado a lado, a ferramenta difusa visual difusa pode fazer isso. Ele exibirá até três painéis se algumas, mas nem todas, as alterações forem realizadas. No caso de conflitos, haverá até quatro painéis.

Captura de tela de difusa com edições em etapas e em etapas

Invoque-o com

diffuse -m

na sua cópia de trabalho do Git.

Se você me perguntar, o melhor visual diferenciado que já vi há uma década. Além disso, não é específico para o Git: ele interopera com uma infinidade de outros VCS, incluindo SVN, Mercurial, Bazaar, ...

Veja também: Mostrar a árvore em etapas e em trabalho no git diff?

krlmlr
fonte
1
Obrigado, isso parece uma boa ferramenta. Descobri que o Meld é a melhor ferramenta de comparação visual do Linux até agora, mas senti falta de conseguir diferenciar o texto da área de transferência - o Meld requer arquivos para entrada. Difusa permite isso, bem como realinhamento manual. Vai experimentar por um tempo.
de Drew Noakes
Link quebrado para diffuse.sourceforge.net, use sourceforge.net/projects/diffuse por enquanto.
user1133275
1
brew install diffusefunciona no OS X. Não mostra três painéis se houver alterações nos estágios e nos estágios - você quis dizer alterações ainda não no índice?
Brent Faust
Qual versão do difuso você possui? Sim - se você adicionar um arquivo e modificá-lo localmente, ele deverá mostrar três painéis.
krlmlr
Você também pode configurar o diffuse como seu difftool padrão e usar esse mecanismo / ferramenta / alias embutido para iniciá-lo. Veja minha resposta aqui: < stackoverflow.com/a/45684512/6501141 >
LightCC
50

Observe que git status -v também mostra as alterações faseadas! (o que significa que você precisa ter realizado - git add- algumas alterações. Nenhuma alteração faseada, nenhuma diferença git status -v.
Faz isso desde Git 1.2.0, fevereiro de 2006 )

Em sua forma longa (padrão), git statuspossui uma opção "detalhada" não documentada que realmente exibe a diferença entre HEAD e índice.

E está prestes a se tornar ainda mais completo: consulte " Mostrar árvore em estágio e em trabalho no git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v
VonC
fonte
A última linha deve sergit diff HEAD
artur
2
@artur porque? O ponto da resposta é mencionar que git status -vvtambém inclui o que git diff HEADfaz.
VonC
Não funciona git version 1.8.3.1. Sei que é antigo, mas, se possível, observe quando esse sinalizador foi introduzido.
#
2
O @onebree 1.8.3.1 é junho de 2013, antigo. Mas git status -vé mais antigo ( github.com/git/git/commit/… , git 1.2.0, fevereiro de 2006!). Observe que ele exibe o diff entre o índice e HEAD: se você adicionou algo ao índice (no git add), git status -vnão exibirá nenhum diff. git status -v -vé mais recente (Git 2.3.4, março de 2015)
VonC 2/15
@VonC, esse foi o meu erro ... eu cometi git diff -v.
onebree
25

Você pode usar este comando.

git diff --cached --name-only

A --cachedopção de git diffmeios para obter arquivos temporários, e a --name-onlyopção significa obter apenas nomes dos arquivos.

Yash Patadia
fonte
2
Edite com mais informações. As respostas somente código e "tente isso" são desencorajadas, porque não contêm conteúdo pesquisável e não explicam por que alguém deveria "tentar fazer isso".
Abarisone 31/08/16
2
Não sei por que eu iria querer isso, com a --name-onlyopção que eu também poderia usar o regulargit status
Simon Forsberg
16

A partir da versão 1.7 e posterior, deve ser:

git diff --staged
ML13
fonte
15

USANDO UMA FERRAMENTA DIFF VISUAL

A resposta padrão (na linha de comando)

As principais respostas aqui mostram corretamente como visualizar as alterações em cache / faseadas no Index:

$ git diff --cached

ou $ git diff --stagedque é um alias.


Iniciando a ferramenta Visual Diff

A resposta padrão cuspirá as alterações diff no git bash (ou seja, na linha de comando ou no console). Para aqueles que preferem uma representação visual das diferenças de arquivo em estágios, existe um script disponível no git que lança uma ferramenta visual diff para cada arquivo visualizado, em vez de mostrá-los na linha de comando, chamada difftool:

$ git difftool --staged

Isso fará o mesmo git diff --staged, exceto quando a ferramenta diff for executada (ou seja, toda vez que um arquivo for processado por diff), ele iniciará a ferramenta visual diff padrão (no meu ambiente, isso é kdiff3 ).

Após o lançamento da ferramenta, o script git diff será pausado até que a ferramenta visual diff seja fechada. Portanto, você precisará fechar cada arquivo para ver o próximo.


Você sempre pode usar difftoolno lugar dos diffcomandos in git

Para todas as suas necessidades visuais de diferenças, git difftoolfuncionará no lugar de qualquer git diffcomando, incluindo todas as opções.

Por exemplo, para que a ferramenta visual diff seja iniciada sem perguntar se é necessário fazê-lo para cada arquivo, adicione a -yopção (acho que geralmente você vai querer isso !!):

$ git difftool -y --staged

Nesse caso, ele abrirá cada arquivo na ferramenta visual diff, um de cada vez, exibindo o próximo após o fechamento da ferramenta.

Ou observe o diff de um arquivo específico que está preparado no Index:

$ git difftool -y --staged <<relative path/filename>>

Para todas as opções, consulte a página do manual:

$ git difftool --help


Configurando a Ferramenta Visual Git

Para usar uma ferramenta visual git diferente da padrão, use a -t <tool>opção:

$ git difftool -t <tool> <<other args>>

Ou, consulte a página de manual do difftool para saber como configurar o git para usar uma ferramenta visual diferente do padrão.


Exemplos de .gitconfigentradas para vscode como ferramenta diff / merge

Parte da configuração de um difftool envolve a alteração do .gitconfigarquivo, através de comandos git que o alteram nos bastidores ou a edição direta.

Você pode encontrá-lo .gitconfigem seu diretório pessoal, como ~no Unix ou normalmente c:\users\<username>no Windows).

Ou, você pode abrir o usuário .gitconfigno seu editor Git padrão com git config -e --global.

Aqui estão exemplos de entradas no meu usuário global .gitconfigdo VS Code como ferramenta diff e ferramenta de mesclagem:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe
LightCC
fonte
14

Para comparação entre Área de armazenamento temporário e repositório (última confirmação), use

 $git diff --staged

O comando compara suas $ git add fileNamealterações faseadas ( ) com seu último commit. Se você quiser ver o que você preparou para o seu próximo commit, você pode usar o git diff --staged. Este comando compara suas alterações faseadas com seu último commit.

Para comparação de trabalho versus armazenamento temporário, use

$ git diff 

O comando compara o que está no seu diretório de trabalho com o que está na sua área de preparação. É importante observar que o git diff por si só não mostra todas as alterações feitas desde o seu último commit - apenas as alterações que ainda não foram preparadas. Se você organizou todas as suas alterações ( $ git add fileName), o git diff não fornecerá saída.

Além disso, se você preparar um arquivo ( $ git add fileName) e depois editá-lo, poderá usar o git diff para ver as mudanças no arquivo que estão preparadas e as que não estão preparadas.

Goyal Vicky
fonte
"Para trabalhar versus comparação de repositório, use $ git diff" . Tenho certeza que se git diffcompara entre Trabalhar vs Estadiamento. Veja stackoverflow.com/a/1587952
wisbucky
8

Se suas intenções são direcionar por push uma ramificação de repositório remoto e sua primeira passagem em um log de alterações de confirmação estiver incompleta, você poderá corrigir a declaração de confirmação antes de enviar dessa maneira.

Localmente

... faça algumas alterações ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... lembre-se de mais alterações não mencionadas no commit ...

git diff origin / master # veja as alterações faseadas mas não forçadas

... alterar declaração de confirmação faseada ...

git commit --amend -m"i missed mentioning these changes ...."

git push
Marc Condon
fonte
7

Se você tiver mais de um arquivo com alterações em etapas, pode ser mais prático usá-lo git add -i, selecione 6: diffe, finalmente, selecione o (s) arquivo (s) em que está interessado.

Fred Schoen
fonte
6

Por padrão, o git diff é usado para mostrar as alterações que não são adicionadas à lista de arquivos atualizados do git. Mas se você quiser mostrar as alterações que foram adicionadas ou escalonadas, precisará fornecer opções extras que permitirão ao git saber que você está interessado em diferenças de arquivos escalonados ou adicionados .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Exemplo

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Depois de adicionar os arquivos, você não poderá usar o padrão 'git diff'. Você deve fazer o seguinte: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;
Deepak Dixit
fonte
2

git guie git-colasão utilitários gráficos que permitem visualizar e manipular o índice. Ambos incluem diferenças visuais simples para arquivos em etapas e git-colatambém podem iniciar uma ferramenta de diferenciação visual lado a lado mais sofisticada.

Veja minha resposta intimamente relacionada em Como remover um arquivo do índice no git? e também este catálogo oficial de clientes Git - GUI .

nobar
fonte
0

Pense gitktambém na ferramenta, fornecida com git e muito útil para ver as mudanças

sam
fonte