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

Видео урок: Сравнение бранчей

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

В этом ролике мы поговорим о том, как сравнивать бранчи. В последней главе мы видели, как перемещаться по дереву коммитов, мы используем команду git diff, чтобы сравнить два разных tree-ish объекта. И тогда я говорил вам, что бранч - это один из tree-ish объектов, который мы можем передать, но тогда у нас не было работы с бранчами. А теперь у нас уже есть несколько бранчей, так что мы можем их сравнить. Используем git diff, а затем мы просто передаем имена бранчей. Помните, работа с бранчами довольно быстрая. Вот список бранчей, сейчас я нахожусь в бранче shorten_title, пишем git diff master..new_feature.

Я сравниваю основной бранч с new_feature, используя между ними две точки. Итак, основной бранч сравнивается с new_feature, и Git говорит, в чем заключается разница между верхушкой основного бранча и верхушкой new_feature, самые последние коммиты здесь. Этот слепок. Таким образом, я легко могу увидеть, что изменилось между двумя версиями. Можно попробовать основной бранч и shorten_title. Вот тут показано, что изменилось. Сюда включены изменения, которые были сделаны в бранче new_feature, помните, ведь shorten_title - это бранч, созданный из new_features, так что сюда включены и эти изменения.

И, конечно, мы можем пройти промежуточный этап, new_feature сравнивается с shorten_title. Порядок на самом деле не важен. Давайте, я вам покажу, сделаем это еще раз, поменяем их и напишем git diff shorten_title..new_feature. Нам будет показана так же самая разница, мы просто поменяли их местами. Они поменялись местами, один был a или минусом, а другой был b или плюсом. Вот все, что было сделано. Обычно тот, что шел раньше, будет показан первым, а тот, что шел позже, будет показан вторым.

Но иногда все может оказаться хитрее, когда вы начинаете работать с бранчами, и разные коммиты сделаны в разных местах. В общем, дело тут в том, какой из них вы хотите видеть как бранч в старом состоянии, а какой как бранч в новом. Другая хорошая возможность, которую мы можем использовать с diff - это опция colorwords. Давайте напишем эту команду с new_feature..shorten_title и добавим --color-words. Git показывает нам ту же самую разницу, но все показано на одной строке. Возможно, для вас стало более понятно, что изменилось, вместо наличия двух строк, одна над другой.

Это действительно зависит от личных предпочтений, что вам больше нравится. Теперь, конечно, мы передаем сюда не просто бранч, мы передаем tree-ish. Мы говорили про tree-ishs. Объектом tree-ish могут быть самые разные вещи, он даже может включать в себя предков. Например, я могу сравнить предыдущий коммит в new_ feature с HEAD в shorten_title. Идем в shorten_title, и я хочу сравнить его не с последним, а с предыдущим коммитом. И мы видим, что изменение состояло в том, что я убрал слова welcome to.

Есть еще один важный способ, которым можно сравнить бранчи, и он заключается в том, чтобы выяснить, полностью ли один бранч включает в себя другой. То есть, произошло ли полное слияние с текущим бранчем. Здесь мы не используем команду diff, а используем git branch с двумя дефисами и опцией merged. Эта команда покажет нам все бранчи, которые полностью включены в данный бранч. Итак, сейчас мы в бранче shorten_title, все коммиты, находящиеся в new_feature, также расположены в shorten_title, все коммиты, находящиеся в основном бранче, также присутствуют в shorten_title.

Это дает нам знать, что если хотим, мы можем удалить новые изменения, и это не повлияет на shorten_title. В shorten_title есть все эти коммиты. Давайте попробуем переключиться на другой бранч, git checkout new_feature, снова его окружаем, git branch merged. Теперь Git говорит - все верно, в new_feature нет всех коммитов, которые содержатся в shorten_title. В shorten_title есть некоторые вещи, которые еще не включены сюда, нам нужно сделать слияние, чтобы эти изменения попали в feature_first. На самом деле Git возвращается по цепочке предков в бранче new_feature, чтобы увидеть, содержится ли в нем верхушка бранча.

Если в нем присутствует последний коммит из мастер-бранча, тогда в нем есть и все предки. Здесь нет последнего коммита из shorten_title, поэтому он здесь не перечислен. А теперь давайте напишем checkout master, и здесь будет сделано то же самое, вы увидите, что мастер-бранч не содержит этих изменеий, которые находятся в new_feature и shorten_title. Таким образом, эта команда не говорит сравнивать бранчи напрямую таким образом, как делает diff, но это отличный способ, чтобы получить важную информацию при сравнении контекста, находящегося в каждом бранче. Вы ощутите всю прелесть этого, когда мы попытаемся удалить бранчи.