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

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

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


person Misha Moroshko    schedule 29.10.2011    source источник


Ответы (12)


Попробуйте git fetch --dry-run В руководстве (git help fetch) сказано:

--dry-run
Show what would be done, without making any changes.
person Philip Oakley    schedule 29.10.2011
comment
Спасибо! Хотя по выводам сложно понять, какие файлы были добавлены / изменены / удалены. - person Misha Moroshko; 30.10.2011
comment
Вы увидите, какие теги обновлены, и диапазон начала… конца фиксации для различных веток. Если этого недостаточно, сделайте это как правильную выборку (не извлечение), которая даст вам правильную, отдельную локальную копию удаленного компьютера, не влияя на работу вашей собственной ветки. Вытягивание будет пытаться объединить два, а это не то, что вам нужно. Передача данных одинакова независимо от того, работаете вы в сухом состоянии или нет. - person Philip Oakley; 31.10.2011
comment
почему, когда я запускаю git fetch --dry-run, ничего не отображается? - person Paramvir Singh Karwal; 20.08.2018
comment
@ParamvirSinghKarwal Git редко сообщает то, что сообщает. Если нечего сказать, он ничего не говорит, как ни в чем не бывало. Возможно, вы обновили refspec для регулярной загрузки. Может добавить --all? - person Philip Oakley; 21.08.2018
comment
Я не знаю, изменился ли git или мне что-то не хватает, но git fetch --dry-run не выводит результат, когда git pull собирается загрузить кучу обновлений. Другими словами, он не говорит мне, отстает моя ветка или нет. - person Aaron Beall; 27.09.2019
comment
@AaronBeall Если это так, то это, скорее всего, означает, что вы уже загрузили эти изменения локально (так что извлекать нечего), но еще не слили их в свою ветку. git pull примерно эквивалентен git fetch && git merge. Если вы в какой-то момент запускали выборку без --dry-run, значит, вы уже получили данные локально. - person DuckPuppy; 22.10.2019
comment
@DuckPuppy Да, поэтому кажется, что git fetch недостаточно знать, обновлено ли мое локальное репо. Мне не ясно, не понял ли OP, когда этот ответ был принят, или вопрос сформулирован нечетко. - person Aaron Beall; 22.10.2019
comment
@AaronBeall Ну, если OP означал проверку состояния локального репозитория, то это правильное решение. Проверка актуальности рабочей копии - это совсем другое дело. Есть несколько открытых тем и все указывают на то, что такой возможности нет. нет ни git merge --dry-run, ни git pull --dry-run, которые являются разновидностью боли. Всегда предлагаемое решение - выборка, git merge --no-commit --no-ff и прерывание, но оно не отвечает на вопрос, поскольку выборка уже была произведена. Не говоря уже о непостоянных изменениях. - person Maciej Załucki; 16.11.2019
comment
работает быстрее чем git fetch? - person alper; 01.12.2020

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) <-------
person jim smith    schedule 30.03.2017
comment
Это список постоянных ветвей. Если у вас есть репозиторий с длинной историей, вывод будет довольно загроможденным. - person Paulo Carvalho; 21.10.2020

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

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

В филиале DEV

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

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

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

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

person Piyush Agarwal    schedule 13.09.2018
comment
Почему это так далеко? git remote update ; git status -uno решил это. git fetch --dry-run не давал никаких результатов даже в тех случаях, когда локальный был позади удаленного. - person Aaron Beall; 27.09.2019

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

person flowdee    schedule 24.03.2014
comment
Он дает только локальный статус, не проверяя удаленную ветку. - person Ishan Liyanage; 01.10.2014
comment
Выдает только местные, но git remote update ; git status -uno свое дело! git fetch --dry-run не дал результата, когда я ожидал (а git pull вытащил). - person Aaron Beall; 27.09.2019
comment
Этот ответ неверен и должен быть удален. Как бы то ни было, это увековечивает очень распространенный, но ошибочный миф о том, как работает Git, который развеивается только тогда, когда / если кто-то решает прочитать комментарии к нему. - person Hashim Aziz; 06.07.2020

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

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

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

  1. git fetch origin
  2. git статус
