Предыдущий ролик Следующий ролик  

Видео урок: Сравнение коммитов

Git: обучение основам

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

То есть, когда мы сравниваем коммиты, мы на самом деле сравниваем две директории и просматриваем, что изменилось между этими двумя директориями. Теперь, можно сравнить то, что было изменено, по времени. Например, я могу сравнить коммит, который я сделал в понедельник утром, с коммитом, который был сделан в пятницу вечером, и сравнение этих двух директорий покажет мне все изменения, которые были сделаны в течение недели. Когда мы начнем изучать бранчи, а сделаем мы это в следующей главе, мы сможем сравнить два различных бранча, чтобы увидеть, что изменилось. Что же изменилось в этих бранчах? Чтобы сделать это сравнение, мы используем средство, с которым мы уже знакомы, и это diff.

Когда мы использовали его в первый раз, мы просто прописывали git diff. И тогда эта команда возвращала изменения, сделанные между рабочей директорией и буфером. То есть, это все изменения, которые могут быть вставлены в буфер, изменения, которые мы недавно сделали, но еще не вставили в буфер. Как только мы отправим их в буфер, они не будут больше показаны в git diff, Помните, нам нужно было добавить к этой команде другую опцию, это staged или cached, и это синонимы. Эти опции показывают нам различие между буфером и репозиторием или HEAD, тем, на что указывает HEAD.

В общем, diff - очень гибкое средство. Оно позволяет нам передать другие вещи, так что мы можем сравнивать не только рабочую директорию, буфер и репозиторий. Если мы передадим SHA, который обращается к коммиту, нам будет показана разница между рабочей директорией и директорией в тот момент времени, когда был сделан коммит. Например, пишем git log oneline, и вот у нас есть список, и я собираюсь использовать вот этот SHA - cdae0ed. Если мы напишем git diff и просто передадим этот SHA, который относится к этому коммиту. Мне возвращаются все различия между директорией в тот момент времени и моей текущей рабочей директорией.

Давайте еще кое-что рассмотрим. Давайте зайдем сюда, вернемся немного назад, здесь много изменений. Очищаем экран, git diff, и вот на этом 1506576 нажимаем Return. Видите, у меня много изменений. Мне показано все, что было изменено, включая переименование файлов и тому подобное. Нажимаю Q, чтобы выйти. Это все хорошо, потому что сейчас мы можем сравнить то, где мы находимся сейчас, с тем, что было раньше, просто посмотрев назад - что же изменилось за это время? И мы можем быть более конкретными, указав конкретный файл.

Например, мы хотели бы использовать тот же коммит и выяснить, какие есть различия только в файле tours.html, эта команда посмотрела бы и сказал нам. Это сравнение между предыдущим этапом и рабочей директорией в ее нынешнем состоянии. Очень удобный инструмент. Теперь, мы не обязательно должны использовать рабочую директорию, на самом деле мы можем вообще сравнить два коммита. Мы можем передать два различных tree-ishe, используя range. Мы уже видели range, когда работали с файлом логов, таким образом, это диапазон между двумя произвольными коммитами. Давайте снова напишем git log oneline, и мы увидим список этих коммитов.

Давайте сравним эти два коммита, вот эти, которые начинаются с c. Что же изменилось между ними? Пишем git diff, а затем первый, за которым следуют две точки, а затем второй, вот и все. Слепок в этой временной точке против слепка в другой временной точке, покажи мне, что изменилось между ними, и Git отдаст мне сводку всего того, что было изменено. Нам интересно только то, что изменилось в файле tours, Git его просматривает и говорит, что на самом деле ничего не поменялось между этими двумя точками во времени.

Еще раз, вы можете передать сюда любой tree-ish, например, если вы напишете git log oneline и захотите сравнить это с HEAD, git diff ..HEAD, сравнение будет сделано. Если мы хотим написать git diff ..HEAD parent-parent, мы можем сделать это, все те трюки, которые касаются обращения к коммитам, мы можем здесь использовать. Вы можете заглянуть в документацию Помощи, и здесь есть много модификаторов и опций, которые можно использовать с diff. Однако я покажу вам всего лишь пару из них, которые я считаю наиболее полезными.

Давайте снова пропишем git log oneline, а затем начнем фактически с начала, git diff, а затем мы перейдем отсюда к HEAD. Первые опции, которые мне кажутся полезными, это stat и summary, и вы можете использовать их по отдельности или вместе, они покажут вам сводку того, что было изменено, список файлов со сводкой того, как много всего здесь было изменено, то, что было добавлено, то, что было удалено. А другие две опции, которые мне кажутся наиболее полезными, это опции b и w.

Давайте посмотрим. На самом деле, вы не увидите здесь никакой разницы, потому что ее и нет, но опция -b - это то же самое, что и --ignore-space-change (игнорирование изменений с пробелами). Итак, она работает с пробелом. То есть она игнорирует, изменил или нет кто-то один пробел на два, четыре пробела на пять, она это игнорирует, это опция b. Второй является опция w, которая игнорирует все пробелы. Она игнорирует любое изменение, которое можно сделать с пробелом (--ignore-all-space), она просто говорит, забудьте об этом.

Полные их имена долго набирать, так что проще писать только b и w. Итак, b предназначен для игнорирования изменений в пробелах, а w для игнорирования всех пробелов, то есть все, что касается пробела, полностью игнорируется. Это может вам помочь, потому что в большинстве случаев обычные изменения пробелов - это не то, о чем вы действительно переживаете, когда работаете с кодом. Вы больше думаете о том, какие символы были изменены, пробелы зачастую не важны. Итак, у нас есть мощные средства для навигации по дереву коммитов. Мы можем просмотреть структуру директории, мы можем просмотреть логи, мы можем просмотреть коммиты и мы можем сравнить различные коммиты по двум разным точкам во времени.

Это мощные средства, и они помогут вам получить больше выгоды от Git.