Подтвердить что ты не робот

Git diff не дает выхода

Если я запустил 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)

Посмотрим на diff test.txt:

$ git diff

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

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

$ git add .
$ git diff

Еще ничего!

Git В графическом интерфейсе отображаются изменения.

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

Я видел ситуации, когда действительно нужно выводить из git diff но нет; добавление
--no-pager между git и diff работает DOES:

git --no-pager diff

... поэтому явным образом установка пейджера будет less

git config --global core.pager 'less'

Несмотря на то, что less предполагается пейджером по умолчанию.

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

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

Ответ 3

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

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

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

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

git add test.txt

или

git add .

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

Ответ 4

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 не может быть использован: история пуста, там нет commit и no HEAD еще!


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

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

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

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

Ответ 5

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

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

export PAGER=less LESS=-cse

помогает.

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

Ответ 6

У меня был набор переменных среды LESS=-R. Он сделал git diff показать пустой экран.

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

unset LESS