Начинающему программисту или даже многим опытным программистам может быть сложно изучить и освоить контроль версий Git. На мой взгляд, во многом причина кроется в существовании множества различных команд и небольших различиях между ними.
Одним из таких примеров является разница между git fetch
и git pull
. На первый взгляд, названия команд не дают большого представления о
том, чем они отличаются, поэтому в этой статье я объясню разницу между
командами git fetch
и git pull
Git Fetch
Команда fetch
извлекает любые коммиты, ссылки (например, теги), ветки
и файлы из удаленного репозитория вместе с любыми другими
соответствующими объектами. Однако не все теги извлекаются, поскольку
эта команда принимает только те, которые указывают на извлекаемые вами
коммиты. По сути, эта команда извлекает все, что необходимо для
восстановления истории конкретной интересующей вас ветки.
Базовый синтаксис следующий:
$ git fetch <remote-repo> <remote-branch>
Если указать <remote-branch>
будут получены изменения только из этой
ветки. Если этот параметр опущен, будут получены изменения из всех
ветвей.
Что интересно в fetch
это то, что она на самом деле ни на что не
влияет в вашем локальном репо. Никакие рабочие изменения не будут
потеряны, и вы не увидите прямого влияния на ваши локальные филиалы. Это
связано с тем, что Git хранит извлеченный контент отдельно от контента
вашего собственного репо, пока он не будет объединен.
Итак, предположим, вы хотите просмотреть изменения для «главной» ветки из удаленного репо «origin», прежде чем принять решение об объединении их в свое репо. Для этого вы можете использовать следующие команды:
$ git fetch origin master
Теперь, когда у вас есть изменения в вашем репозитории, вы, вероятно, захотите их просмотреть, что вы можете сделать, просто проверив ветку:
$ git checkout origin/master
Это позволит вам увидеть изменения, и они по-прежнему не объединены ни в одну из ваших собственных веток.
Более быстрый способ просмотреть эти изменения - просто просмотреть журналы фиксации, что вы можете сделать с помощью:
$ git log master..origin/master
Обратите внимание, что это считается «более безопасным» методом, чем
pull
поскольку он фактически не вносит никаких изменений в ваши
локальные ветки.
Теперь, когда мы увидели, что fetch
, и немного о том, как это
работает, давайте взглянем на pull
.
Git Pull
git pull
я бы назвал командой «высокого уровня». Под этим я
подразумеваю, что он последовательно выполняет действия нескольких
других команд Git, о которых я расскажу подробнее ниже. В этом разделе,
после того как я опишу разницу между fetch
и pull
, я также кратко
расскажу о многочисленных различных способах использования команды.
Общий синтаксис следующий:
$ git pull <remote-repo> <remote-branch>
Оба параметра <remote-repo>
и <remote-branch>
являются
необязательными, если ваша текущая ветвь отслеживает удаленную.
Вероятно, самый простой способ объяснить эту команду и то, чем она
отличается от fetch
, состоит в том, что это псевдоним для двух других
команд Git при использовании в режиме по умолчанию: fetch
и merge
.
Итак, запустив git pull
вы, по сути, выполняете эти две команды
последовательно:
$ git fetch <remote-repo>
$ git merge FETCH_HEAD
Здесь FETCH_HEAD
- это ссылка на подсказку последней выборки, которая
объединяется с вашей текущей веткой.
Таким образом, очевидно, что большая разница между fetch
и pull
заключается в том, что pull
фактически выполняет fetch
помимо
merge
.
Хотя в зависимости от параметра, который вы даете git pull
, он может
работать иначе. Например, если вы добавите параметр --rebase
вместо
git merge
будет использоваться git rebase
.
Существует также --no-commit
вариант, который будет выполнять
merge
команды, но (как указано в официальной документации) «делает вид
, что слияние не удалось» , а не Autocommit его. Это позволяет вам
взглянуть на изменения, которые вы только что выбрали, прежде чем
фактически зафиксировать их в своем коде.
Доступно еще несколько вариантов, большинство из которых выходит за рамки этой статьи. Я бы рекомендовал взглянуть на официальную документацию для получения дополнительной информации.