Как проверить, синхронизирован ли репозиторий Git с удаленным

GitGitBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять, синхронизирован ли ваш локальный репозиторий Git с его удаленным аналогом. Мы рассмотрим практические методы определения того, находится ли ваша локальная ветка в актуальном состоянии, отстает или опережает удаленную ветку.

В рамках практического занятия (лабораторной работы) вы научитесь получать изменения из удаленного репозитория и использовать команду git status для оценки состояния синхронизации. Вы также узнаете, как использовать команду git log для сравнения вашего локального HEAD с отслеживающей удаленной веткой (@{u}) для выявления различий в истории коммитов. Наконец, мы смоделируем и изучим состояние репозиториев, которые расходятся, чтобы вы получили всестороннее понимание того, как выявлять и управлять проблемами синхронизации в Git.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") subgraph Lab Skills git/add -.-> lab-560100{{"Как проверить, синхронизирован ли репозиторий Git с удаленным"}} git/status -.-> lab-560100{{"Как проверить, синхронизирован ли репозиторий Git с удаленным"}} git/commit -.-> lab-560100{{"Как проверить, синхронизирован ли репозиторий Git с удаленным"}} git/log -.-> lab-560100{{"Как проверить, синхронизирован ли репозиторий Git с удаленным"}} git/fetch -.-> lab-560100{{"Как проверить, синхронизирован ли репозиторий Git с удаленным"}} end

Получение изменений и проверка статуса Git

На этом этапе мы научимся получать изменения из удаленного репозитория и проверять статус нашего локального репозитория.

Представьте, что вы работаете над проектом с другими людьми. Они могут внести изменения в проект и сохранить их в центральном хранилище (удаленном репозитории). Вам нужно иметь возможность получить эти изменения в свою копию проекта (локальный репозиторий). Именно здесь приходит на помощь команда git fetch.

Сначала убедимся, что мы находимся в директории нашего проекта. Откройте терминал и введите:

cd ~/project/my-time-machine

Теперь имитируем наличие удаленного репозитория. В реальной ситуации он был бы на платформе, такой как GitHub или GitLab. В рамках этого практического занятия (лабораторной работы) мы будем использовать локальную директорию в качестве нашего "удаленного" репозитория.

git remote add origin ../my-time-machine-remote

Эта команда добавляет "удаленный" репозиторий с именем origin, который указывает на директорию вне текущего проекта.

Теперь используем команду git fetch для получения любых изменений из этого имитированного удаленного репозитория.

git fetch origin

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

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

git status

Вывод команды git status теперь скажет вам, находится ли ваша локальная ветка "в актуальном состоянии" по отношению к удаленной ветке, или есть изменения, которые можно получить. Например, вы можете увидеть что-то вроде этого:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Или, если были изменения в удаленном репозитории:

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

Понимание вывода команды git status после выполнения git fetch является важным. Он показывает отношение между вашей локальной веткой и соответствующей веткой в удаленном репозитории. Это помогает вам решить, нужно ли получать изменения или ваша локальная копия уже актуальна.

Использование git log для сравнения HEAD и @{u}

На этом этапе мы будем использовать команду git log для сравнения состояния нашей локальной ветки (HEAD) с ее веткой-верхним потоком (@{u}). Это мощный способ визуализировать различия после получения изменений.

Сначала убедитесь, что вы находитесь в директории проекта:

cd ~/project/my-time-machine

В Git HEAD обозначает коммит, на который указывает ваша текущая ветка. Он представляет собой конец вашей текущей работы. @{u} (или @\{upstream\}) обозначает ветку-верхний поток, которую отслеживает ваша текущая локальная ветка. Обычно это соответствующая ветка в удаленном репозитории, из которого вы получали изменения.

Чтобы увидеть коммиты, которые есть в вашей локальной ветке (HEAD), но отсутствуют в ветке-верхнем потоке (@{u}), вы можете использовать следующую команду:

git log HEAD..@{u}

Эта команда показывает коммиты, которые достижимы из @{u}, но не из HEAD. Другими словами, она показывает коммиты, которые есть в удаленной ветке, но еще нет в вашей локальной ветке. Если таких коммитов нет (то есть ваша локальная ветка актуальна или опережает удаленную), эта команда не выдаст никакого вывода.

Теперь давайте посмотрим на коммиты, которые есть в ветке-верхнем потоке (@{u}), но отсутствуют в вашей локальной ветке (HEAD). Это покажет коммиты, которые есть в вашей локальной ветке, но еще не были отправлены в удаленный репозиторий.

git log @{u}..HEAD

Эта команда показывает коммиты, которые достижимы из HEAD, но не из @{u}. Если таких коммитов нет (то есть ваша локальная ветка актуальна или отстает), эта команда не выдаст никакого вывода.

Используя git log с записью .., вы можете легко сравнить историю двух разных точек в вашем репозитории, например, вашу локальную ветку и ее аналог в ветке-верхнем потоке. Это чрезвычайно полезно для понимания состояния вашего репозитория по отношению к удаленному и для подготовки к получению или отправке изменений.

Тестирование расходящихся репозиториев

На этом этапе мы имитируем сценарий, когда и в локальном репозитории, и в удаленном репозитории есть новые коммиты, которых нет в другом. Это состояние называется "расхождением" (diverged state).

Сначала убедитесь, что вы находитесь в директории проекта:

cd ~/project/my-time-machine

Создадим новый коммит в нашем локальном репозитории:

echo "Adding a local change" > local_change.txt
git add local_change.txt
git commit -m "Add a local change"

Теперь имитируем создание коммита непосредственно в "удаленном" репозитории. Перейдем в директорию удаленного репозитория, создадим коммит, а затем вернемся обратно.

cd ../my-time-machine-remote
echo "Adding a remote change" > remote_change.txt
git add remote_change.txt
git commit -m "Add a remote change"
cd ../my-time-machine

Теперь мы создали коммит в локальном репозитории и отдельный коммит в имитированном удаленном репозитории. Наши репозитории теперь расходятся.

Используем снова команду git fetch для обновления информации о удаленном репозитории:

git fetch origin

Теперь проверим статус локального репозитория:

git status

Вы должны увидеть вывод, указывающий на то, что ваша ветка расходится. Что-то вроде этого:

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

Это сообщение о статусе говорит, что ваша локальная ветка (master) и отслеживаемая удаленная ветка (origin/master) продвинулись вперед с новыми коммитами с момента последней синхронизации. Даже предлагается использовать git pull для объединения удаленных изменений.

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

Резюме

В этом практическом занятии (lab) мы научились проверять, синхронизирован ли локальный репозиторий Git с его удаленным аналогом. Мы начали с имитации удаленного репозитория и добавления его в наш локальный проект с помощью команды git remote add. Ключевой шаг получения изменений из удаленного репозитория без их слияния был выполнен с использованием команды git fetch origin. После получения изменений мы использовали команду git status для определения состояния синхронизации нашей локальной ветки по отношению к удаленной ветке, наблюдая вывод, который показывает, актуальна ли ветка или отстает от удаленной.

Мы также будем дальше изучать методы сравнения локального HEAD с отслеживаемой удаленной веткой с помощью команды git log и рассмотрим сценарии, связанные с расходящимися репозиториями, чтобы получить полное понимание синхронизации репозиториев.