Как проверить, есть ли неподтвержденные коммиты в ветке Git

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

Введение

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

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

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

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

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

cd ~/project/my-time-machine

Теперь создадим новый файл и добавим в него некоторое содержимое. Назовем этот файл future_plans.txt:

echo "Plan for world domination." > future_plans.txt

Далее нам нужно добавить этот новый файл в индекс (staging area), чтобы подготовить его к коммиту:

git add future_plans.txt

Теперь создадим коммит с сообщением, описывающим наши изменения:

git commit -m "Add future plans"

Вы должны увидеть вывод, похожий на следующий, который указывает на то, что новый коммит был создан:

[master abcdefg] Add future plans
 1 file changed, 1 insertion(+)
 create mode 100644 future_plans.txt

Теперь мы создали новый коммит в нашей локальной ветке master. Однако этот коммит существует только локально и не был отправлен в какой-либо удаленный репозиторий.

Давайте используем команду git status для просмотра текущего состояния нашего репозитория:

git status

Теперь вывод должен показать, что ваша локальная ветка находится "позади" удаленной ветки (если вы настроили ее, в этом простом примере мы этого не делали, но Git все равно дает подсказку):

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   future_plans.txt

nothing to commit, working tree clean

Важная строка здесь - Your branch is ahead of 'origin/master' by 1 commit.. Это говорит нам, что наша локальная ветка master имеет один коммит, которого нет в ветке origin/master (это имя по умолчанию для удаленной ветки, которое ожидает Git).

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

Запустите команду git log --oneline @{u}..HEAD

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

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

Команда, которую мы будем использовать, это git log --oneline @{u}..HEAD. Разберем эту команду на части:

  • git log: Это команда для просмотра истории коммитов.
  • --oneline: Этот параметр выводит каждый коммит в одну строку, делая вывод компактным и легким для чтения.
  • @{u}: Это специальный синтаксис, который ссылается на upstream-ветку (ветку, на которую отслеживает локальная ветка). В нашем случае, так как мы явно не указали upstream-ветку, Git по умолчанию использует origin/master (предполагая, что origin - это имя удаленного репозитория, а master - это ветка).
  • ..HEAD: Это обозначение диапазона. HEAD ссылается на вершину текущей ветки (нашу локальную ветку master). Диапазон @{u}..HEAD означает "покажи мне коммиты, которые достижимы из HEAD, но недостижимы из @{u}". Проще говоря, это показывает коммиты, которые есть в нашей локальной ветке, но отсутствуют в удаленной upstream-ветке.

Теперь запустим команду:

git log --oneline @{u}..HEAD

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

abcdefg (HEAD -> master) Add future plans

Этот вывод показывает коммит, который мы создали на предыдущем этапе (Add future plans). Уникальный идентификатор (abcdefg) будет другим в вашем терминале, но сообщение коммита должно совпадать.

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

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

Проверка с сравнением с удалённым репозиторием

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

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

Давайте еще раз посмотрим на вывод команды git status:

git status

Вы по-прежнему должны увидеть строку, указывающую, что ваша ветка находится "позади":

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

... (rest of the output)

И вывод команды git log --oneline @{u}..HEAD:

git log --oneline @{u}..HEAD

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

abcdefg (HEAD -> master) Add future plans

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

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

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

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

Резюме

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

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