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

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

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

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/status("Check Status") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") git/CollaborationandSharingGroup -.-> git/pull("Update & Merge") git/CollaborationandSharingGroup -.-> git/remote("Manage Remotes") subgraph Lab Skills git/status -.-> lab-560042{{"Как проверить, отстает ли ветка Git от удаленной ветки"}} git/log -.-> lab-560042{{"Как проверить, отстает ли ветка Git от удаленной ветки"}} git/fetch -.-> lab-560042{{"Как проверить, отстает ли ветка Git от удаленной ветки"}} git/pull -.-> lab-560042{{"Как проверить, отстает ли ветка Git от удаленной ветки"}} git/remote -.-> lab-560042{{"Как проверить, отстает ли ветка Git от удаленной ветки"}} end

Получение изменений из удаленного репозитория с помощью git fetch

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

Сначала давайте смоделируем наличие удаленного репозитория. Мы создадим простой репозиторий локально для демонстрации.

cd ~/project
mkdir remote-repo
cd remote-repo
git init --bare

Этот код создает "голый" (bare) репозиторий, который обычно используется как центральный удаленный репозиторий. Теперь вернемся в наш репозиторий my-time-machine и добавим этот репозиторий как удаленный.

cd ~/project/my-time-machine
git remote add origin ../remote-repo

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

cd ~/project/remote-repo
echo "This is a remote change." > remote_file.txt
git add remote_file.txt
git commit -m "Add remote file"

Теперь, находясь снова в репозитории my-time-machine, давайте получим изменения из удаленного репозитория.

cd ~/project/my-time-machine
git fetch origin

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

remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 258 bytes | 258.00 KiB | elapsed 0.00s.
From ../remote-repo
 * [new branch]      master     -> origin/master

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

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

Использование git status для проверки состояния отставания

На предыдущем этапе мы получили изменения из удаленного репозитория. Теперь давайте используем команду git status, чтобы увидеть, как наш локальный репозиторий сравнивается с удаленным.

Убедитесь, что вы находитесь в директории ~/project/my-time-machine:

cd ~/project/my-time-machine

Теперь выполните команду git status:

git status

Вы должны увидеть вывод, похожий на следующий:

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

Этот вывод сообщает нам несколько важных вещей:

  • "On branch master": В данный момент мы находимся на ветке master.
  • "Your branch is behind 'origin/master' by 1 commit": Это ключевое сообщение! Оно показывает, что наша локальная ветка master отстает на один коммит от ветки master в удаленном репозитории origin. Это означает, что есть коммит в удаленном репозитории, которого еще нет у нас локально.
  • "(use "git pull" to update your local branch)": Git даже дает нам подсказку, как обновить нашу локальную ветку.

Команда git status - это окно в состояние вашего репозитория. Она сообщает вам, на какой ветке вы находитесь, есть ли у вас несохраненные изменения и как ваша текущая ветка сравнивается с ее родительской веткой (в данном случае origin/master).

Понимание вывода команды git status является важным аспектом эффективной работы с Git. Это помогает вам понять, нужно ли вам получить изменения из удаленного репозитория, есть ли у вас изменения для коммита или чист ли ваш рабочий каталог.

Использование git log HEAD..@{u} для просмотра отстающих коммитов

На предыдущем этапе команда git status сообщила, что наша локальная ветка отстает от удаленной. Но как узнать, какие именно коммиты у нас отсутствуют?

Мы можем использовать команду git log с специальным синтаксисом, чтобы показать только те коммиты, которые есть на удаленной ветке, но отсутствуют на нашей локальной. Синтаксис HEAD..@{u} сравнивает нашу текущую ветку (HEAD) с ее родительской веткой (@{u}, которая в нашем случае представляет собой origin/master).

Убедитесь, что вы находитесь в директории ~/project/my-time-machine:

cd ~/project/my-time-machine

Теперь выполните следующую команду:

git log HEAD..@{u}

Вы должны увидеть запись в журнале для коммита, который мы сделали в удаленном репозитории на первом этапе:

commit <commit-hash> (origin/master)
Author: Your Name <[email protected]>
Date:   <Date and Time>

    Add remote file

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

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

Нажмите q, чтобы выйти из режима просмотра журнала.

Резюме

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

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