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

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

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

Введение

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

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


Skills Graph

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

Проверка статуса Git на наличие несоответствий (коммитов, отсутствующих на удалённой ветке)

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

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

cd ~/project/my-time-machine

Теперь создадим новый файл и добавим в него некоторое содержимое. Мы имитируем внесение изменений, которые в конечном итоге будем коммитить.

echo "This is a new line for the future." >> message.txt

Эта команда добавляет текст "This is a new line for the future." в файл message.txt, который мы создали ранее.

Далее, подготовим это изменение для коммита с помощью команды git add:

git add message.txt

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

git commit -m "Add another message to the future"

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

[master a1b2c3d] Add another message to the future
 1 file changed, 1 insertion(+)

Теперь, когда у нас есть новый коммит локально, проверим статус нашего репозитория еще раз с помощью команды 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)

nothing to commit, working tree clean

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

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

Использование команды git log @{u}..HEAD

На предыдущем этапе мы увидели, что команда git status сообщает, что наша локальная ветка находится "впереди" удаленной ветки. Но как узнать, какие коммиты находятся впереди? Именно здесь пригодится команда git log @{u}..HEAD.

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

Таким образом, @{u}..HEAD означает "покажи мне коммиты, которые есть в текущей ветке (HEAD), но которых нет в ветке upstream (@{u})".

Давайте попробуем это в нашей директории my-time-machine:

cd ~/project/my-time-machine
git log @{u}..HEAD

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

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add another message to the future

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

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

Помните, вы можете нажать q для выхода из просмотра лога.

Проверка с учетом всех веток

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

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

cd ~/project/my-time-machine

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

git log --all --decorate --oneline --graph

Разберем параметры этой команды:

  • --all: Показать историю всех веток.
  • --decorate: Показать имена веток и тегов рядом с коммитами, на которые они ссылаются.
  • --oneline: Отображать каждый коммит в одной строке.
  • --graph: Нарисовать текстовую графическую схему истории коммитов слева от вывода.

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

* a1b2c3d (HEAD -> master) Add another message to the future
* e4f5g6h (origin/master) Send a message to the future

В этом выводе:

  • Верхняя строка показывает наш последний коммит (a1b2c3d) с сообщением "Add another message to the future". (HEAD -> master) указывает, что наш текущий HEAD (место, где мы в данный момент работаем) и локальная ветка master ссылаются на этот коммит.
  • Нижняя строка показывает предыдущий коммит (e4f5g6h) с сообщением "Send a message to the future". (origin/master) указывает, что ветка origin/master (удаленная отслеживающая ветка) ссылается на этот коммит.

График слева (символы * и линии) наглядно показывает, что наша локальная ветка master находится на один коммит впереди ветки origin/master. Это подтверждает то, что нам сообщило git status ранее.

Эта команда невероятно полезна для визуализации истории вашего репозитория, особенно когда у вас есть несколько веток. Она помогает понять, как ветки расходятся и объединяются, и где находятся ваши локальные ветки по отношению к удаленным.

Нажмите q для выхода из просмотра лога.

Резюме

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

В практическом занятии продемонстрировано практическое применение команды git status для определения неподтвержденных коммитов, подчеркивая ее важность для понимания состояния синхронизации между локальным и удаленным репозиториями.