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

Видео урок: Извлечение изменений из удаленного репозитория

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

В этом ролике мы рассмотрим, как извлекать изменения из удаленного репозитория. В последнем ролике мы внесли некоторые изменения в наш репозиторий explore_california и отправили эти изменения на GitHub, но когда мы переключились на репозиторий Линды, чтобы посмотреть, что видит Линда, этих изменений мы здесь не увидели; git log --oneline, пишем -5. Вы видите, что изменений здесь нет, и не важно, находимся ли мы в основном бранче или просматриваем origin/master.

То есть, их нет ни в основном бранче, ни в origin/master. Также обратите внимание, когда мы запрашиваем git branch, у нас есть только master бранч. Когда мы запрашиваем список удаленных бранчей, Git говорит нам, что у нас тоже есть здесь master бранч. Помните, мы отправили сюда и другой бранч, бранч non_tracking. То есть, на GitHub есть новый бранч и новый коммит, которые Линда пока еще не видит. Почему так? Потому что Линда должна извлечь (fetch) данные. Помните, извлечение - это то, что синхронизирует origin/master с тем, что имеется в удаленном репозитории.

Origin/master автоматически не отображает то, что есть в удаленном репозитории, мы должны сказать Git, что он должен синхронизировать оба репозитория. Когда мы смотрели на эту строку в логах для origin/master, Git, на самом деле, не пошел на GitHub, чтобы посмотреть, какие здесь логи. Он просматривал локальную копию, которая есть у Линды, с того времени, как она синхронизировала свой репозиторий, с того времени, как она извлекла данные, а это случилось тогда, когда она клонировала репозиторий. Эта команда git log может быть сделана, даже если у нас нет интернет соединения.

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

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

Это новый бранч non_tracking, Git извлек non_tracking из удаленного бранча non_tracking в origin/non_tracking. Если теперь я напишу git log --oneline -5 origin/master, вы увидите эти изменения, потому что теперь репозитории синхронизированы. Сейчас origin/master синхронизирован с тем, что находится в удаленном репозитории, теперь в нем есть все коммиты, что и там, все эти Git объекты были перенесены на наш компьютер.

Если мы напишем git branch, мы увидим, что у нас до сих пор один бранч, а вот git branch -r теперь знает о бранче non_tracking. Мы скачали информацию о нем. Таким образом, когда мы прописываем git fetch, идет синхронизация с удаленным репозиторием, Git забирает все объекты, которые там есть, и он скачивает ярлыки, которые указывают на верхушки каждого находящегося в удаленном хранилище бранча. Если мы посмотрим на логи для основного бранча, а не для origin/master, а лишь для бранча master, вы увидите, что этого коммита все еще нет здесь.

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

Это не имеет ничего общего с нашими "не удаленными" бранчами. Команда fetch совершенно безвредная, и поэтому ее можно использовать очень часто. Сейчас я хочу дать вам три очень полезных совета. Первый - всегда делать fetch, прежде чем начать работу. Самое первое, что вы должны сделать, когда утром садитесь за компьютер, чтобы поработать, это использовать fetch. Посмотреть, что находится в удаленном репозитории, какие коммиты за ночь сделали те люди, которые с вами работают. Их нужно скачать себе на машину, а затем решить, что с ними делать дальше.

Второй совет: прописывайте fetch, прежде чем прописать push. У вас есть свои коммиты, но они еще не отправлены в удаленный репозиторий, и прежде чем их отправить, посмотрите, что есть в удаленном репозитории. Возможно, кто-то другой уже отправил подобный коммит, или, возможно, кто-то отправил такие изменения, которые могут конфликтовать с вашими. Лучше скачать эти изменения, и тогда вы будете знать о них, прежде чем отправите свою работу в репозиторий. И последний совет: прописывайте fetch часто. Эта команда ничего не разрушает, поэтому не бойтесь использовать ее часто, и, конечно, ее стоит использовать тогда, когда у вас скоро будет отсутствовать интернет соединение. Например, если вы хотите взять свой ноутбук и поработать в парке или вам нужно сесть в самолет, тогда стоит прописать fetch, чтобы убедиться, что ваш репозиторий синхронизирован с удаленным репозиторием.

А поскольку эта команда автоматически не вносит изменения в основной бранч, но мы хотим их иметь, тогда нам нужно вставить их самим, сделав слияние, и в следующем ролике мы это рассмотрим.