Git: как проверить актуальность локального репо?

85

Я хотел бы знать, обновлено ли мое локальное репо (а если нет, в идеале, я хотел бы увидеть изменения).

Как я мог это проверить, не делая git fetchили git pull?

Миша Морошко
источник

Ответы:

96

Попробуйте git fetch --dry-run В руководстве ( git help fetch) говорится:

--dry-run
Show what would be done, without making any changes.
Филип Окли
источник
3
Благодаря! Хотя по выводам сложно понять, какие файлы были добавлены / изменены / удалены.
Миша Морошко
1
Вы увидите, какие теги обновлены, и диапазон начала… конца фиксации для различных веток. Если этого недостаточно, сделайте это как правильную выборку (а не извлечение), которая даст вам правильную, отдельную локальную копию удаленного компьютера, не влияя на работу вашей собственной ветки. Вытягивание будет пытаться объединить два, а это не то, что вам нужно. Передача данных одинакова независимо от того, работаете вы или нет.
Филип Окли,
4
почему, когда я бегу, git fetch --dry-runничего не появляется?
Парамвир Сингх Карвал
3
@ParamvirSinghKarwal Git скудно сообщает о том, что сообщает. Если нечего сказать, ничего не говорится, как будто ничего не произошло. Возможно, вы обновили refspec для регулярной загрузки. Может добавить --all?
Филип Окли
2
@AaronBeall Если это так, то это, скорее всего, означает, что вы уже загрузили эти изменения локально (так что извлекать нечего), но еще не слили их в свою ветку. git pullпримерно эквивалентен a git fetch && git merge. Если вы в какой-то момент запускали выборку без использования --dry-run, значит, вы уже получили данные локально.
DuckPuppy
36
git remote show origin

Результат:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------
Джим Смит
источник
Это список постоянных ветвей. Если у вас есть репозиторий с длинной историей, вывод будет довольно загроможденным.
Пауло Карвалью
28

Первое использование git remote update, чтобы обновить ваши удаленные ссылки. Затем вы можете сделать одно из нескольких, например:

  1. git status -unoсообщит вам, идет ли ветвь, которую вы отслеживаете, впереди, сзади или в другую сторону. Если ничего не сказано, значит, локальный и удаленный одинаковые. Результат образца:

В филиале DEV

Ваша ветка отстает от origin / DEV на 7 коммитов и может быть быстро перенаправлена.

(используйте "git pull", чтобы обновить локальную ветку)

  1. git show-branch *master покажет вам коммиты во всех ветвях, имена которых заканчиваются на «master» (например, master и origin / master).

Если вы используете -vс git remote update ( git remote -v update), вы можете видеть, какие ветки были обновлены, поэтому вам не нужны дополнительные команды.

Пиюш Агарвал
источник
2
Почему это так далеко? git remote update ; git status -unoрешил это. git fetch --dry-runне давал выхода даже в тех случаях, когда локальный был позади удаленного.
Аарон Билл,
17

вы можете использовать его, git status -unoчтобы проверить, обновлена ​​ли ваша локальная ветка с исходной.

Flowdee
источник
19
Он дает только локальный статус, а не проверяет удаленную ветку.
Ishan Liyanage
4
Выдает только местные, но git remote update ; git status -unoсвое дело! Не git fetch --dry-runдал результата, когда я ожидал (и git pullпотянул).
Аарон Билл,
1
Этот ответ неверен и должен быть удален. Как бы то ни было, это увековечивает очень распространенный, но ошибочный миф о том, как работает Git, который развеивается только тогда, когда / если кто-то решает прочитать комментарии к нему.
Прометей
8

Не совсем - но я не понимаю, насколько git fetchэто повредит, поскольку это не изменит ни одну из ваших местных веток.

Никлас Киршмайер
источник
Я полностью согласен с этим. Git pull может повредить файлы и перезаписать их. Но git fetch извлекает только метаданные, позволяя таким командам, как git status, сообщать вам, обновлено ли ваше локальное репо или нет, без перезаписи каких-либо файлов. Он может не отвечать на букву вопроса, но он отвечает на суть вопроса, предоставляя вам нужный инструмент. Git fetch, затем git status сообщит вам, где находится ваше локальное репо по отношению к удаленному, без перезаписи файлов.
merlit64
5

