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

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

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

Введение

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

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


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/push("Update Remote") subgraph Lab Skills git/add -.-> lab-560040{{"Как проверить, есть ли неподтвержденные коммиты в ветке Git"}} git/status -.-> lab-560040{{"Как проверить, есть ли неподтвержденные коммиты в ветке Git"}} git/commit -.-> lab-560040{{"Как проверить, есть ли неподтвержденные коммиты в ветке Git"}} git/log -.-> lab-560040{{"Как проверить, есть ли неподтвержденные коммиты в ветке Git"}} git/push -.-> lab-560040{{"Как проверить, есть ли неподтвержденные коммиты в ветке Git"}} end

Использование 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 для более детального просмотра конкретных коммитов, которые есть в локальной ветке, но отсутствуют в отслеживаемой удаленной ветке. Эта команда выводит хэши и сообщения коммитов, которые еще не были отправлены на удаленный репозиторий, позволяя точно определить, какие изменения ожидают отправки. Наконец, мы обсудили концепцию проверки этого путем сравнения локальной и удаленной веток, укрепив понимание того, как подтвердить наличие неподтвержденных коммитов.