Предположим, вы работаете в ветке feature, а коллеги обновили master. Вам нужно подтянуть свежие изменения в локальный master, но не хочется терять контекст и переключаться туда-обратно. Стандартный git pull работает только с текущей веткой. Что делать?
Решение – специальная форма git fetch, которая обновляет указанную локальную ветку, не меняя ваше рабочее состояние.
|
1 |
git fetch <remote> <удалённая_ветка>:<локальная_ветка> |
<remote>– обычноorigin.<удалённая_ветка>– имя ветки на сервере (например,master,develop).<локальная_ветка>– имя локальной ветки, которую вы хотите обновить.
Пример
Вы находитесь на ветке feature и хотите обновить локальный master до состояния origin/master
|
1 |
git fetch origin master:master |
Локальная ветка master будет продвинута вперёд (если это возможно) до того же коммита, что и origin/master. При этом вы останетесь на ветке feature с неизменённым рабочим каталогом и индексом.
Важное ограничение
Это работает только для быстрой перемотки (fast-forward).
Если в вашем локальном master есть коммиты, которых нет в origin/master, Git откажется выполнять операцию, чтобы вы случайно не потеряли историю. Будет выдана ошибка:
|
1 |
! [rejected] master -> master (non-fast-forward) |
В такой ситуации Git не может просто «переместить указатель» – требуется слияние или ребейз. Это сделано специально для защиты от потери данных.
Что делать, если нужна перемотка с принуждением?
Если вы абсолютно уверены, что хотите перезаписать локальную ветку (например, вы случайно закоммитили в master что-то ненужное), можно использовать принудительный вариант с плюсом перед источником:
|
1 |
git fetch origin +master:master |
Это заменит вашу локальную ветку master на содержимое origin/master без всяких проверок. Коммиты, которые были только в локальном master, будут потеряны. Эта команда полезна для сброса ветки до состояния, которое точно соответствует удалённой.
Этот же приём, но для локальных веток
Этот же трюк работает и для обновления одной локальной ветки из другой (без слияния, только fast-forward). Синтаксис:
|
1 |
git fetch . <исходная_ветка>:<целевая_ветка> |
Например, обновить master до текущего состояния develop (если develop содержит все коммиты master + новые):
|
1 |
git fetch . develop:master |