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 слишком запутан для использования.
Ответы
Ответ 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