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

Видео урок: Как внести извлеченные изменения

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

В последнем ролике мы использовали git fetch, чтобы синхронизировать origin/master с бранчем master в удаленном репозитории, но мы заметили, что хотя Git и отправил эти коммиты в origin/master, он не отправил их в основной бранч в нашем локальном репозитории. Все, что он сделал, это синхронизировал origin/master с удаленным хранилищем. если мы хотим, чтобы эти изменения были включены в наш основной бранч, мы должны сделать еще один шаг, и в этом ролике мы узнаем, что это за шаг, а именно, использование слияния. Помните, раньше я вам говорил, что origin/master - это просто бранч, как и другие бранчи.

Это удаленный бранч, и это единственное, что отличает его от тех бранчей, с которыми мы обычно работаем, то есть, мы не можем сделать его чекаут, а в остальном все одно и то же. В том, что мы не можем сделать его чекаут, есть смысл, потому что Git должен иметь возможность синхронизировать его с тем, что есть в удаленном хранилище, поэтому чекаут для него неприемлем. Если мы сделаем чекаут, мы можем внести туда коммит, и это все запутывает. Вместо этого, у нас есть бранчи, с которыми мы работаем, а Git следит за origin/master, чтобы он отражал то, что находится в удаленном хранилище. Но кроме того факта, что мы не можем сделать чекаут, он такой же, как и другие бранчи.

Это важно запомнить, потому что мы сделаем слияние, как и с любым другим бранчем. Вот мы видим, что на удаленном сервере есть пять коммитов, а также мы использовали fetch, потому что origin/master полностью синхронизирован с тем, что есть на удаленном сервере. Однако в нашем основном бранче нет последних двух коммитов, поэтому их надо сюда добавить, а сделаем мы это при помощи слияния, и данное слияние работает точно так же, как и то слияние, что мы изучили в соответствующей главе. Единственное различие заключается в том, что мы используем origin/master вместо других бранчей, с которыми мы до сих пор работали.

В данном конкретном случае, если мы прямо сейчас сделаем слияние, это будет быстрое слияние, как и то быстрое слияние, что мы изучили ранее. Если же мы внесем в основной бранч дополнительные коммиты, тогда их тоже нужно будет отправить, и тогда у нас будет коммит для слияния, который объединит изменения, точно также, как мы делали раньше. И конечно, существует вероятность, что в коммите 923ea из origin/master есть что-то такое, что будет конфликтовать с тем, что находится в коммите ba8ce в основном бранче, и если такой конфликт возникнет, как и при обычном слиянии, нам нужно его разрешить.

Мы разрешаем конфликт обычным способом и коммитим результат в коммит для слияния. Давайте попробуем это сделать. Обратите внимание, что я нахожусь внутри папки lynda_ version, и я в основном бранче. Во-первых, давайте вспомним, где находятся наши бранчи, git branch, а затем мы используем опцию -a, так чтобы видеть их все. Теперь я хочу объединить master бранч с origin/master. Сначала мы можем посмотреть разницу между бранчами, diff origin/master..master, и Git скажет нам, в чем суть изменений.

Теперь, когда мы знаем, что эти бранчи разнятся, мы можем сделать слияние. Итак, git merge, как и раньше, обычно мы бы написали имя бранча, а сейчас мы напишем origin, а затем имя бранча. Итак, merge origin/master, затем я нажимаю Return, и Git говорит нам, что это было быстрое слияние, теперь пишем get log --oneline, вы видите три строки для основного бранча, и здесь появились эти изменения. Давайте снова посмотрим на диаграмму, чтобы убедиться, что вам все абсолютно понятно, когда мы делаем слияние, это слияние происходит с origin/master.

Мы не идем на GitHub, чтобы посмотреть, что же находится в нашем локальном репозитории. Итак, когда мы делаем слияние, сперва нам нужно прописать fetch. Сначала fetch, а затем merge. Также возможно, что появились новые коммиты за это время, мы поговорим об этом позже, но нам нужно сделать все возможное, чтобы получить самую последнюю информацию. Теперь мы понимаем этот процесс, git fetch, git merge. Это процесс, которому мы всегда будем следовать. Также я хочу, чтобы вы знали о сокращении git pull. git pull - это эквивалент для git fetch+git merge.

Эта команда делает все за один шаг. Эта команда находит последний коммит, скачивает его и делает слияние в текущий бранч, все за один раз. На самом деле, есть много "за" и "против" касательно git pull. Во-первых, эта команда очень удобна. По этой причине много людей ее используют. Плохая же сторона состоит в том, что для новичков это затеняет тот факт, что на самом деле это двушаговый процесс, и я считаю, что люди, которые часто используют git pull, забывают про git fetch и git merge. Они просто не понимают, что для них делает Git, а когда что-то не срабатывает с git pull, им трудно понять, в чем же ошибка, что случилось и как это исправить.

если вы используете git fetch+git merge, такие проблемы вряд ли возникнут, потому что тогда фактически очевидно, что же пошло не так и как это исправить. Я рекомендую вам некоторое время использовать git fetch и git merge, пока вы не почувствуете, что все понимаете, а когда вы увидите, что вам нужно просто скачать данные из удаленного репозитория, тогда вы можете использовать git pull.