git push
не изменяет никаких файлов.
git push
добавляет или удаляет коммит .У коммитов есть снимки файлов.В коммитах нет изменений, просто есть файлы.
Вот файл:
$ cat name-of-file
I am the contents of file name-of-file.
Какие изменения я внес в этот файл?Я предоставил вам снимок , и мой вопрос к вам: каковы изменения? Какую ключевую информацию я оставил вне своего вопроса?
Подумайте об этом немного, а затем продолжайте читать: Учитывая два снимка, как вы найдете изменения?git diff
помогает?
Какие два снимка вы хотели бы использовать?
Команда git diff
может показать вам, что изменило между любыми двумя снимками:
git diff <hash#1> <hash#2>
Обратите внимание, что вы должны выбрать два хэша коммита.Тем не менее, вы можете выбрать эти хэши фиксации по names .В каком-нибудь существующем репозитории Git запустите:
git rev-parse master
и посмотрите, какой хеш коммита выйдет.Затем запустите git log master
.Что общего между выводом git rev-parse
и первой строкой git log
?
Существует полный (хотя и подавляющий) список способов создания хэш-идентификаторов Git в документации gitrevisions ,но наиболее полезными для повседневной работы являются имена веток, такие как master
, имена тегов, такие как v2.1
, и имена для удаленного отслеживания, такие как origin/master
.Имя HEAD
означает текущий коммит , 1 , и вы можете сократить его @
, если хотите.
1 Имя HEAD
также означает имя текущей ветви .Способ, которым Git решает, использовали ли вы HEAD
для обсуждения идентификатора хеша или для имени ветви , заключается в том, что некоторым командам нужно имя ветви, а другим -идентификатор хеша коммитаКоманда git rev-parse
может задать любой вопрос, но по умолчанию находится идентификатор хеша.Вы можете использовать git rev-parse --symbolic-full-name HEAD
, чтобы спросить о названии филиала, или, если вы очень серьезны, вы можете использовать git symbolic-ref HEAD
для этого случая.
git diff-tree
- это версия сантехникиgit diff
для двух коммитов
Указанная вами команда git diff-tree
- это способ запуска git diff
из другой компьютерной программы.Если вы запускаете git diff
, чтобы самостоятельно увидеть разницу, на экране своего компьютера вы обычно используете то, что Git называет командой фарфор , названной в честь более отточенных, ориентированных на пользователя частейВанная комната, как раковина.Если вы используете git diff
для получения различий для передачи в другую компьютерную программу, вам может понадобиться разобрать и собрать по пути различное оборудование, выполняя то, что Git называет сантехникой , и здесь вы должны использоватьgit diff-tree
для сравнения двух конкретных коммитов.
Команда git diff-tree
имеет одну особенную дополнительную особенность: если вы запускаете ее только с одним идентификатором хэша коммита или именем, подобным HEAD
Git будет извлекать из этого коммита список parent коммитов.Затем Git будет различать родителя (ей) коммита против коммита.Это то, что вы видите, когда запускаете git diff-tree <em>options</em> HEAD
.
Чтобы выбрать два подтверждения для сравнения, просто используйте оба хеш-идентификатора или имена для них накомандная строка.
Обычный git diff
может также сравнивать другие вещи
Фарфоровая команда git diff
может вызывать вместо git diff-tree
, git diff-index
или git diff-files
команды слежения.Они позволяют вам сравнивать содержимое коммита с содержимым index , или коммитом с рабочим деревом, или индексом с рабочим деревом.
Commits, индекс,и рабочее дерево
Помните, что Git всегда имеет три активных копий каждого файла:
- Замороженная копия в коммите
HEAD
доступно через git show HEAD:<em>path</em>
. - Копия рабочего дерева - это обычный файл, который вы можете просматривать и редактировать.Git не использует этот файл!
- Между этими двумя копиями Git хранит копию файла, который он поместит в следующий коммит, который вы сделаете.Эта копия находится в том, что Git называет, по-разному, index , или область подготовки , или cache .Вы можете просмотреть эту копию с помощью
git show :<em>path</em>
.
Когда вы запустите git commit
, Git упакует все, что находится в индексе , прямо тогда , и заморозит это содержимое, чтобы сделатьновый моментальный снимок.Вот почему вы должны продолжать работать git add
так часто.Команда git add
копирует содержимое некоторого файла рабочего дерева в индекс, обновляя или даже создавая версию индекса.
Это версия index файл, который имеет значение для Git.Принятые версии замораживаются в коммиты и не могут быть изменены.Они длятся до тех пор, пока длится коммит.Версия work-tree каждого файла - это та, с которой вы можете видеть и работать, но Git не заботится о ней.Версия index каждого файла - это то, что нужно Git для новых коммитов, а создание новых коммитов - причина существования Git, поэтому Git заботится о коммитах и index .
Дерево работы для вас.Git не хочет или не нуждается ни в чем;вам нужно работать и обновлять индекс, а также копировать его, чтобы Git нуждался в новых коммитах.
Резюме: коммиты - это снимки;diff сравнивает снимки
Все это - то, как и почему Git делает снимки . Git не имеет дело с изменениями.Это делает снимки.Вы можете в любое время сравнить два снимка , чтобы увидеть, что между ними отличается.То, что вы увидите, будет зависеть от того, какие два снимка вы выберете.
Вы также можете сравнить снимок (коммит) с предложенным снимком (индекс) или сравнить снимок с вашей работой.или сравнить предложенный снимок (индекс) с рабочим деревом.Команда git diff-tree
сравнивает только реальные снимки.Чтобы получить другие сравнения, вам понадобится одна из других сантехнических команд или фарфор git diff
.
Команда git status
также запускает git diff
для вас.Когда вы используете git status
, он на самом деле запускает два таких различий.Один сравнивает текущий снимок, HEAD
, с индексом - с предложенным коммитом.Отсюда изменения для коммита .Второе сравнение сравнивает индекс с рабочим деревом.Отсюда изменения, не подготовленные для фиксации .Ни в индексе, ни в рабочем дереве нет никаких реальных изменений; изменений, которые показывают git status
или git diff
, являются результатом сравнения фактических снимков (фиксаций), предложенных снимков (индекса) или потенциальныхснимки (рабочее дерево).