git: как проверить различия локального репозитория и удаленного? Печать
Добавил(а) microsin   

Для проверки различий между локальным и удаленным репозиторием в Git используются несколько команд. Далее показаны основные способы поиска различий.

[Основные команды для сравнения]

1. Просмотр отличий перед push

Сначала нужно получить актуальные изменения с удаленного репозитория:

git fetch origin

git fetch origin — команда, которая загружает изменения из удаленного репозитория, но НЕ сливает их с вашей рабочей веткой.

[Что именно делает git fetch origin]

Основное действие:

- Скачивает все новые коммиты, ветки и теги из репозитория `origin`
- Обновляет удаленные ссылки (remote-tracking branches) в вашем локальном репозитории
- Не изменяет ваши рабочие файлы и текущую ветку

Что обновляется:

# До git fetch:
origin/main → устаревшее состояние

# После git fetch:
origin/main → актуальное состояние удаленного репозитория

[Отличие от других команд]

Команда Что делает
git fetch origin Только загружает изменения, не меняет рабочую директорию
git pull origin git fetch + git merge (загружает И сливает изменения)
git clone Первоначальное копирование репозитория

[Практическое использование]

Типичный рабочий процесс:

1. Загружаем изменения с удаленного репозитория

git fetch origin

2. Смотрим, что изменилось

git log --oneline main..origin/main

3. Принимаем решение - сливать или нет

git merge origin/main

.. или

git rebase origin/main

[Пример визуализации]

# Перед fetch:
# Локально: A-B-C (main)
# Удаленно: A-B-C-D-E (origin/main)

git fetch origin

# После fetch:
# Локально: A-B-C (main), A-B-C-D-E (origin/main)
# Теперь можно сравнить и решить, как объединить изменения

[Что можно сделать после fetch]

Просмотр изменений:

# Какие коммиты появились в удаленном репозитории?
git log main..origin/main

# Какие файлы изменились?
git diff main origin/main

# Какие новые ветки появились?
git branch -r

Слияние изменений:

# Способ 1: Merge
git merge origin/main

# Способ 2: Rebase
git rebase origin/main

# Способ 3: Просто обновить ссылку (fast-forward)
git merge --ff-only origin/main

[Полезные варианты fetch]

# Загрузить изменения со всех удаленных репозиториев
git fetch --all

# Загрузить изменения и очистить удаленные ветки, которых уже нет
git fetch --prune

# Показать что будет загружено (пробный запуск)
git fetch --dry-run

[Важные моменты]

- fetch безопасен — он никогда не испортит вашу работу
- Данные скачиваются в скрытую область .git/, а не в рабочую директорию
- После fetch вы можете спокойно анализировать изменения перед слиянием
- Рекомендуется всегда делать fetch перед сравнением с удаленным репозиторием

Итог: git fetch origin — это "посмотри, но не трогай" подход к работе с удаленными изменениями, который дает вам контроль над процессом обновления кода.

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

git diff origin/имя_ветки

2. Сравнение конкретных веток

Сравнить локальную ветку main с удаленной origin/main:

git diff main origin/main

Или с использованием FETCH_HEAD (после git fetch):

git diff main..origin/main

3. Просмотр статуса расхождений

Показать расхождения между локальной и удаленной веткой:

git status -uno

[Более подробные способы]

1. Просмотр отличий в коммитах

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

git log origin/main..main

Показать коммиты, которые есть в удаленном, но нет в локальном:

git log main..origin/main

Графическое представление расхождений:

git log --oneline --graph --decorate main origin/main

2. Сравнение с конкретным удаленным репозиторием

Если у вас несколько удаленных репозиториев:

git diff main upstream/main  # для репозитория с псевдонимом 'upstream'

[Полезные флаги для git diff]

Флаг Описание
--name-only Показывает только имена измененных файлов
--name-status Показывает имена файлов и тип изменений
--stat Статистика изменений
--color-words Подсветка измененных слов

Пример:

git diff --stat origin/main

[Частые случаи]

1. Если получаете ошибку "unknown revision"

Сначала обновите информацию об удаленных ветках:

git remote update
git fetch --all

git remote update — команда, которая обновляет информацию со всех удаленных репозиториев сразу.

[Что делает git remote update]

Основное действие:

- Выполняет `git fetch` для всех удаленных репозиториев (origin, upstream и др.)
- Загружает все новые коммиты, ветки и теги со всех настроенных remote-ов
- Обновляет все удаленные ссылки (remote-tracking branches)

[Сравнение с другими командами]

Команда Что делает Когда использовать
git remote update Обновляет все удаленные репозитории Когда работаете с несколькими remote
git fetch origin Обновляет только origin Когда нужен только основной репозиторий
git fetch --all Аналогично git remote update Синоним, делает то же самое
git pull fetch + merge Когда нужно сразу обновить текущую ветку

[Практическое использование]

Проверка настроенных remote-репозиториев:

git remote -v

Пример вывода:

origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)
upstream  https://github.com/original/repo.git (fetch)
upstream  https://github.com/original/repo.git (push)

Типичные сценарии:

Сценарий 1: Обновление всех remote-репозиториев

# Обновляет и origin, и upstream, и другие
git remote update

# После этого можно сравнивать с любым remote
git log --oneline main..origin/main
git log --oneline main..upstream/main

Сценарий 2: Обновление конкретного remote

# Если нужно обновить только определенный remote
git remote update origin
git remote update upstream

[Что происходит после git remote update]

До обновления:

Локально: A-B-C (main)
Origin:   A-B-C-D-E (origin/main) 
Upstream: A-B-C-F-G (upstream/main)

После git remote update:

git remote update

Локально: A-B-C (main)
          A-B-C-D-E (origin/main) - обновлено!
          A-B-C-F-G (upstream/main) - обновлено!

[Полезные опции]

# Обновить все remote с выводом подробной информации
git remote update -v

# Обновить только определенные remote
git remote update origin upstream

# Показать что будет обновлено (пробный запуск)
git remote update --dry-run

[Типичные случаи использования]

Для форков на GitHub:

# Обновить и основной форк (origin) и оригинальный репозиторий (upstream)
git remote update

# Сравнить свой форк с оригинальным репозиторием
git log --oneline main..upstream/main

Для проектов с несколькими remote:

# Когда работаете с разными серверами (production, staging, etc.)
git remote update
git diff origin/main staging/main

Для очистки устаревших веток:

# Обновить и удалить ссылки на ветки, которых больше нет в remote
git remote update --prune

[Быстрые команды после обновления]

# Посмотреть все обновленные ветки
git branch -r

# Увидеть расхождения с origin
git status

# Посмотреть новые коммиты во всех remote
git log --oneline --graph --decorate --all

[Рекомендации]

- Используйте git remote update когда работаете с несколькими удаленными репозиториями
- Используйте git fetch origin когда нужен только основной репозиторий
- Делайте update регулярно чтобы быть в курсе изменений во всех связанных репозиториях

Итог: git remote update — удобная команда для комплексного обновления информации со всех настроенных удаленных репозиториев, особенно полезная при работе с форками или проектами, имеющими несколько источников.

Для сравнения конкретного файла:

git diff origin/main -- путь/к/файлу

2. Просмотр изменений в staged файлах

git diff --staged
git diff --cached

[Типичный рабочий процесс]

1. Получить актуальные изменения

git fetch origin

2. Проверить различия

git diff origin/main

3. Если все хорошо - сделать merge или rebase

git merge origin/main

.. или

git rebase origin/main

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

[Ссылки]

1. Краткий справочник по Git.