person user3695833    schedule 27.07.2015
comment
Это работает, но в вопросе четко сказано, что без «выборки». Есть много случаев, когда вы хотите знать, чем ваше локальное репо отличается от удаленного репо, без фактического извлечения или объединения изменений. - person pedram bashiri; 07.09.2019
comment
@pedrambashiri Мне искренне любопытно, как? Насколько мне известно, одно только получение ничего не может повредить. - person Hashim Aziz; 28.07.2020
comment
@Prometheus первым делом, я просто хотел указать, что когда в вопросе четко указано `` без выборки '', вы просто не можете использовать выборку в своем ответе, если нет другого способа сделать это, или нет реального случая для этого без, это требует будет объяснено в ответе. Но чтобы ответить на ваш вопрос, выборка обновляет вашу локальную копию удаленного репо. Посмотрите на диаграмму в этом сообщении blog.osteele.com/2008/05/ мой-git-workflow - person pedram bashiri; 03.08.2020

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

person Amanuel Nega    schedule 11.11.2014

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

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

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

person braitsch    schedule 29.10.2011

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

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

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

person Don Davis    schedule 28.10.2019

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

person Jörg W Mittag    schedule 29.10.2011
comment
Пожалуйста, подтвердите это! Вы только что ответили, что думаете! Будьте осторожны, так как новички с ним не справятся! - person Amanuel Nega; 11.11.2014
comment
@AmanuelNega: Это простая логика. Если вы хотите знать, находится ли ваше локальное репо в том же состоянии, что и удаленное репо, вам необходимо знать состояние удаленного репо. Период. Если вы не знаете состояние удаленного репо, вы не можете знать, находится ли локальное репо в том же состоянии. Обратите внимание, что в ответе с наибольшим количеством голосов и принятых ответов используется git pull, что ОП явно запрещает в своем вопросе. - person Jörg W Mittag; 11.11.2014
comment
Быть информированным! git status -uno это работает, и можно также использовать git show-branch *master, чтобы увидеть состояние всех основных веток! Вы все еще говорите, что это невозможно? Вы можете видеть статус любой ветки, если у вас есть доступ к пульту! - person Amanuel Nega; 11.11.2014
comment
@AmanuelNega: git status только сообщает вам статус ваших местных ссылок, он не сообщает вам, обновлены ли ваши местные ссылки с удаленными ссылками. Опять же: просто логически невозможно узнать, в каком состоянии находится удаленное репо, без получения состояния удаленного репо. Период. Это всего лишь основные законы пространства-времени. - person Jörg W Mittag; 11.11.2014
comment
Я не знаю, как этот ответ был отклонен. Ответ Йорга вполне логичен и верен. - person Powers; 26.08.2015
comment
Это технически правильно, потому что OP сказал, не делая git fetch или git pull. OP на самом деле не означал (насколько я могу судить) вообще без использования команд git pull или git fetch, а без получения удаленного репо. Я думаю, что Йорг интерпретировал это в первую очередь, и это понятно. С таким же успехом вину можно было бы возложить на ОП - глупо отрицать этот ответ. - person iconoclast; 18.05.2016
comment
Это зависит от определения «актуально». Если OP просто интересуется, опережает ли его локальная ветвь удаленную или нет (т.е. есть ли у меня что-нибудь, что нужно отправить?), Он может это узнать без выборки. - person ealfonso; 07.05.2017
comment
Это не является логически невозможным, поскольку очевидно, что можно было бы позвонить кому-нибудь в своей серверной и сказать, какой хэш вашей HEAD в основной ветке они могли бы вам сказать, а затем вы могли бы проверить локально и увидеть, что у вас этого нет. хэш. Теперь вы знаете, что они не синхронизированы. - person James Robinson; 18.11.2017
comment
Может есть какая-то команда типа git status --check-remote. Если автор хочет проверить актуальность репо без запроса удаленного репо, то это логически невозможно. - person ramwin; 25.04.2019

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

тем не менее,

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

person adarsh    schedule 28.05.2020

git remote show origin


Enter passphrase for key ....ssh/id_rsa:
* remote origin
  Fetch URL: [email protected]:mamaque/systems.git
  Push  URL: [email protected]:mamaque/systems.git 

  HEAD branch: main
  Remote branch:
    main tracked
   Local ref configured for 'git push':

main pushes to main (up-to-date) Оба обновлены
main pushes to main (fast-forwardable) Удаленный можно обновить с помощью локального
main pushes to main (local out of date) Локальный можно обновить с помощью удаленного

person Jean-Marc    schedule 13.01.2021