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

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

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

Введение

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

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


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/status("Check Status") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") subgraph Lab Skills git/status -.-> lab-560038{{"Как проверить, расходится ли ветка Git с удаленной"}} git/diff -.-> lab-560038{{"Как проверить, расходится ли ветка Git с удаленной"}} git/log -.-> lab-560038{{"Как проверить, расходится ли ветка Git с удаленной"}} git/fetch -.-> lab-560038{{"Как проверить, расходится ли ветка Git с удаленной"}} end

Получение обновлений и проверка статуса Git на наличие расхождений

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

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

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

cd ~/project/my-time-machine

Теперь получим последние изменения из имитированного удаленного репозитория. Для этого используем команду git fetch. Эта команда загружает коммиты, файлы и ссылки (refs) из удаленного репозитория в ваш локальный репозиторий. При этом не выполняется слияние этих изменений в текущую ветку.

git fetch origin

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

Далее используем команду git status, чтобы проверить, отстает ли наша локальная ветка от удаленной. Команда git status позволяет вам увидеть текущее состояние вашего репозитория. Она сообщает о подготовленных к коммиту (staged), неподготовленных (unstaged) и неотслеживаемых (untracked) файлах, а также предоставляет информацию о связи между текущей веткой и ее веткой-родителем (upstream branch).

Запустите команду git status:

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

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

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

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

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

Команда git log очень гибкая. Она позволяет вам просматривать историю коммитов различными способами. Чтобы сравнить нашу локальную ветку (HEAD) с отслеживаемой удаленной веткой (origin/master), можно использовать следующий синтаксис:

git log HEAD..origin/master

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

cd ~/project/my-time-machine

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

git log HEAD..origin/master

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

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

commit abcdef1234567890abcdef1234567890abcdef (origin/master)
Author: Another User <[email protected]>
Date:   Tue Aug 8 10:00:00 2023 +0000

    Add a new feature

Этот вывод четко показывает коммит, который есть на удаленном репозитории, но отсутствует локально. Синтаксис HEAD..origin/master сообщает Git показать коммиты, которые достижимы из origin/master, но не из HEAD.

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

Не забудьте нажать q, чтобы выйти из режима просмотра лога, если он открылся в постраничном просмотрщике (pager).

Проверка различий с помощью git diff @{u} HEAD

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

Команда git diff показывает различия между двумя точками в истории Git. Мы можем использовать ее для сравнения нашей текущей локальной ветки (HEAD) с ее веткой-родителем (upstream branch). Ветка-родитель - это ветка на удаленном репозитории, за которой отслеживается ваша локальная ветка. В нашем случае веткой-родителем для master является origin/master. Git предоставляет удобную сокращенную запись для ветки-родителя: @{u} или @{upstream}.

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

cd ~/project/my-time-machine

Теперь запустите команду git diff, чтобы увидеть различия между вашей локальной веткой и ее веткой-родителем:

git diff @{u} HEAD

Эта команда покажет вам различия между файлами в текущем коммите (HEAD) и файлами в последнем коммите на ветке-родителе (@{u}) построчно.

Если на удаленном репозитории есть изменения, которые вы еще не подтянули, вывод будет показывать эти различия. Например, если на удаленном репозитории была добавлена строка в файл message.txt, вывод может выглядеть так:

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+This is a new line from the remote.

Знак + указывает на строки, которые есть в ветке-родителе (@{u}), но которых нет в вашей локальной ветке (HEAD).

Использование git diff @{u} HEAD - мощный способ предварительно просмотреть изменения, которые есть на удаленном репозитории, прежде чем объединить их с вашей локальной веткой. Это позволяет вам понять точные изменения, которые были внесены, что очень полезно для ревью кода или просто для того, чтобы быть в курсе эволюции проекта.

Нажмите q, чтобы выйти из режима просмотра различий, если он открылся в постраничном просмотрщике (pager).

Резюме

В этом практическом занятии (лабораторной работе) мы научились проверять, расходится ли локальная ветка Git с ее удаленным аналогом. Мы начали с имитации удаленного репозитория и использовали команду git fetch для получения последних изменений без их объединения. Затем мы воспользовались командой git status, чтобы быстро определить, отстает ли наша локальная ветка от удаленной. Это можно понять по сообщениям вида "Your branch is behind 'origin/master' by X commit" (Ваша ветка отстает от 'origin/master' на X коммитов).

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