Git Diff не дает никакого выхода - PullRequest
44 голосов
/ 17 декабря 2011

Если я запускаю git diff, я ожидаю увидеть список изменений моего рабочего каталога относительно того, что было зафиксировано ранее (или список содержимого рабочего каталога, если это новый репозиторий без коммитов). Попробуйте этот пример:

$ 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)

Давайте посмотрим различия в test.txt:

$ git diff

Это не дает вывода!

Я бы ожидал увидеть различие вроде + first line, но вместо этого я ничего не получил. Это не говорит мне, что происходит. Люди в stackoverflow говорят мне git add некоторые файлы, поэтому я делаю:

$ git add .
$ git diff

Все равно ничего!

Git GUI показывает изменения.

git status -v показывает изменения.

Но по какой-то причине git diff ничего не показывает.

Итак, мои вопросы:

  1. Как, на простом английском, работает git diff?
  2. Как я могу показать различия всех изменений, которые я сделал (без постановки и постановки)?

Некоторые сотрудники моей компании используют git, но толпа SVN собирается указать на это как на случай, когда git слишком запутан, чтобы его можно было использовать.

Ответы [ 7 ]

64 голосов
/ 17 декабря 2011

Почему вы не получаете git diff перед добавлением?

git не рассматривает файлы в файловой системе как автоматически включенные в систему контроля версий, вы должны явно добавлять вещи в репозиторий git (как вы делаете, добавляя текущий каталог с git add .).

Нет вывода в git diff, потому что git не видит изменений внутри вашего хранилища, только файлы за пределами хранилища, которое он считает "неотслеживаемым" и поэтому игнорирует при создании дифф.

Я обнаружил, что это одно из ключевых отличий от vcs, таких как svn (наряду с подготовкой и игнорированием каталогов).

Если вы хотите, чтобы неотслеживаемые файлы были включены, git add их.

Если вы не хотите, чтобы они были в вашем репо, добавьте их в свой .gitignore (см. git ignore --help). Это хорошо для объектных файлов C или файлов python .pyc.

Почему я не получаю git diff после добавления ? *

Так что это немного по-другому. Если вы сделаете git status, вы увидите, что файл сейчас находится в промежуточной области. Это область для файлов, которые вы собираетесь зафиксировать.

Когда вы git add добавляете новый файл в репозиторий git, он пропускает рабочую копию и попадает прямо в область подготовки. В некотором смысле это имеет смысл: git add всегда перемещает файлы в промежуточную область, независимо от того, отслеживаются они или нет.

Чтобы увидеть разницу между последним заездом и местом проведения, сделайте git diff --cached.

Чтобы увидеть различия между областью подготовки и вашей рабочей копией, выполните git diff. Если в промежуточной области ничего нет, то это то же самое, что выполнить различие между последней регистрацией и вашей рабочей копией.

26 голосов
/ 25 апреля 2014

Я видел ситуации, когда действительно должно выводиться из git diff, но это не так;добавление
--no-pager между git и diff РАБОТАЕТ:

git --no-pager diff

... так же явно устанавливается пейджер на less с

git config --global core.pager 'less'

Даже если less должен быть пейджером по умолчанию.

Это было в Ubuntu 12.04 LTS.Я просто добавляю это на тот случай, если другие люди с такой же проблемой ищут решение, и приведенное выше не отвечает на вопрос.

Я нашел информацию о настройках пейджера в git docs .

3 голосов
/ 19 февраля 2016

1.Как простым языком работает git diff?

Как работает git diff Все зависит от того, какие параметры вы передаете ему.

В зависимости от параметров, git diff будет отображать изменения между двумя коммитами или между коммитом и рабочим деревом и т. Д. *

Например, git diff, git diff --stagedи git diff HEAD описаны ниже.

2.Как я могу показать различия всех изменений, которые я сделал (без обработки и постановки)?

Используя обе команды git diff HEAD и git diff --staged.

Но в случае репозитория, только что созданного с git init, вопрос на самом деле не имеет смысла и git diff HEAD не можетбыть использованным: история пуста, нет коммита и еще нет HEAD!


  • git diff показывает изменения в вашем рабочем дереве только относительно последнего коммитадля отслеживаемых файлов

  • git diff HEAD показывает изменения в вашем рабочем дереве относительно последней фиксации (включая файлы, которыене отслеживаются)

  • git diff --staged (или его синоним git diff --cached) показывает изменения, которые вы поставили для следующего коммита относительно последнего коммита

Существует много других способов вызова git diff для сравнения произвольных коммитов или веток и т. Д. Вызовите git help diff, чтобы узнать больше об этом.

3 голосов
/ 17 декабря 2011

Исходя из вашего git status выхода, нечего показывать для git diff без дополнительных параметров. Для git diff --cached и git diff HEAD нечего показывать, поскольку все эти команды основаны на изменениях, уже известных git.

У вас нет промежуточных файлов и файлов, отличных от тех, которые находятся под контролем версий.

После того, как вы добавите test.txt под git, вы получите желаемый результат.

Просто введите

git add test.txt

или

git add .

Чем этот файл будет добавлен под контролем версий. И будущие изменения этого файла будут показаны с помощью git diff.

2 голосов
/ 19 июля 2017

У меня установлена ​​переменная окружения LESS=-R. git diff показало пустой экран.

Решение для меня:

unset LESS
1 голос
/ 02 апреля 2015

Это действительно связано с настройками пейджера.

Я обнаружил, что включая '-e' в

export PAGER=less LESS=-cse

помогает.

Без '-e', less выйдет на первой странице. Так или иначе, git даже не потрудится отобразить вывод в этом случае.

0 голосов
/ 09 ноября 2018

Вам не нужны никакие дополнительные флаги для работы git diff. Сначала вы создаете файл и добавляете его в репозиторий git с помощью git add для подготовки и или выполняете коммит git, чтобы получить его в своем хранилище. Теперь перейдите к файлу, внесите в него изменения и сохраните его. Просто вставьте туда предложение, гласящее: «Я буду запускать команду« git diff »сразу после сохранения». Сохрани это. Именно в этот момент вы увидите разницу при запуске команды git diff. Он покажет последние изменения перед выполнением «git commit» или если вы только что поместили файл изначально в стадию.

\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

Строки со знаками + - это добавленный контент. Если вы используете флаг --cached и получаете результат, то ваш git-статус для того же файла должен сообщать, что файл не был зафиксирован. Как только вы зафиксируете файл, вы не получите никакого вывода для git diff. даже с флагом --cached.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...