На Mac откройте Терминал, перейдите в репозиторий и выполните git status -sb. Если для текущей ветки отображается ahead 1 (или другое положительное число) относительно вышестоящей ветки (upstream), в ней есть локальные коммиты, отсутствующие в удаленной ветке отслеживания, с которой Git выполняет сравнение. Сначала выполните fetch, чтобы обновить это сравнение, затем выведите список конкретных коммитов. Это проверяет историю коммитов; правки, которые еще не были закоммичены, относятся к другой категории локальных изменений.

Проверка текущей ветки относительно удаленной ветки отслеживания

В Терминале перейдите в папку проекта. Вы можете ввести cd , перетащить папку из Finder в окно Терминала и нажать клавишу Return. Выполните:

git status -sb

Результат вида ## main...origin/main [ahead 2] означает, что локальная ветка main опережает настроенную вышестоящую ветку origin/main на два коммита, основываясь на последнем зафиксированном Git состоянии удаленного репозитория. Значение [behind 1] означает, что в отслеживаемой удаленной ветке есть один коммит, отсутствующий локально. Если присутствуют оба счетчика, ветки разошлись (diverged). В документации Git указано, что status может показывать количество коммитов ahead и behind, когда вышестоящая ветка настроена и доступна для сравнения. Документация по Git status

Для получения полного статуса используйте git status. Эта команда также сообщает об изменениях в рабочей директории (working tree) и индексе (staging area). Измененные или неотслеживаемые файлы не служат доказательством наличия неотправленных коммитов: они еще не являются коммитами. Чистая рабочая директория все еще может содержать неотправленные коммиты, а «грязная» (с изменениями) — не содержать ни одного.

Обновление сравнения и просмотр коммитов

Имя origin/main — это локальная ссылка удаленного отслеживания; это не динамическое отображение состояния сервера в реальном времени. Выполните fetch, чтобы обновить ссылки из настроенных удаленных репозиториев, а затем снова проверьте статус:

git fetch
git status -sb

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

Если статус показывает, что ветка опережает удаленную (ahead) и у нее настроен upstream, выведите коммиты, достижимые из текущей ветки, но отсутствующие в этой вышестоящей ветке:

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

Каждая строка вывода — это коммит; первая строка соответствует самому новому коммиту в диапазоне. Пустой результат означает, что Git не нашел коммитов в этом диапазоне. Сокращение @{u} обозначает настроенную вышестоящую ветку (upstream) текущей ветки, а диапазон с двумя точками выбирает коммиты, достижимые из HEAD, но отсутствующие в upstream. Документация по ревизиям Git

Например, если в статусе указано [ahead 2] и команда log выводит темы двух коммитов, именно эти коммиты опережают отслеживаемую ветку локально. Это полезная проверка перед тем, как принять решение об их отправке. Сама по себе эта команда ничего не отправляет.

Если Git не может сравнить ветку

Если git status -sb не показывает счетчики ahead/behind, возможно, для ветки не настроена вышестоящая ветка (upstream). Выполните:

git branch -vv

Текущая ветка отмечена символом *; текст в квадратных скобках (если он есть) указывает ее upstream и значения расхождения. Если upstream не отображается, у Git нет стандартной ссылки отслеживания для выполнения этого сравнения. Команда git remote -v может показать настроенные имена и URL-адреса удаленных репозиториев, но она не определяет, какая именно удаленная ветка является целевой. Документация Git определяет upstream как опциональные настройки ветки, используемые такими командами, как status. Документация по Git pull

Не угадывайте origin/main: ваша ветка может отслеживать ветку с другим именем или другой удаленный репозиторий. Если вы знаете целевую удаленную ветку, выполните явное сравнение после fetch, заменив origin/main на ее фактическое имя:

git log --oneline origin/main..HEAD

Это выведет коммиты, присутствующие в текущей HEAD, но отсутствующие в указанной ссылке. Если назначение неизвестно точно, проверьте конфигурацию ветки и удаленного репозитория, прежде чем рассматривать результат как предварительный просмотр перед push. Git позволяет настраивать назначение для push отдельно от upstream, используемого для сравнения. Документация по ревизиям Git

Что устанавливает и чего не устанавливает эта проверка

Сравнение актуально настолько, насколько актуален последний успешный fetch. Кто-то другой мог отправить новые коммиты после вашего fetch, или состояние сервера могло измениться до того, как вы выполните push. Успешный fetch дает Git более свежую ссылку; он не гарантирует, что последующий push завершится успехом. Точно так же коммит, отсутствующий в origin/main, не обязательно отсутствует во всех удаленных репозиториях или ветках.

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

Источники