it-swarm-pt.tech

git diff não fornece saída

Se eu executar git diff Eu esperaria ver uma lista de alterações do meu diretório de trabalho em relação ao que havia sido confirmado antes (ou uma lista do conteúdo do diretório de trabalho, se for um novo repositório sem confirmação). Tente este exemplo:

$ mkdir temp
$ cd temp
$ git init
$ echo "first line" > test.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.txt
nothing added to commit but untracked files present (use "git add" to track)

Vamos ver um diff do test.txt:

$ git diff

Isso não dá saída!

Eu esperaria ver um diff como + first line mas não recebo nada. Não me diz o que está acontecendo. As pessoas no stackoverflow me dizem para git add alguns arquivos, então eu faço:

$ git add .
$ git diff

Nada ainda!

Git GUI mostra as alterações.

git status -v mostra as alterações.

Mas por algum motivo git diff não mostra nada.

Então, minhas perguntas são:

  1. Como, em inglês simples, git diff trabalhos?
  2. Como posso mostrar um diff de todas as alterações que fiz (sem etapas e preparadas)?

Algumas pessoas na minha empresa estão usando o git, mas a multidão do SVN vai apontar isso como um caso em que o git é muito confuso para ser utilizável.

44
blokeley

Por que você não obtém diff git antes de adicionar?

o git não trata os arquivos no sistema de arquivos como incluídos automaticamente no sistema de controle de versão, você deve adicionar coisas explicitamente ao repositório git (como você está fazendo adicionando o diretório atual com git add .).

Não há saída para git diff porque o git não vê mudanças dentro seu repositório, apenas arquivos fora o repositório, que ele considera 'não rastreado' e, portanto, ignora ao gerar um diff.

Eu encontrei essa uma das principais diferenças para vcs como svn (junto com os diretórios de teste e ignorando).

Se você deseja que os arquivos não rastreados sejam incluídos, git add eles.

Se você não os quiser no seu repositório, adicione-os ao seu .gitignore (Vejo git ignore --help). Isso é bom para arquivos de objeto C ou python .pyc arquivos.

Por que não recebo nenhuma diferença de git após adicionar ?!

Então isso é um pouco diferente. Se você fizer git status você verá que o arquivo está agora na área de preparação. Essa é a área dos arquivos que você está prestes a confirmar.

Quando você git add um novo arquivo no repositório git pula a cópia de trabalho e vai direto para a área de preparação. Isso faz sentido de uma maneira, git add sempre move os arquivos para a área intermediária, sejam eles rastreados ou não.

Para ver as diferenças entre o último check-in e a área de preparação, faça git diff --cached.

Para ver as diferenças entre a área de preparação e sua cópia de trabalho, faça git diff. Se não houver nada na área de preparação, é o mesmo que fazer uma diferença entre o último check-in e sua cópia de trabalho.

63
m0tive

Eu já vi situações em que realmente deveria produzir saída de git diff mas não há; adicionando
--no-pager entre git e diff FUNCIONA:

git --no-pager diff

... assim como definir explicitamente o pager como less com

git config --global core.pager 'less'

Mesmo que less seja o pager padrão.

Isso foi no Ubuntu 12.04 LTS. Estou adicionando isso caso outras pessoas com o mesmo problema procurem uma solução e as opções acima não respondam à pergunta.

Encontrei as informações sobre as configurações do pager em os documentos do git .

27
Dan Tenenbaum

1.Como, em inglês simples, o git diff funciona?

Quão git diff funciona tudo depende de quais parâmetros você passa para ele.

Dependendo dos parâmetros, git diff mostrará as alterações entre dois commits, ou entre um commit e a árvore de trabalho, etc ...

Por exemplo, git diff, git diff --staged e git diff HEAD são descritos mais abaixo.

2.Como posso mostrar uma diferença de todas as alterações que fiz (sem etapas e com etapas)?

Usando os dois comandos git diff HEAD e git diff --staged.

Mas no caso de um repositório criado com git init, a pergunta realmente não faz sentido e git diff HEAD não pode ser usado: o histórico está vazio, não há confirmação nem HEAD ainda!


  • git diff mostra as alterações em sua árvore de trabalho em relação ao último commit, apenas para arquivos rastreados

  • git diff HEAD mostra as alterações na sua árvore de trabalho em relação ao último commit (inclui arquivos que não são rastreados)

  • git diff --staged (ou seu sinônimo git diff --cached) mostra as alterações que você preparou para o próximo commit em relação ao último commit

Existem muitas outras maneiras de chamar git diff, para comparar confirmações ou ramificações arbitrárias, etc. Invoque git help diff para ler mais sobre isso.

3
Bludzee

Baseando-se no seu git status saída não há nada para mostrar para git diff sem parâmetros adicionais. Não há nada para mostrar para git diff --cached e git diff HEAD como todos esses comandos dependem de alterações já conhecidas pelo git.

Você não possui arquivos temporários e nenhum arquivo alterado daqueles que estão sob controle de versão agora.

Depois de adicionar test.txt sob git controle, você obterá a saída desejada.

Apenas digite

git add test.txt

ou

git add .

Que esse arquivo será adicionado sob controle de versão. E as alterações futuras deste arquivo serão mostradas pelo git diff.

3
lig

Eu tive um LESS=-R conjunto de variáveis ​​de ambiente. Isso fez git diff mostra uma tela em branco.

A solução para mim:

unset LESS
2
fafl

Isso está realmente relacionado às configurações do pager.

Descobri que incluir '-e' em

export PAGER=less LESS=-cse

ajuda.

Sem o '-e', less será encerrado na primeira página. De alguma forma, o git não se incomodará em exibir a saída nesse caso.

1
Henk Langeveld

Você não precisa de nenhum sinalizador adicional para que o git diff funcione. Primeiro, você cria um arquivo e o adiciona ao repositório git com o git add no teste e ou executa um commit do git para colocá-lo no seu repositório. Agora, vá para o arquivo, faça uma alteração e salve-o. Basta colocar uma frase lá dizendo "Vou executar o comando" git diff "logo após salvá-lo". Salve isso. É nesse ponto que você verá a diferença quando executar o comando git diff. Ele mostrará as alterações recentes antes da execução de um "git commit" ou se você apenas colocou o arquivo inicialmente no teste.

\TestGit>git diff File2.txt
diff --git a/File2.txt b/File2.txt
index e2ba019..eff7299 100644
--- a/File2.txt
+++ b/File2.txt
@@ -6,4 +6,6 @@ File two. Which is the second file that I will NOT add with the first file File1

 The goal here is to add the File1 but not the File 2

-using git add File1.txt
\ No newline at end of file
+using git add File1.txt.
+
+So far I have just done a git add on this file.
\ No newline at end of file

As linhas com os sinais + são o conteúdo adicionado. Se você usar o sinalizador --cached e obter resultado, s, seu status git para o mesmo arquivo deve informar que o arquivo não foi confirmado. Depois de confirmar o arquivo, você não obterá nenhuma saída para o git diff. mesmo com o sinalizador --cached.

0
H-man