Другой альтернативой является просмотр состояния удаленной ветки, используя git show-branch remote/branchего для сравнения, вы можете git show-branch *branchувидеть ветку на всех пультах дистанционного управления, а также в своем репозитории! ознакомьтесь с этим ответом для получения дополнительной информации https://stackoverflow.com/a/3278427/2711378

Амануэль Нега
источник
5

Вам нужно будет выполнить две команды:

  1. git fetch origin
  2. git status
user3695833
источник
1
Это работает, но в вопросе четко указано, что без «выборки». Есть много случаев, когда вы хотите узнать, чем ваше локальное репо отличается от удаленного репо, без фактического извлечения или объединения изменений.
Pedram Bashiri 07
1
@pedrambashiri Мне искренне любопытно, как? Насколько мне известно, одно только получение ничего не может повредить.
Prometheus
@Prometheus первым делом, я просто хотел указать, что, когда в вопросе четко указано `` без выборки '', вы просто не можете использовать выборку в своем ответе, если нет другого способа сделать это или нет реального случая для этого без, это требует будет объяснено в ответе. Но чтобы ответить на ваш вопрос, выборка обновляет вашу локальную копию удаленного репо. Посмотрите на диаграмму в этом посте blog.osteele.com/2008/05/my-git-workflow
Pedram Bashiri 03 авг.2020
4

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

Эта команда обновляет только ветки удаленного отслеживания и не влияет на ваше рабочее дерево, пока вы не позвоните git mergeилиgit pull .

Чтобы увидеть разницу между вашей локальной веткой и веткой удаленного отслеживания после загрузки, вы можете использовать git diff или git cherry, как описано здесь.

Braitsch
источник
2

Если вы используете

git fetch --dry-run -v <link/to/remote/git/repo>

вы получите ответ о том, актуален ли он. По сути, вам просто нужно добавить параметр «подробный» к приведенному ранее ответу.

Дон Дэвис
источник
1

Это невозможно без использования git fetchили git pull. Как узнать, является ли репозиторий «актуальным», не заходя в удаленный репозиторий, чтобы увидеть, что вообще означает «актуальный»?

Йорг В. Миттаг
источник
5
Пожалуйста, подтвердите это! Вы только что ответили, что думаете! Будьте осторожнее, так как новички с ним не справятся!
Амануэль Нега
4
@AmanuelNega: Это простая логика. Если вы хотите знать, находится ли ваше локальное репо в том же состоянии, что и удаленное репо, вам необходимо знать состояние удаленного репо. Период. Если вы не знаете состояние удаленного репо, вы не можете знать, находится ли локальное репо в том же состоянии. Обратите внимание, что используется самый высокий и принятый ответ git pull, который ОП явно запрещает в своем вопросе.
Jörg W Mittag
2
Быть информированным! git status -unoэто работает, и можно также использовать git show-branch *masterдля просмотра статуса всех основных веток! Вы все еще говорите, что это невозможно? Вы можете видеть статус любой ветки, если у вас есть доступ к пульту!
Амануэль Нега
2
@AmanuelNega: git statusтолько сообщает вам статус ваших местных ссылок, он не говорит вам, обновлены ли ваши местные ссылки с удаленными ссылками. Опять же: просто логически невозможно узнать, в каком состоянии находится удаленное репо, без получения состояния удаленного репо. Период. Это всего лишь основные законы пространства-времени.
Jörg W Mittag
6
Это не «логически» невозможно, поскольку, очевидно, можно позвонить кому-нибудь в своей серверной и сказать: «Какой хэш у вашей HEAD в главной ветке», они могли бы вам сказать, а затем вы могли бы проверить локально и увидеть, что вы не используете нет хеша. Теперь вы знаете, что они не синхронизированы.
Джеймс Робинсон
1

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

тем не менее,

ответ:
git fetch origin
git status (вы увидите результат типа «Ваша ветка отстает от origin / master на 9 коммитов»)
для обновления до удаленных изменений: git pull

Адарш
источник