В чем разница между git pull и git fetch?

В чем разница между git pull и git fetch?


person pupeno    schedule 15.11.2008    source источник
comment
Я нашел эту хорошо написанную статью о git fetch и git pull, которую стоит прочитать: longair.net/blog/2009/04/16/git-fetch-and-merge   -  person Marcos Oliveira    schedule 16.09.2010
comment
Наш альтернативный подход стал git fetch; git reset --hard origin/master частью нашего рабочего процесса. Он устраняет локальные изменения, держит вас в курсе последних событий, НО следит за тем, чтобы вы не добавляли новые изменения поверх текущих и не наводили беспорядок. Мы использовали его некоторое время, и на практике он кажется намного безопаснее. Просто не забудьте сначала добавить / зафиксировать / спрятать все незавершенные работы!   -  person Michael Durrant    schedule 04.05.2014
comment
Убедитесь, что вы знаете, как правильно использовать git stash. Если вы спрашиваете о «pull» и «fetch», то, возможно, нужно будет объяснить «stash» ...   -  person Henry Heleine    schedule 09.12.2014
comment
Многие люди из Mercurial продолжают использовать git pull, думая, что это эквивалент hg pull. А это не так. Эквивалент hg pull в Git - это git fetch.   -  person Serge Shultz    schedule 29.06.2015
comment
Команда git fetch извлекает обновленный код с веткой, а также получает новые добавленные ветки в вашем локальном, команда git pull извлекает только обновленный код текущей ветки   -  person Kartik Patel    schedule 27.07.2017
comment
@MichaelDurrant FWIW, это эквивалент git pull --ff-only, хотя я не помню, был ли он доступен в 2014 году.   -  person jpaugh    schedule 22.05.2018
comment
Отметим, что git fetch не имеет корреспондента в традиционных системах управления версиями (о которых я знаю). Основная цель использования git fetch (чтобы увидеть, что произошло удаленно) достигнута, например. в SVN с merge --dry-run. Это должно быть частью основного рабочего процесса, чтобы до того, как вы начнете, вы получите представление о том, какие изменения вы проводите, особенно те изменения, которые могут конфликтовать с вашими локальными изменениями.   -  person haelix    schedule 06.09.2018
comment
Очень хороший способ понять их - разобраться в различных refs магазинах git. Это поможет вам понять, как работает механизм изоляции между ними и почему fetch безопасно, а pull агрессивно. Подробнее см. здесь   -  person Honey    schedule 12.02.2019
comment
freecodecamp.org/news/git-fetch-vs-pull/.   -  person Shiwangini    schedule 11.07.2020
comment
просто подумайте об этом как о веб-странице, загрузите и обновите   -  person Ernie Sender    schedule 20.11.2020


Ответы (38)


Проще говоря, git pull выполняет git fetch, за которым следует git merge.

Вы можете сделать git fetch в любое время, чтобы обновить ветки удаленного отслеживания в refs/remotes/<remote>/. Эта операция никогда не изменяет ни одну из ваших собственных локальных веток в refs/heads, и ее можно безопасно выполнять без изменения вашей рабочей копии. Я даже слышал о людях, которые периодически запускают git fetch в фоновом режиме в задании cron (хотя я бы не рекомендовал это делать).

git pull - это то, что вы должны сделать, чтобы обновить локальную ветку до ее удаленной версии, а также обновить другие ветки удаленного отслеживания.

Из документации Git для git pull:

В режиме по умолчанию git pull является сокращением для git fetch, за которым следует git merge FETCH_HEAD.

person Greg Hewgill    schedule 15.11.2008
comment
Git pull - это то, что вы сделали бы, чтобы обновить свой репозиторий ‹- разве обновление репозитория еще не выполнено с помощью fetch? Разве вы не имеете в виду, что он обновляет ваши локальные ветки с удаленными ветвями? К слиянию: он объединяет удаленные ветки с вашими локальными копиями этих веток, или что именно здесь сливается? - person Albert; 10.11.2009
comment
@Albert: Да, это странно сформулировано. git pull всегда будет сливаться с текущей веткой. Итак, вы выбираете, какую ветку вы хотите вытащить из, и она втягивает его в текущую ветку. Ветвь from может быть локальной или удаленной; это может быть даже удаленная ветка, которая не является зарегистрированной git remote (это означает, что вы передаете URL-адрес в git pull командной строке). - person intuited; 06.06.2010
comment
Является ли git push также git fetch (в другом направлении), за которым следует слияние git? - person Ellen Spertus; 17.03.2011
comment
@espertus: Нет. При нажатии никогда не происходит слияния автоматически. Ожидается, что пользователь потянет, разрешив любые конфликты слияния локально, затем вернет на удаленный. - person Greg Hewgill; 17.03.2011
comment
Если я нахожусь в /home/alice/ и делаю git fetch /home/bob, какие параметры я должен передать последующим git merge? - person ripper234; 27.05.2011
comment
Почему бы вам конкретно не порекомендовать что-то вроде задачи cron, которая автоматически выполняет git выборку? На ум не приходят плохие побочные эффекты, и было бы неплохо обновить мои удаленные ветки, не задумываясь об этом. - person Bryan Henry; 27.10.2011
comment
@Sbrocket: я не люблю сюрпризов, особенно при работе с моей системой управления версиями. Смена веток из-под меня (даже удаленных веток) во время работы могла дезориентировать. - person Greg Hewgill; 27.10.2011
comment
Примечание для людей, изучающих Git: pull на самом деле нельзя эмулировать с помощью fetch плюс merge. Я только что получил изменение, при котором изменяется только указатель удаленной ветки, а merge отказывается что-либо делать. pull, с другой стороны, пересылает мою ветку отслеживания. - person Roman Starkov; 28.09.2012
comment
Представим, что у меня есть только master ветка. Какие ТОЧНЫЕ команды (со всеми необходимыми параметрами) должны заменить команду git pull? - person Paul; 25.01.2013
comment
@espertus - FYI, если вы используете Git Extensions, вы можете выполнить автоматическое вытягивание перед нажатием, если нажатие отклонено. - person Laksitha Ranasingha; 31.01.2013
comment
В качестве альтернативы вы можете обновить репозиторий git с помощью удаленного репо, выполнив git fetch, а затем git rebase origin/master - person abumusamq; 07.02.2013
comment
@romkyns Я не совсем понимаю, что вы имеете в виду. Не могли бы вы объяснить, что я только что получил изменение, когда изменяется только указатель удаленной ветки, а слияние отказывается что-либо делать. средства? - person viki.omega9; 26.05.2013
comment
@ dev-inside Или просто git pull --rebase - person Michael Mior; 27.05.2013
comment
git pull - это сокращение от git fetch, за которым следует git merge FETCH_HEAD. - person Nikita; 15.04.2014
comment
Эта операция никогда не изменяет ни одну из ваших собственных локальных веток в разделе refs / Head - что она тогда делает? Я все еще плохо понимаю. - person アレックス; 13.06.2014
comment
@AlexanderSupertramp: git fetch обновляет ветки удаленного отслеживания. Это ветки, перечисленные, начиная с remotes/ в git branch -a, и являются копиями ветвей в удаленном репозитории. - person Greg Hewgill; 13.06.2014
comment
@GregHewgill, как он их обновляет? Похоже, вы намекаете, что он что-то подталкивает к удаленным веткам. - person アレックス; 13.06.2014
comment
@AlexanderSupertramp: Я вообще этого не говорю. Ваши нормальные ветки находятся под refs/heads. Ветви удаленного отслеживания находятся под refs/remotes. Команда git fetch обновляет ветки удаленного отслеживания в refs/remotes и ничего не меняет в refs/heads. - person Greg Hewgill; 13.06.2014
comment
Локально я храню только локальные ветки и редактирую только их, верно? Что вы подразумеваете под обновлением удаленных веток? - person アレックス; 13.06.2014
comment
@AlexanderSupertramp: Задайте новый вопрос, если у вас возникли проблемы с пониманием терминологии Git. Раздел комментариев - не самое подходящее место для этого обсуждения. Спасибо. - person Greg Hewgill; 13.06.2014
comment
Ключевое различие здесь - refs / remote и refs / Head. Heads относится к вашей локальной рабочей ветке, тогда как remote относится к ветке, указывающей на удаленный, с информацией с момента вашего последнего git fetch origin. - person JohnMerlino; 28.06.2014
comment
@romkyns pull на самом деле не может быть эмулирован fetch плюс merge На самом деле, да, может. Я делаю это все время. - person Ajedi32; 20.08.2014
comment
@ Ajedi32 кое-что из того, что делает pull, может быть имитировано этими двумя, да. Но не всю команду при всех возможных обстоятельствах. - person Roman Starkov; 22.08.2014
comment
@romkyns Верно. Возможно, я не понял обстоятельства, упомянутые в вашем комментарии, но перемотку вперед определенно можно сделать с git merge. - person Ajedi32; 23.08.2014
comment
одновременно обновляя другие ветки удаленного отслеживания. Что это означает? - person user2906759; 11.09.2014
comment
@ user2906759: Git отслеживает в вашем локальном репозитории состояние всех веток на удаленном компьютере. Подробную информацию об этом можно найти в ветках удаленного отслеживания Google. - person Greg Hewgill; 11.09.2014
comment
Что-то, с чем я играл. Я часто использую git fetch, чтобы получить изменения. Если вы затем выполните команду git pull, то окажется, что он снова подключается к сети. Вместо этого ПОСЛЕ выборки я запустил 'git merge @ {u}', который, как мне кажется, сливается в заголовке настроенной ветки отслеживания без повторного подключения к сети. Кажется быстрее. Предупреждение - я все еще экспериментирую! - person Damien Sawyer; 16.12.2014
comment
Это настоящая работа git pull? Или просто псевдоподобное поведение? Кто-нибудь смотрел на реализацию git pull как на действительно использующую git fetch и git merge под капотом? Или у git pull есть собственная внутренняя логика, которая в большинстве ситуаций выполняет аналогичные операции в отношении того, что делает выборка, за которой следует слияние, но, возможно, не во всех из них? - person Didier A.; 05.01.2015
comment
Вы упомянули задание cron для автоматического выполнения git fetch. Я думаю, что SourceTree имеет возможность периодически запускать git fetch, поскольку я, кажется, замечаю удаленные обновления в визуальном интерфейсе, хотя я не запускал никаких явных команд. - person Doctor Blue; 22.01.2015
comment
Теперь я понимаю, почему pull из master в текущую ветку не обновляет ветку, даже если в master слиты новые локальные коммиты. Это потому, что merge в pull объединяется с FETCH_HEAD и полностью игнорирует мои локальные master! Я бы хотел, чтобы это важное различие было лучше подчеркнуто во всех руководствах, в которых упоминается pull и утверждается, что это почти то же самое, что и fetch + merge. Почти действительно важно, если вы pull делаете и надеетесь сделать все-в-одном - выборка + слияние с удаленного И слияние с локального. Сюрприз - pull не сливается из локальной ветки! - person JustAMartin; 21.10.2015
comment
Означает ли обновление веток удаленного отслеживания, что все ветки в репозитории теперь доступны в вашем локальном репозитории? - person Jwan622; 25.03.2016
comment
@ Jwan622: Да, это правильно. git branch -a перечислит их все. - person Greg Hewgill; 26.03.2016
comment
Я видел такой же ответ в Quora :) Здесь: quora .com / Что-разница-между-git-pulland-git-fetch. - person Pragyaditya Das; 02.04.2016
comment
Если вы работаете с плохим подключением к Интернету, неплохо было бы запустить задание cron для git fetch. - person noɥʇʎԀʎzɐɹƆ; 11.10.2016
comment
Несколько расплывчатые объяснения, даже в документации git. Документы говорят, что git pull запускает git fetch с заданными параметрами и вызывает git merge, чтобы объединить полученные заголовки веток в текущую ветку. Похоже на кошмар, если ВСЕ извлеченные объединяются в текущую ветку. - person Josef.B; 15.12.2016
comment
Git fetch означает, что вы получаете новый репозиторий из git, созданный кем-то. Git pull означает, что вы получаете новый код из git или какого-то репозитория, который кто-то отправил. - person Chirag Prajapati; 20.11.2017
comment
git pull использовать для получения обновленного объединенного кода из репозитория. git fetch предназначен для получения веток в репозитории для обмена веткой на новую ветку. - person Hasib Kamal; 19.03.2018
comment
@GregHewgill Если fetch загружает только изменения из удаленной ветки и обновляет данные репозитория, но оставляет локальную ветку неизменной, какой смысл извлекать, если рабочий каталог не будет отображать / отражать изменения? Первоначально мой вопрос заключался в том, как я могу увидеть изменения, внесенные кем-то другим, а затем решить, хочу ли я объединить их в свой рабочий каталог (т.е. поэкспериментировать с изменениями других людей, чтобы убедиться, что это не нарушит мою работу), но я все еще запутался, как это сделать. Стоит ли просто потянуть и поэкспериментировать / исследовать, а если возникнут проблемы, сделать полный сброс? - person ; 09.06.2018
comment
@Joshua: После получения удаленные ветки становятся доступны с именами типа origin/master (вместо просто master, которое принадлежит вам). Вы можете просмотреть эти ветки локально, чтобы увидеть, что изменилось, перед фактическим слиянием. - person Greg Hewgill; 10.06.2018
comment
Текущее (см. Отметку даты и времени) расширение Visual Studio Code C / C ++ отправляет всплывающее уведомление с просьбой выполнять периодические команды git fetch. - person bscout11; 05.02.2020

  • Когда вы используете pull, Git пытается автоматически объединиться. Это контекстно-зависимо, поэтому Git объединит все извлеченные коммиты в ветку, над которой вы сейчас работаете. pull автоматически объединяет коммиты без предварительного просмотра. Если вы не будете тщательно управлять своими ветвями, вы можете часто сталкиваться с конфликтами.

  • Когда вы fetch, Git собирает все коммиты из целевой ветки, которых нет в вашей текущей ветке, и сохраняет их в вашем локальном репозитории. Однако он не объединяет их с вашей текущей веткой. Это особенно полезно, если вам нужно поддерживать репозиторий в актуальном состоянии, но вы работаете над чем-то, что может сломаться, если вы обновите свои файлы. Чтобы интегрировать коммиты в вашу текущую ветку, вы должны впоследствии использовать merge.

person Mouna Cheikhna    schedule 18.08.2011
comment
Согласен, отличный комментарий. Вот почему я ненавижу git pull. Когда когда-либо будет иметь смысл позволить инструменту редактирования вносить изменения в код за вас? И разве это не то, что происходит при слиянии двух файлов? Что, если эти два редактирования физически разделены в файле, но ЛОГИЧЕСКИ расходятся? - person Lee Dixon; 13.05.2013
comment
Я не уверен, правильно ли я это понимаю. Дайте мне знать, если я прав: допустим, у меня есть две ветки, основная и тестовая. test - это ветка, над которой я работаю, чтобы что-то поэкспериментировать. Если я сделаю git fetch, он обновит master с целевой веткой. Если я сделаю git pull, он попытается обновить тест с целевой веткой. Это правильно? Если нет, думаю, я не понимаю, что означает «локальный репозиторий» - я предположил, что это означает мой локальный мастер. - person elexhobby; 05.06.2013
comment
Коротко говоря, @elexhobby, git fetch обновляет только ваш .git/ каталог (также известный как локальный репозиторий) и ничего за пределами .git/ (также называемое рабочим деревом). Он не меняет ни ваши локальные ветки, ни master. Но это касается remotes/origin/master (см. git branch -avv). Если у вас больше пультов, попробуйте git remote update. Это git fetch для всех пультов в одной команде. - person Tino; 17.07.2013
comment
@Tino, ваш действительно самый важный момент. Люди могут не знать, что удаленные ветки на самом деле хранятся в виде хешей в .git/refs/remotes/origin/. - person Chris; 13.09.2013
comment
Как только я понял, что все идет «хотя», отслеживая ветки, я наконец действительно понял git. Без этого знания это просто «волшебство». - person Michael Durrant; 19.09.2013
comment
Когда вы выполняете выборку, Git собирает все коммиты из целевой ветки, которых нет в вашей текущей ветке, и сохраняет их в вашем локальном репозитории - как мне увидеть, что было принесено с пульта, и как мне объединить это в мои местные филиалы? - person アレックス; 13.06.2014
comment
@Tino Чего я до сих пор не понимаю ... в чем смысл? Зачем использовать выборку, если она обновляет только .git? Какова предполагаемая выгода и что мне делать после этого? - person BadHorsie; 23.03.2016
comment
@BadHorsie git fetch скачивает ревизии. - person Tino; 30.03.2016
comment
git pull --ff-only обычно то, что я хочу. Делает бессмысленные вещи автоматически, спрашивает, прежде чем усложнять историю. - person Nick T; 19.12.2017
comment
Я считаю этот ответ отличным. Для меня хорошая комбинация для достижения цели из git fetch - это набрать 'git status', и вы увидите что-то вроде: ничего не коммитить, рабочее дерево очищается, затем вы можете набрать 'git fetch', а затем набрать 'git status', и вы увидеть, что ваша ветка опережает удаленный репозиторий или что-то в этом роде. Если вы наберете git pull, вы объедините ветку, но с git fetch вы только осознаете свой локальный репозиторий, если вы впереди или позади с некоторыми коммитами. - person eduardo92; 12.06.2018
comment
git pull означает выборку удаленных веток и слияние моей текущей ветки с любыми случайными коммитами, сделанными в удаленных ветвях. В этом почти нет никакого смысла. git fetch, за которым следует gitk или git log --oneline --graph --decorate --date-order, а может быть, git rebase или git merge имеет гораздо больший смысл. - person Mikko Rantalainen; 25.10.2018
comment
Прошло много времени, но, чтобы ответить на вопрос @BadHorsie по-другому, полезно получить, даже если это не повлияет на вашу рабочую ветку, потому что вы можете захотеть выполнить сравнение с удаленной веткой, или вы можете выйти - линии - скажем, в самолете - и знайте, что вам понадобятся эти удаленные данные, когда вы не можете их получить. Я уверен, что причин еще больше, но я часто сталкиваюсь с этими двумя. - person Thagomizer; 24.09.2019

Важно противопоставить философию дизайна git философии более традиционного инструмента управления версиями, такого как SVN.

Subversion была разработана и построена по модели клиент / сервер. Существует единственный репозиторий, который является сервером, и несколько клиентов могут получать код с сервера, работать с ним, а затем передавать его обратно на сервер. Предполагается, что клиент всегда может связаться с сервером, когда ему нужно выполнить операцию.

Git был разработан для поддержки более распределенной модели без необходимости в центральном репозитории (хотя вы, безусловно, можете использовать его, если хотите). Также git был разработан таким образом, что клиенту и «серверу» не нужно быть в сети одновременно. Git был разработан таким образом, чтобы люди, перешедшие по ненадежной ссылке, могли обмениваться кодом даже по электронной почте. Можно работать полностью автономно и записать компакт-диск для обмена кодом через git.

Для поддержки этой модели git поддерживает локальный репозиторий с вашим кодом, а также дополнительный локальный репозиторий, который отражает состояние удаленного репозитория. Сохраняя копию удаленного репозитория локально, git может определить необходимые изменения, даже если удаленный репозиторий недоступен. Позже, когда вам нужно будет отправить изменения кому-то еще, git может передать их как набор изменений с момента времени, известного удаленному репозиторию.

  • git fetch - это команда, которая говорит: «Обновите мою локальную копию удаленного репозитория».

  • git pull говорит: «перенесите изменения в удаленном репозитории туда, где я храню свой собственный код».

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

Важно помнить, что часто на вашей рабочей станции находится не менее трех копий проекта. Одна копия - это ваш собственный репозиторий с вашей собственной историей коммитов. Вторая копия - это ваша рабочая копия, которую вы редактируете и создаете. Третья копия - это ваша локальная «кэшированная» копия удаленного репозитория.

person MikeD    schedule 31.03.2013
comment
Технически локальный и удаленный репозитории действительно одно и то же. В Git репозиторий - это DAG коммитов, указывающих на их родителей. Технически ветки - это не что иное, как значимые имена коммитов. Единственная разница между локальными и удаленными ветвями заключается в том, что удаленные имеют префикс remoteName/ Git с нуля - очень хорошее чтение. Как только вы поймете, как работает Git - а это действительно красиво просто - все обретет смысл. - person Emil Lundberg; 14.08.2013
comment
Большое спасибо за объяснение. До сих пор я действительно не понимал, что Git был разработан так, что вам не нужно было иметь центральный репозиторий. Все всегда говорят о DVCS, описывая Git, но как для относительно нового программиста это ничего не значит для меня. Я никогда не видел CVCS, и я также никогда не работал с центральным удаленным репозиторием при сотрудничестве с другими (например, Github), поэтому до сих пор я еще не понял, что сделало Git особенным. . - person Brian Peterson; 15.08.2013
comment
Итак, исходя из этого, почему это НЕ хорошая идея использовать git-fetch с заданием cron? Всегда хранить копию пульта ДУ, с которым вы работаете, на своем локальном компьютере кажется хорошей идеей. На самом деле, мне хочется написать сценарий, который проверяет, обновлял ли я свой пульт за последние 24 часа, и связать его с крючком udev для подключения к Интернету. - person Brian Peterson; 15.08.2013
comment
Глупый вопрос - эти три копии поддерживаются Git, а я их никогда не видел? или я скачал одну копию и создал две ветки? - person Nabheet; 14.09.2013
comment
@Nabheet: я считаю, что дополнительные копии хранятся не как обычные файлы в вашей файловой системе, а как альтернативные истории (наборы изменений) внутри ваших файлов репозитория git. - person Keen; 17.09.2013
comment
Одна из причин, по которой НЕОБХОДИМО иметь задание cron: часто, когда я работаю над новым заявлением или над обновлениями ветки, мне нравится видеть, как вносятся изменения. Если изменения не появятся во время выборки, я буду более уверенно спрашивать своего товарища-программиста: «Эй, ты нажал?». Я также чувствую, сколько «оттока» в репозитории с тех пор, как я последний раз загрузил. Это также помогает мне понять количество и скорость изменений, которые в настоящее время вносятся в этот репозиторий. - person Michael Durrant; 23.07.2014
comment
@Nabheet Дело в том, что Git ориентирован на контент. Он хранит данные только один раз и указывает на них несколько раз. Вот почему в Git даже несколько коммитов поверх оригинала не сильно влияют на размер репо, поскольку большинство объектов одинаковы. - person cst1992; 05.11.2016
comment
это наиболее проясняющий ответ. Я хотел бы, чтобы это было просто, но я бы просто добавил в скобки некоторые технические имена, такие как Head, index и рабочее дерево / каталог, вместе с простыми объяснениями / аналогиями (например, где я храню свой собственный код) - person Luis Martins; 24.02.2018
comment
У меня там небольшая опечатка. Итак, git pull сначала обновляет мою локальную копию удаленного репозитория точно так же, как git fetch, а затем объединяет эти изменения в мой локальный репозиторий, где у меня есть собственный код. Представьте, что я сделал несколько локальных коммитов, а кто-то другой сделал коммиты и отправил их в удаленный репозиторий. Сначала я ничего не знаю о коммитах, которые совершил другой человек. Когда я выполняю git fetch, я получаю копию работы другого человека, хранящуюся локально. Теперь я могу сравнить его со своим. Когда я выполняю git pull, я могу объединить их изменения с моими изменениями в моем локальном рабочем пространстве. - person MikeD; 14.03.2018
comment
@MikeD ›› Git был разработан для поддержки более распределенной модели без необходимости в центральном репозитории. Читайте - чтобы поддержать людей, которые все еще совершают часто во время длительных перелетов (во время которых нет интернета). - person haelix; 06.09.2018
comment
Этот ответ следует объединить со следующим ответом Contango, содержащим изображение отношений. Затем, добавленный к верхнему ответу Грегом Хьюджиллом, он дает самое краткое и ясное объяснение последствий pull vs fetch. Хотя, к счастью, пока что порядок ответов таков. - person GG2; 01.10.2018

Вот изображение Оливера Стила, как все это сочетается друг с другом:

введите описание изображения здесь

Если есть достаточный интерес, я могу обновить изображение, добавив git clone и _2 _...

person Contango    schedule 09.06.2015
comment
Обновленное изображение с git clone и git merge было бы очень полезно! - person MEMark; 08.09.2015
comment
Да, добавьте git merge - он должен четко показать, что merge, вызываемый отдельно, НЕ то же самое, что вызов pull, потому что pull объединяется только с удаленного компьютера и игнорирует ваши локальные коммиты в вашей локальной ветке, которая отслеживает извлекаемую удаленную ветку. - person JustAMartin; 21.10.2015
comment
Одна картинка стоит тысячи слов! Готово ли где-нибудь обновленное изображение с потоком данных клонирования и слияния? Любой другой поток данных, кроме того, что уже на диаграмме? - person shikhanshu; 25.11.2015
comment
@Contango, пожалуйста, добавьте клон и слияние. Было бы полезно для новичков вроде меня. - person rents; 15.01.2016
comment
Есть две диаграммы, показывающие клонирование и слияние в других ответах (ниже) th3sly и thedarkpassenger. - person intotecho; 12.08.2016
comment
Перебазирование происходит из удаленного репозитория? Я думаю, что rebase - это операция над локальным репозиторием: git-scm.com/docs/git- перебазировать - person Edward Ross; 26.09.2016
comment
Rebase работает в вашем локальном репозитории. Заблуждение состоит в том, что наиболее распространенный вариант использования - это перебазирование вашей работы поверх чего-то, что поступило из удаленного репозитория. - person MikeD; 20.06.2017
comment
Это "тянуть или перебазировать" неверно. Потому что, когда вы вытягиваете, вы фактически выполняете выборку, а затем слияние. При извлечении вы получаете новые изменения из удаленной ветки в локальную, но, что важно, они еще не добавлены в ваши файлы. Как будто изменения где-то припаркованы. Изменения будут добавлены к вашим файлам, если вы их объедините. Затем ваши изменения «расплавляются» в ваших файлах и фиксируются. - person AndaluZ; 13.09.2017
comment
Согласитесь с @EdwardRoss, @MikeD и @AndaluZ: Rebase - это локальное репо для операции рабочей копии. IMEHO, я бы изменил это так, чтобы Pull был удаленным репо как для локального репо, так и для рабочей копии; Fetch - это удаленное репо для локального репо, а Merge и Rebase - это локальное репо для рабочей копии. Отчасти путаница возникает из-за того, что git rebase похож на git checkout, это одна команда, которая имеет несколько разных эффектов. например git checkout может иметь эффект либо svn switch, либо svn revert (и других) в зависимости от того, как он используется. - person dgnuff; 27.03.2018
comment
Все еще жду обновленное изображение спустя 4 года :) - person JOATMON; 10.10.2019

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

git fetch
git diff ...origin

См. https://git-scm.com/docs/git-diff относительно двойного - и синтаксис с тремя точками в команде diff

person mepster    schedule 07.05.2010
comment
почему не git diff ..origin? - person Erik Kaplun; 13.02.2012
comment
git diff origin и git diff ..origin, похоже, работают, но не этот странный ... материал - person Marc; 08.01.2013
comment
@Compustretch Пробела быть не должно. git diff ...origin эквивалентно git diff $(git-merge-base HEAD origin) origin (см. Раздел git diff [--options] <commit>...<commit> [--] [<path>…] в kernel.org/pub/software/scm/git/docs/git-diff.html#_description), который отличается от git diff origin; git diff ...origin концептуально представляет собой изменения, сделанные в origin, поскольку текущая ветвь разветвилась от origin, в то время как git diff origin включает также обратные изменения, внесенные в текущую ветвь, поскольку она разветвилась от origin. - person Max Nanasy; 01.08.2013
comment
ни одна из команд .. не сработала у меня (в Windows), но git diff origin/master работает, как указано ниже - person Brian Burns; 20.02.2014
comment
то же самое здесь, используя git 2.0.0 на OSX. Ни одна из этих команд не сработала. Они устарели? - person K.-Michael Aye; 26.06.2014

Мне немного пришлось понять, в чем разница, но это простое объяснение. master на вашем локальном хосте - это ветка.

Когда вы клонируете репозиторий, вы загружаете весь репозиторий на локальный хост. Это означает, что в это время у вас есть указатель origin / master на HEAD и master, указывающий на тот же HEAD.

когда вы начинаете работать и делаете коммиты, вы перемещаете главный указатель на HEAD + ваши коммиты. Но указатель origin / master все еще указывает на то, что было при клонировании.

Так что разница будет:

  • Если вы выполните git fetch, он просто получит все изменения в удаленном репозитории (GitHub) и переместит исходный / главный указатель на HEAD. Тем временем мастер вашего местного филиала будет продолжать указывать, где он находится.
  • Если вы выполните git pull, он в основном выполнит выборку (как объяснялось ранее), объединит любые новые изменения в вашу главную ветку и переместит указатель на HEAD.
person Gerardo    schedule 11.05.2012
comment
origin / master - это локальная ветвь, которая является КОПИЕЙ мастера в источнике. При загрузке вы обновляете local: / origin / master. Как только вы действительно поймете, что все в git является ветвью, это имеет большой смысл и является очень мощным способом поддержки различных наборов изменений, быстрого создания локальных ветвей, слияния и перебазирования и, как правило, получения большой выгоды от дешевого ветвления. модель. - person cam8001; 28.05.2013
comment
Все еще сбивает с толку. Я думал, что git fetch должен буквально загружать изменения из удаленного репо в ваше локальное репо, но НЕ фиксировать их - т.е. они все равно должны быть добавлены / зафиксированы в вашем локальном репо. - person krb686; 26.02.2015
comment
fetch извлекает только из удаленного / источника (github) в ваш локальный источник. Но он не объединяет его с вашими фактическими рабочими файлами. если вы сделаете вытягивание, он будет извлечен и объединен с вашими текущими рабочими файлами - person Gerardo; 26.02.2015
comment
что, если вас не устраивают изменения после git fetch? что делать дальше? - person Ahmad; 29.12.2020
comment
@Ahmad git fetch извлекает данные из удаленного репозитория. Если вас не устраивают некоторые коммиты, выдвинутые другими соавторами, сделайте fetch это. Merge it. Отменить коммиты и push вернуться в удаленный репозиторий - person Jdeep; 05.04.2021

Вкратце

git fetch похож на pull, но не объединяется. т.е. он получает удаленные обновления (refs и objects), но ваш локальный остается неизменным (т.е. origin/master обновляется, но master остается прежним).

git pull срывается с пульта и мгновенно сливается.

Еще

git clone клонирует репо.

git rebase сохраняет данные из вашей текущей ветки, не входящие в ветку восходящего потока, во временную область. Ваша ветка теперь такая же, как и до того, как вы начали вносить изменения. Итак, git pull -rebase будет извлекать удаленные изменения, перематывать вашу локальную ветвь, воспроизводить ваши изменения поверх текущей ветки один за другим, пока вы не будете обновлены.

Кроме того, git branch -a точно покажет вам, что происходит со всеми вашими филиалами - локальными и удаленными.

Эта запись в блоге была полезной:

Разница между git pull, git fetch и git clone (и git rebase) - Майк Пирс

и охватывает git pull, git fetch, git clone и git rebase.

ОБНОВИТЬ

Я подумал, что обновлю это, чтобы показать, как вы на самом деле используете это на практике.

  1. Обновите локальное репо с пульта дистанционного управления (но не объединяйте):

     git fetch 
    
  2. Скачав обновления, посмотрим на отличия:

     git diff master origin/master 
    
  3. Если вас устраивают эти обновления, объедините:

     git pull
    

Примечания:

На шаге 2: Подробнее о различиях между локальными и удаленными устройствами см .: Как сравнить локальная ветка git с удаленной веткой?

На шаге 3: вероятно, более точно (например, при быстро меняющемся репо) сделать git rebase origin здесь. См. комментарий @Justin Ohms в другой ответ.

См. Также: http://longair.net/blog/2009/04/16/git-fetch-and-merge/

person Snowcrash    schedule 13.04.2013
comment
Мне кажется, что если кто-то просто хочет, чтобы местный код отражал подсказку, он должен использовать git clone. Я заключил подсказку в кавычки, так как предполагаю, что это будет означать, какой есть мастер и что кто-то скачает в виде zip-архива с github.com. - person Chris K; 12.09.2013
comment
что, если вас не устраивают изменения после git fetch? что делать дальше? - person Kugutsumen; 24.03.2015
comment
Ваш абзац о перебазировании был именно тем, что я искал. Вся идея обнуления всего, обновления с удаленного компьютера, а затем повторного воспроизведения ваших изменений поверх предыдущих коммитов, которые произошли во время вашей работы. Идеальное объяснение, если оно правильное. ;) - person coblr; 03.03.2016

Иногда помогает визуальное представление.

введите описание изображения здесь

person thedarkpassenger    schedule 25.01.2016
comment
Думаю, картина должна показать, что это влияет и на локальное репо. То есть Git pull - это комбинация воздействия на локальное репо и рабочую копию. Прямо сейчас кажется, что это влияет только на рабочую копию. - person nonopolarity; 14.02.2016
comment
@ 太極 者 無極 而 生 Согласен - это изображение вводит в заблуждение, потому что создается впечатление, что git pull пропускает выборку, что, конечно, неточно. - person forresthopkinsa; 20.08.2016
comment
в чем разница между «локальным репозиторием» и «рабочей копией»? Разве они не оба локальны на компьютере? - person theITvideos; 16.11.2017
comment
В чем тогда смысл git fetch? как узнать какая разница между локальным репозиторием и рабочей копией? - person Vikash; 13.03.2019
comment
@theITvideos Нет, это не так. Локальный репозиторий - это место, куда отправляется ваш код (из рабочего репозитория) при фиксации. (Когда вы нажимаете, он переходит в удаленное репо). - person Vikash; 13.03.2019
comment
у этого поста много положительных отзывов, но картина вводит в заблуждение. Pull пропускает локальное репо, что неверно. codeahoy.com/img/git-pull-vs-fetch.png - person goblinjuice; 02.02.2020

git-pull - Fetch from and merge with another repository or a local branch
SYNOPSIS

git pull   …
DESCRIPTION

Runs git-fetch with the given parameters, and calls git-merge to merge the 
retrieved head(s) into the current branch. With --rebase, calls git-rebase 
instead of git-merge.

Note that you can use . (current directory) as the <repository> to pull 
from the local repository — this is useful when merging local branches 
into the current branch.

Also note that options meant for git-pull itself and underlying git-merge 
must be given before the options meant for git-fetch.

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

person Vinko Vrsalovic    schedule 15.11.2008
comment
Очень интересно, но я не вижу случая, когда вам нужен только код. Что происходит с вашим кодом при загрузке? Это стерто? Что происходит с удаленными изменениями? Как он попадает в ваше репо без стирания кода, если вы не объединяетесь? - person e-satis; 27.03.2010
comment
@ e-satis: удаленная ветка также хранится локально на вашем компьютере. Поэтому, когда вы делаете git fetch, он извлекает изменения из репозитория и обновляет вашу локальную удаленную ветку. Это не влияет на вашу локальную ветвь, которая отслеживает локальную удаленную ветку, поэтому не влияет на вашу рабочую копию. Теперь, когда вы выполните merge, он объединит полученные изменения с вашей локальной веткой. - person jeffreyveon; 31.10.2011
comment
Простой вариант использования команды fetch: выполнение трудоемких операций с участием недавних коммитов других людей, таких как слияние или проверка кода, доступ только к вашему актуальному локальному репозиторию без требований к сетевому подключению, потому что вы ранее использовали fetch для загрузки все, что вам нужно быстро (например, когда вы посещаете другого разработчика и подключаетесь к сети другого репозитория). Команда pull будет загружать те же коммиты, но выполняемое ею слияние может быть нежелательным. - person Lorenzo Gatti; 19.09.2013

Вы можете получить данные из удаленного репозитория, увидеть различия, а затем извлечь или объединить.

Это пример удаленного репозитория с именем origin и ветки с именем master, отслеживающей удаленную ветку origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master
person Antonio Bardazzi    schedule 21.03.2011
comment
Вероятно, вы захотите пропустить извлечение и просто выполнить git rebase origin в качестве последнего шага, поскольку вы уже загрузили изменения. Причина в том, что кто-то мог внести изменения за время, прошедшее после того, как вы выполнили выборку, и они не были бы в выборке, по которой вы делали обзор различий. - person Justin Ohms; 01.09.2012

Короткий и простой ответ заключается в том, что git pull - это просто git fetch, за которым следует git merge.

Очень важно отметить, что git pull будет автоматически объединяться, нравится вам это или нет. Это, конечно, может привести к конфликтам слияния. Допустим, ваш пульт origin, а ваша ветка master. Если вы git diff origin/master перед загрузкой, вы должны иметь некоторое представление о потенциальных конфликтах слияния и соответствующим образом подготовить локальную ветвь.

Помимо вытягивания и выталкивания, некоторые рабочие процессы включают git rebase, например этот, который я перефразирую из связанной статьи:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

Если вы окажетесь в такой ситуации, у вас может возникнуть соблазн git pull --rebase. Если вы действительно, действительно знаете, что делаете, я бы посоветовал этого не делать. Это предупреждение со страницы man для git-pull, версия 2.3.5:

Это потенциально опасный режим работы. Он переписывает историю, что не сулит ничего хорошего, если вы уже опубликовали эту историю. Не используйте эту опцию, если вы внимательно не прочитали git-rebase (1).

person jfmercer    schedule 15.05.2011
comment
@JustinOhms Если git pull --rebase не подходит в данной ситуации, правильно ли, если это делается в два этапа? Если это правильно, то какая дополнительная польза от того, чтобы сделать это в два этапа? - person Kaz; 24.05.2013
comment
@Kaz - потому что перебазирование не автоматическое. Получение изменений в первую очередь позволяет вам принять решение. Это не решает проблему с измененной историей, которую вы уже отправили. Это позволит вам увидеть, безопасно ли перебазировать изменения, которые вы еще не отправили. - person Justin Ohms; 25.05.2013
comment
@JustinOhms Как бы вы решили, безопасно ли перебазировать изменения? Я бы просто попробовал git rebase и отступил бы, если бы это произвело беспорядок, и в этом случае я мог бы также сделать git pull --rebase. Но, может быть, у вас есть другой способ? - person Kaz; 25.05.2013
comment
@KaZ gitk позволяет визуально увидеть структуру веток. Он покажет вам положение вашей локальной головы, пультов дистанционного управления и структур ветвей по отношению к тому, что вы получили. Таким образом вы можете быть уверены, что не выполняете перенастройку извлеченных изменений, основанных на предке, предшествующем тому, что вы уже отправили на свои удаленные устройства. - person Justin Ohms; 28.05.2013
comment
Используйте rebase, когда вы работаете в локальной ветке, которая еще не отправлена. Если вы работаете с веткой, которая существует на удаленном компьютере, rebase может вызвать неприятные проблемы, поэтому вам следует предпочесть обычный merge. - person Justus Romijn; 01.12.2014
comment
git pull --rebase подходит, если вы работаете ровно с одним удаленным, поэтому ваши изменения либо только локальные (в этом случае их можно перебазировать), либо уже являются одним удаленным (в этом случае они не будут перемещены) . Время, когда git pull --rebase становится рискованным, - это когда вы работаете с несколькими пультами. - person plugwash; 19.01.2020

Хорошо, вот некоторая информация о git pull и git fetch, чтобы вы могли понять фактические различия ... несколькими простыми словами, fetch получает последние данные, но не код изменения и не собираетесь связываться с вашим текущим кодом локальной ветки, но потяните, получите изменения кода и объедините их в свою локальную ветвь, читайте дальше, чтобы получить более подробную информацию о каждом:

git fetch

Он загрузит все ссылки и объекты и любые новые ветки в ваш локальный репозиторий ...

Получение веток и / или тегов (в совокупности, ссылок) из одного или нескольких других репозиториев вместе с объектами, необходимыми для завершения их историй. Обновлены ветки удаленного отслеживания (способы управления этим поведением см. В описании ниже).

По умолчанию также выбирается любой тег, указывающий на извлекаемые истории; эффект заключается в получении тегов, указывающих на интересующие вас ветви. Это поведение по умолчанию можно изменить с помощью параметров --tags или --no-tags или путем настройки remote..tagOpt. Используя refspec, который явно выбирает теги, вы также можете получать теги, которые не указывают на интересующие вас ветви.

git fetch может выполнять выборку из одного именованного репозитория или URL-адреса или сразу из нескольких репозиториев, если он указан и есть пульт. запись в конфигурационном файле. (См. Git-config 1).

Если удаленный сервер не указан, по умолчанию будет использоваться исходный пульт, если только для текущей ветви не настроена восходящая ветвь.

Имена извлекаемых ссылок вместе с именами объектов, на которые они указывают, записываются в .git / FETCH_HEAD. Эта информация может использоваться скриптами или другими командами git, такими как git-pull.


мерзавец тянуть

Он применит изменения с удаленного к текущей ветке в локальном ...

Включает изменения из удаленного репозитория в текущую ветку. В режиме по умолчанию git pull является сокращением для git fetch, за которым следует git merge FETCH_HEAD.

Точнее, git pull запускает git fetch с заданными параметрами и вызывает git merge, чтобы объединить полученные заголовки веток в текущую ветку. С --rebase запускается git rebase вместо git merge.

должно быть именем удаленного репозитория, переданным в git-fetch 1. может назвать произвольную удаленную ссылку (например, имя тега) или даже коллекцию ссылок с соответствующими ветками удаленного отслеживания (например, refs / Heads / : refs / remotes / origin /) , но обычно это имя ветки в удаленном репозитории.

Значения по умолчанию для и считываются из удаленной конфигурации и конфигурации слияния для текущей ветки, как установлено git-branch --track.


Я также создаю изображение ниже, чтобы показать вам, как git fetch и git pull работают вместе ...

git pull и git fetch

person Alireza    schedule 21.06.2017
comment
Если вам нравится изображение, взгляните на шпаргалку по git, которая аналогична всем командам git ... ndpsoftware.com/git-cheatsheet.html - person Tom; 20.05.2018
comment
Разве клонирование не влияет на локальный репозиторий (копирование всей истории с удаленного)? - person Tom Loredo; 04.07.2018

введите описание изображения здесь

Это интерактивное графическое представление очень полезно для понимания git: http://ndpsoftware.com/git-cheatsheet.html

git fetch просто «загружает» изменения с пульта дистанционного управления в ваш локальный репозиторий. git pull загружает изменения и объединяет их в вашу текущую ветку. «В режиме по умолчанию git pull является сокращением для git fetch, за которым следует git merge FETCH_HEAD».

person th3sly    schedule 06.02.2015
comment
Люди, нажимайте на ссылку, чтобы взаимодействовать с различными столбцами. Эта шпаргалка - лучший ресурс, который я видел, чтобы полностью понять различия между каждой командой. - person M. Luisa Carrión; 04.10.2016
comment
Этот ответ должен быть наверху - person Trect; 26.10.2019
comment
Картинка стоит 1000 слов. Эта веб-страница - отличный ресурс для всех, кому нужно простое графическое описание различных рабочих процессов Git. Спасибо, что разместили эту ссылку. - person Jim Fischer; 30.08.2020

Бонус:

Говоря о pull & fetch в приведенных выше ответах, я хотел бы поделиться интересным трюком,

git pull --rebase

Эта команда выше - самая полезная команда в моей жизни с git, которая сэкономила много времени.

Прежде чем отправлять новые коммиты на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения сервера (с помощью fetch + merge) и поместит вашу фиксацию вверху в журнале git. Не нужно беспокоиться о ручном извлечении / слиянии.

Подробности можно найти на странице: http://gitolite.com/git-pull--rebase

person Sazzad Hissain Khan    schedule 23.12.2015
comment
Хороший совет, хотя стоит упомянуть новым пользователям git, что rebase изменяет хэши коммитов (я обнаружил, что это удивительно из-за subversion). - person AlexMA; 20.09.2016
comment
Вы можете объяснить, в чем разница между git pull и git pull --rebase? - person Shaiju T; 17.01.2018
comment
См. Строгое предупреждение об этом методе в ответе выше: stackoverflow.com/a/6011169/241244 - person ; 24.10.2018

Мне нравится иметь какое-то визуальное представление о ситуации, чтобы понять эти вещи. Возможно, другие разработчики тоже захотят это увидеть, так что вот мое дополнение. Я не совсем уверен, что все это правильно, поэтому, пожалуйста, прокомментируйте, если вы обнаружите какие-либо ошибки.

                                         LOCAL SYSTEM
                  . =====================================================    
================= . =================  ===================  =============
REMOTE REPOSITORY . REMOTE REPOSITORY  LOCAL REPOSITORY     WORKING COPY
(ORIGIN)          . (CACHED)           
for example,      . mirror of the      
a github repo.    . remote repo
Can also be       .
multiple repo's   .
                  .
                  .
FETCH  *------------------>*
Your local cache of the remote is updated with the origin (or multiple
external sources, that is git's distributed nature)
                  .
PULL   *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur, 
you are asked for decisions.
                  .
COMMIT            .                             *<---------------*
When coming from, for example, subversion, you might think that a commit
will update the origin. In git, a commit is only done to your local repo.
                  .
PUSH   *<---------------------------------------*
Synchronizes your changes back into the origin.

Некоторые основные преимущества получения зеркала пульта дистанционного управления:

  • Производительность (пролистайте все коммиты и сообщения, не пытаясь протолкнуть их по сети)
  • Отзыв о состоянии вашего локального репо (например, я использую Atlassian SourceTree, который покажет мне лампочку, указывающую, совершаю ли я вперед или назад по сравнению с источником. Эта информация может быть обновлена ​​с помощью GIT FETCH).
person Justus Romijn    schedule 19.02.2014
comment
Разве git pull не выполняет также слияние, то есть доходит до рабочей копии? - person Kamiel Wanrooij; 24.03.2014
comment
Хороший момент, да, он внесет все изменения в вашу рабочую копию, а затем вы сможете зафиксировать их самостоятельно в локальном репо. Я обновлю визуал. - person Justus Romijn; 25.03.2014
comment
@JustusRomijn Разве при вытягивании не обновляется локальный репозиторий? Разве между звездочкой исходной и рабочей копии не должно быть звездочки? - person user764754; 08.01.2015
comment
@ user764754 Когда вы вытягиваете, ваша рабочая копия получает изменения (также могут быть некоторые конфликты, которые вам может потребоваться разрешить). Вам все равно нужно зафиксировать его в локальном репозитории. - person Justus Romijn; 12.01.2015
comment
@JustusRomijn: Спасибо за иллюстрацию. Было бы здорово, если бы вы могли сделать диаграмму более полной, проиллюстрировав эффекты таких операций, как сброс, выбор вишни на состояниях репозитория. - person jith912; 17.01.2015
comment
@ jith912 Я думаю, что это будет немного выходить за рамки этой темы вопроса, но я мог бы создать такой и разместить его в блоге. Если я это сделаю, я добавлю ссылку сюда для справки. - person Justus Romijn; 19.01.2015
comment
@ jith912 в одном из ответов есть эта ссылка: ndpsoftware.com/git-cheatsheet.html - person Justus Romijn; 13.02.2015

Я тоже боролся с этим. Фактически, я попал сюда с поиском в Google точно такого же вопроса. Прочитав все эти ответы, я, наконец, нарисовал картину в моей голове, и я решил попытаться понять это, глядя на состояние 2 репозиториев и 1 песочницы и действия, выполняемые с течением времени, при просмотре их версии. Вот что я придумал. Пожалуйста, поправьте меня, если я где-то напортачил.

Три репозитория с выборкой:

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - fetch               -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     -                     -
- @ R01             -     - @ R01+              -     - @R01+               -
---------------------     -----------------------     -----------------------

Три репо с натяжкой

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - pull                -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     - merged with R02     -
- @ R01             -     - @ R01+              -     - @R02+               -
---------------------     -----------------------     -----------------------

Это помогло мне понять, почему выборка так важна.

person pn1 dude    schedule 17.07.2012
comment
Не так сложно читать: поля представляют собой статус репо, который в каждой строке изменяется во времени слева направо после операции, о которой сообщается в строке 2 поля. Ярлыки R0n - это теги в git, а тег со знаком + еще не заполнен. Sanbox используется для вашей рабочей папки, которая отличается от папки репо, где хранятся коммиты. - person user1708042; 30.08.2017

Разницу между GIT Fetch и GIT Pull можно объяснить следующим сценарием: (Помня о том, что изображения говорят громче, чем слова !, я предоставил графическое изображение )

Возьмем пример, когда вы работаете над проектом вместе с членами вашей команды. Таким образом, будет одна основная ветвь проекта, и все участники должны разветвить ее в свой локальный репозиторий, а затем поработать над этой локальной веткой, чтобы изменить / добавить модули, а затем вернуться в основную ветвь.

Итак, Начальное состояние двух ветвей, когда вы разветвляете основной проект в локальном репозитории, будет таким: (A, B и C - это уже завершенные модули проекта)

введите описание изображения здесь

Теперь вы начали работу над новым модулем (предположим, D), и когда вы завершили модуль D, вы хотите отправить его в основную ветку, но тем временем происходит то, что один из ваших товарищей по команде разработал новый модуль E, F и изменено C.
Итак, теперь произошло то, что в вашем локальном репозитории не хватает исходного прогресса проекта, и, таким образом, внесение ваших изменений в основную ветвь может привести к конфликту и может вызвать сбой в работе вашего модуля D.

введите описание изображения здесь

Чтобы избежать таких проблем и работать параллельно с исходным ходом проекта, есть два способа:

1. Git Fetch- Это загрузит все изменения, внесенные в проект исходной / основной ветки, которых нет в вашей локальной ветке. И будет ждать, пока команда Git Merge применит изменения, внесенные в ваш репозиторий или ветку.

введите описание изображения здесь

Итак, теперь вы можете внимательно следить за файлами, прежде чем объединять их в свой репозиторий. И вы также можете изменить D, если это необходимо, из-за Измененного C.

введите описание изображения здесь

2. Git Pull- Это обновит вашу локальную ветку с помощью исходной / основной ветки, то есть фактически то, что она делает, представляет собой комбинацию Git Fetch и Git слияния одного за другим. Но это может вызвать конфликты, поэтому рекомендуется использовать Git Pull с чистой копией.

введите описание изображения здесь

person Aman Tiwari    schedule 07.02.2017
comment
если бы вы могли изменить «Основную ветвь» на «Удаленное репо», это был бы отличный ответ. - person Fuevo; 04.06.2018

Мы просто говорим:

git pull == git fetch + git merge

Если вы запустите git pull, вам не нужно объединять данные с локальными. Если вы запустите git fetch, это означает, что вы должны запустить git merge, чтобы получить последний код на свой локальный компьютер. В противном случае локальный машинный код не будет изменен без слияния.

Итак, в Git Gui, когда вы выполняете выборку, вам нужно объединить данные. Сам Fetch не будет вносить изменения в код на вашем локальном компьютере. Вы можете проверить это при обновлении кода, выполнив выборку один раз и увидев; код не изменится. Затем вы объединяете ... Вы увидите измененный код.

person Selvamani    schedule 21.02.2013
comment
Лучше скажу git pull == git fetch + git merge :) - person melvynkim; 07.06.2013
comment
Но git pull --rebase = git fetch + git rebase - person Tino; 17.07.2013

git fetch переносит код с удаленного сервера в ваши ветви отслеживания в вашем локальном репозитории. Если ваш пульт называется origin (по умолчанию), то эти ветки будут в пределах origin/, например origin/master, origin/mybranch-123 и т. Д. Это не ваши текущие ветки, это локальные копии этих веток с сервера. .

git pull выполняет git fetch, но затем также объединяет код из ветви отслеживания с вашей текущей локальной версией этой ветви. Если вы еще не готовы к этим изменениям, сначала просто git fetch.

person Michael Durrant    schedule 19.09.2013

git fetch будет извлекать удаленные ветки, чтобы вы могли git diff или git merge их с текущей веткой. git pull запустит выборку на удаленной ветви, отслеживаемой текущей ветвью, а затем объединит результат. Вы можете использовать git fetch, чтобы узнать, есть ли какие-либо обновления в удаленной ветке, без необходимости их объединения с вашей локальной веткой.

person ntanase    schedule 26.11.2012

Проще говоря, если вы собирались сесть в самолет без подключения к Интернету ... перед вылетом вы могли бы просто сделать git fetch origin <branch>. Он загрузит все изменения на ваш компьютер, но сохранит его отдельно от вашей локальной разработки / рабочего пространства.

В самолете вы можете внести изменения в свое локальное рабочее пространство, а затем объединить его с тем, что вы получили ранее, а затем разрешить потенциальные конфликты слияния без подключения к Интернету. И если кто-то не внес новые изменения в удаленный репозиторий, тогда, когда вы прибудете в пункт назначения, вы должны сделать git push origin <branch> и пойти за кофе.


Из этого замечательного руководства по Atlassian:

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

Получение - это то, что вы делаете, когда хотите увидеть, над чем работают все остальные. Это похоже на обновление SVN в том, что оно позволяет вам видеть, как продвигалась центральная история, но не заставляет вас фактически объединять изменения в ваш репозиторий. Git изолирует загруженный контент от существующего локального контента, это абсолютно не влияет на вашу локальную разработку. Полученный контент необходимо явно проверить с помощью команды git checkout. Это делает выборку безопасным способом просмотра коммитов перед их интеграцией в локальный репозиторий.

При загрузке содержимого из удаленного репозитория для выполнения этой задачи доступны команды git pull и git fetch. Вы можете считать git fetch «безопасную» версию этих двух команд. Он загрузит удаленный контент, но не обновит рабочее состояние вашего локального репозитория, оставив вашу текущую работу нетронутой. git pull - более агрессивная альтернатива, она загрузит удаленный контент для активной локальной ветки и немедленно выполнит git merge, чтобы создать коммит слияния для нового удаленного контента. Если у вас есть незавершенные изменения, это вызовет конфликты и запустит процесс разрешения конфликтов слияния.


С git pull:

  • Вы не получаете изоляции.
  • Его не нужно явно проверять. Потому что он неявно делает git merge.
  • Шаг слияния повлияет на вашу локальную разработку и может вызвать конфликты
  • Это в основном НЕ безопасно. Это агрессивно.
  • В отличие от git fetch, где он влияет только на ваш .git/refs/remotes, git pull повлияет как на .git/refs/remotes , так и на .git/refs/heads/

Хммм ... итак, если я не обновляю рабочую копию с помощью git fetch, то где мне вносить изменения? Где Git fetch хранит новые коммиты?

Отличный вопрос. Прежде всего, heads или remotes не хранят новые коммиты. У них просто есть указатели. совершает. Итак, с git fetch вы загружаете последние объекты git (blob, tree, совершает. Чтобы полностью понять объекты, посмотрите это видео на внутреннем устройстве git), но только обновите ваш remotes указатель, указывающий на последнюю фиксацию этой ветки. Он по-прежнему изолирован от вашей рабочей копии, потому что указатель вашей ветки в каталоге heads не обновился. Он будет обновляться только после _22 _ / _ 23_. Но опять же где? Давайте разберемся.

В каталоге вашего проекта (т.е. там, где вы выполняете свои git команды) выполните:

  1. ls. Это покажет файлы и каталоги. Я знаю, ничего крутого.

  2. А теперь делай ls -a. Это покажет точечные файлы, т.е. файлы, начинающиеся с .. После этого вы увидите каталог с именем: .git.

  3. Сделайте cd .git. Очевидно, это изменит ваш каталог.

  4. Теперь самое интересное. делать ls. Вы увидите список каталогов. Ищем refs. Сделай cd refs.

  5. Интересно посмотреть, что находится внутри всех каталогов, но давайте остановимся на двух из них. heads и remotes. Также используйте cd, чтобы проверить их внутри.

  6. Любое git fetch, которое вы сделаете, обновит указатель в /.git/refs/remotes каталоге. Он не будет ничего обновлять в каталоге /.git/refs/heads.

  7. Любой git pull сначала выполнит git fetch, обновит элементы в каталоге /.git/refs/remotes, затем объединится с вашим локальным, а затем изменит заголовок внутри каталога /.git/refs/heads.


Очень хороший связанный ответ также можно найти в Где находится? git fetch '?.

Также обратите внимание на обозначение косой черты в соглашениях об именах веток Git пост. Это поможет вам лучше понять, как Git размещает вещи в разных каталогах.


Чтобы увидеть настоящую разницу

Просто делать:

git fetch origin master
git checkout master

Если удаленный мастер был обновлен, вы получите такое сообщение:

Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Если бы вы не fetch и просто сделали git checkout master, тогда ваш локальный git не узнает, что добавлены 2 коммита. И он просто сказал бы:

Already on 'master'
Your branch is up to date with 'origin/master'.

Но это устарело и неверно. Это потому, что git предоставит вам обратную связь исключительно на основе того, что он знает. Он не обращает внимания на новые коммиты, которые еще не сняты ...


Есть ли способ увидеть новые изменения, внесенные удаленно, при локальной работе в ветке?

Некоторые IDE (например, Xcode) очень умны и используют результат git fetch и могут аннотировать строки кода, которые были изменены в удаленной ветке вашей текущей рабочей ветки. Если эта строка была изменена как локальными изменениями, так и удаленной ветвью, она помечается красным цветом. Это не конфликт слияния. Это потенциальный конфликт слияния. Это заголовок, который вы можете использовать для разрешения будущего конфликта слияния, прежде чем выполнять git pull из удаленной ветки.

введите описание изображения здесь


Веселый совет:

Если вы выбрали удаленную ветку, например делал:

git fetch origin feature/123

Затем это войдет в ваш каталог пультов дистанционного управления. Он по-прежнему недоступен в вашем локальном каталоге. Однако это упрощает оформление заказа в эту удаленную ветку с помощью DWIM (делайте то, что я имею в виду):

git checkout feature/123

вам больше не нужно:

git checkout -b feature/123 origin/feature/123

Подробнее об этом читайте здесь.

person Honey    schedule 12.02.2019

Git Fetch

Вы загружаете изменения в локальную ветку из источника через выборку. Fetch запрашивает у удаленного репо все коммиты, которые сделали другие, но у вас нет в вашем локальном репо. Fetch загружает эти коммиты и добавляет их в локальный репозиторий.

Git Merge

Вы можете применить изменения, загруженные через выборку, с помощью команды слияния. Слияние примет коммиты, полученные из выборки, и попытается добавить их в вашу локальную ветку. Слияние сохранит историю фиксации ваших локальных изменений, поэтому, когда вы поделитесь своей веткой с помощью push, Git будет знать, как другие могут объединить ваши изменения.

Git Pull

Извлечение и слияние выполняются вместе достаточно часто, чтобы была создана команда, объединяющая их, pull. Pull выполняет выборку, а затем слияние, чтобы добавить загруженные коммиты в вашу локальную ветку.

person Pinkesh Sharma    schedule 13.07.2016

Единственная разница между git pull и git fetch заключается в том, что:

git pull извлекает из удаленной ветки и объединяет ее.

git fetch извлекается только из удаленной ветки, но не объединяется

то есть git pull = git fetch + git merge ...

person Rohitashv Singhal    schedule 04.06.2013
comment
И ничто не поможет, если git думает, что вы отстаете из-за коммитов и можете перемотать вперед, что после того, как я закончил rm -rf все это и начал все сначала. Глупый мерзавец, дай мне получить текущую информацию, чтобы я мог вернуться к работе? - person Chris K; 12.09.2013

Git позволяет применять более старые коммиты в хронологическом порядке после новых. Из-за этого процесс передачи коммитов между репозиториями разбивается на два этапа:

  1. Копирование новых коммитов из удаленной ветки в копию этой удаленной ветки внутри локального репо.

    (операция репо в операцию репо) master@remote >> remote/origin/master@local

  2. Интеграция новых коммитов в локальную ветку

    (операция внутреннего репо) remote/origin/master@local >> master@local

Есть два способа выполнить шаг 2. Вы можете:

  1. Разветвляйте локальную ветвь после последнего общего предка и добавляйте новые коммиты параллельно с коммитами, которые уникальны для локального репозитория, завершаются слиянием коммита, закрывая вилку.
  2. Вставьте новые коммиты после последнего общего предка и повторно примените коммиты, уникальные для локального репозитория.

В терминологии git шаг 1 - это git fetch, шаг 2 - это git merge или git rebase

git pull равно git fetch и git merge

person Pawel Furmaniak    schedule 28.11.2013

Git получает ветку последней версии с удаленного на локальный с помощью двух команд:

  1. git fetch: Git собирается получить последнюю версию с удаленного на локальный, но он не объединяется автоматически. git fetch origin master git log -p master..origin/master git merge origin/master

    Приведенные выше команды означают, что загружайте последнюю версию основной ветки из источника с удаленного в исходную главную ветвь. А затем сравнивает локальную главную ветку и исходную главную ветвь. Наконец, слияние.

  2. git pull: Git получит последнюю версию с удаленного компьютера и объединится с локальным.

        git pull origin master

    Приведенная выше команда эквивалентна git fetch и git merge. На практике git fetch может быть более безопасным, потому что перед слиянием мы можем увидеть изменения и решить, следует ли выполнять слияние.

person Marcus Thornton    schedule 12.08.2014

В чем разница между git pull и git fetch?

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

git fetch обновляет вашу локальную копию удаленного репозитория. Например, если ваш удаленный репозиторий - GitHub, вы можете получить любые изменения, сделанные в удаленном репозитории, в вашу локальную копию этого удаленного репозитория. Это позволит вам выполнять такие операции, как сравнение или слияние.

git pull, с другой стороны, перенесет изменения в удаленном репозитории туда, где вы храните свой собственный код. Обычно git pull сначала выполняет git fetch, чтобы обновить локальную копию удаленного репозитория, а затем объединяет изменения в ваш собственный репозиторий кода и, возможно, вашу рабочую копию.

person Donal    schedule 19.05.2015

git pull == (git fetch + git merge)

git fetch не изменяет локальные ветки.

Если у вас уже есть локальный репозиторий с удаленной настройкой для желаемого проекта, вы можете получить все ветки и теги для существующего удаленного с помощью git fetch. ... Fetch не вносит никаких изменений в локальные ветки, поэтому вам нужно будет объединить удаленную ветвь с парной локальной ветвью, чтобы включить новые изменения выборки. из github

person Iggy    schedule 19.09.2013

Попытка быть ясной и простой.

Команда git pull на самом деле является shortcut для git fetch, за которой следует команда git merge или git rebase в зависимости от на вашей конфигурации. Вы можете настроить свой репозиторий Git так, чтобы git pull выполнял выборку с последующей перебазированием.

person Montells    schedule 29.07.2015

Простое графическое представление для начинающих,

введите описание изображения здесь

здесь,

git pull  

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

но в ,

git fetch

будет извлекать код из репозитория, и нам нужно вручную перебазировать его, используя git rebase

например: я собираюсь получить от мастера сервера и переустановить его на моем локальном мастере.

1) git pull (перебазирование будет выполнено автоматически):

git pull origin master

здесь origin - это ваше удаленное репо, master - это ваша ветка

2) git fetch (необходимо перебазировать вручную):

git fetch origin master

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

git rebase origin/master

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

person Mohideen bin Mohammed    schedule 12.07.2017
comment
Хороший график, но вы можете объяснить, почему вы используете перебазирование, когда на графике указано слияние. - person Guntram Blohm; 10.10.2018
comment
merge представит фиксацию другой ветки и создаст новую фиксацию, которая содержит коммиты в качестве ссылки. но rebase будет реплицировать коммиты из другой ветки, он не будет создавать новую фиксацию, а не реплицировать - person Mohideen bin Mohammed; 10.10.2018

Фактически Git поддерживает копию вашего собственного кода и удаленный репозиторий.

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

Команда git pull переносит изменения из удаленного репозитория туда, где вы храните свой собственный код. Обычно git pull делает это, сначала выполняя «git fetch», чтобы обновить локальную копию удаленного репозитория, а затем объединяет изменения в ваш собственный репозиторий кода и, возможно, вашу рабочую копию.

person Pokemon    schedule 13.09.2015

git pull

Он выполняет две функции с помощью одной команды.

Он извлекает все изменения, внесенные в удаленную ветку, а затем объединяет эти изменения в вашу локальную ветку. Вы также можете изменить поведение pull, передав --rebase. Разницу между слиянием и перебазированием можно прочитать здесь

git fetch

Git fetch выполняет только половину работы git pull. Он просто переносит удаленные изменения в ваше локальное репо, но не применяет их к вашим веткам. Вы должны явно применить эти изменения. Это можно сделать следующим образом:

git fetch
git rebase origin/master
person Animesh Sharma    schedule 12.07.2015

Следует помнить о природе git. У вас есть пульты и локальные ветки (не обязательно одинаковые). По сравнению с другими системами управления версиями это может немного озадачить.

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

git fetch будет работать с удаленной веткой и обновлять вашу информацию.

На самом деле это так, если другие SWE работают в одной и той же ветке, и редко бывает в небольших сценариях «один разработчик - одна ветвь - один проект».

Ваша работа в местном филиале по-прежнему не нарушена. Чтобы внести изменения в вашу локальную ветку, вам необходимо объединить / переустановить изменения из удаленной ветки.

git pull выполняет именно эти два шага (т.е. --rebase для перебазирования вместо слияния)

Если ваша локальная история и удаленная история конфликтуют, вы будете вынуждены выполнить слияние во время git push, чтобы опубликовать свои изменения.

Таким образом, это действительно зависит от характера вашей рабочей среды и опыта, что использовать.

person g24l    schedule 25.09.2015

Все ветки хранятся в .git/refs

Все локальные филиалы хранятся в .git/refs/heads

Все удаленные ветки хранятся в .git/refs/remotes

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

Итак, когда вы делаете git fetch, все файлы, коммиты и ссылки загружаются в

этот каталог .git/refs/remotes

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

Кроме того, вы можете объединить их, если хотите.

git pull просто загружает эти изменения и объединяет их с текущей веткой.

Пример

Если вы хотите увидеть работу удаленной ветки dev/jd/feature/auth, вам просто нужно сделать

git fetch origin dev/jd/feature/auth

чтобы увидеть изменения или прогресс в работе,

git checkout dev/jd/feature/auth

Но, если вы также хотите получить и объединить их в текущей ветке, сделайте

git pull origin dev/jd/feature/auth

Если вы сделаете git fetch origin branch_name, он получит ветку, теперь вы можете переключиться на эту ветку, которую хотите, и увидеть изменения. Ваш местный мастер или другие местные филиалы не пострадают. Но git pull origin branch_name получит ветку и также объединится с текущей веткой.

person Sujeet Agrahari    schedule 07.11.2019

Простое объяснение:

git fetch

извлекает метаданные. Если вы хотите проверить недавно созданную ветку, вы можете выполнить выборку перед оформлением.

git pull

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

person Akash Yellappa    schedule 13.05.2020
comment
Если вы решите ответить на старый вопрос, на который есть хорошо обоснованные и правильные ответы, добавление нового ответа в конце дня может не принести вам никакого кредита. Если у вас есть какая-то особенная новая информация или вы убеждены, что все остальные ответы неверны, обязательно добавьте новый ответ, но «еще один ответ», дающий ту же основную информацию через долгое время после того, как вопрос был задан, обычно выигрывал » Я не заслуживаю большого уважения. - person Jonathan Leffler; 19.05.2020
comment
Я думаю, что это один из лучших ответов, хотя это больше, чем просто метаданные. Я бы сказал, что git fetch изменяет только файлы в скрытой папке .git, включая метаданные и копии всех удаленных веток, тогда как git pull также изменяет файлы в вашей текущей локальной ветке. Если бы кто-то объяснил это так несколько лет назад, мой переход с svn на git был бы намного быстрее! Все эти другие ответы содержат смехотворное количество изложения, которое не особенно полезно ИМО. - person WiringHarness; 13.04.2021
comment
Рад, что ты так себя чувствуешь - person Akash Yellappa; 14.04.2021

Git Fetch

Помогает узнавать о последних обновлениях от git repository. Допустим, вы работаете в команде, использующей GitFlow, где команда работает над несколькими branches (функциями). С git fetch --all command вы можете узнавать обо всех новых branches в repository.

В основном git fetch используется с git reset. Например, вы хотите вернуть все локальные изменения в текущее состояние репозитория.

git fetch --all // get known about latest updates
git reset --hard origin/[branch] // revert to current branch state

Git pull

Эта команда обновляет ваш branch текущим состоянием repository branch. Продолжим GitFlow. Множественная функция branches находилась в ветке с merged по develop, и когда вы хотите разработать новые функции для проекта, вы должны перейти к разработке branch и выполнить git pull, чтобы получить текущее состояние develop branch

Документация для GitFlow https://gist.github.com/peterdeweese/4251497

person Andrei Todorut    schedule 22.12.2017

Этот рисунок может помочь. git pull по сути эквивалентно git fetch, затем git merge

Этот рисунок может помочь. Git pull по сути эквивалентен git fetch, затем git merge

person Piaget Hadzizi    schedule 19.11.2020
comment
git merge влияет не только на вашу рабочую копию ... - person masterxilo; 15.12.2020

Репозиторий git содержит неизменяемые блоки данных и несколько изменяемых указателей / ссылок / имен (мы называем их ветвями, HEADS) для удобства использования (теоретически git может быть хранилищем только для добавления, доступ к которому осуществляется только хешами коммитов).

Неизменяемые капли обычно всегда в конечном итоге распределяются между всеми участниками. У каждого разработчика есть копия всего этого на своей машине.

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

Он не изменяет ваши изменяемые файлы и не создает никаких капель, которые ранее где-то не существовали.

git pull - это git fetch, затем git merge. git merge создает новые капли, которых никогда раньше не было в удаленном репозитории, и обновляет ваши изменяемые файлы (ваши ссылки).

person masterxilo    schedule 15.12.2020

git fetch origin

git fetch действительно только загружает новые данные из удаленного репозитория, но он не интегрирует эти новые данные в ваши рабочие файлы. Fetch отлично подходит для свежего взгляда на все, что произошло в удаленном репозитории. Благодаря его безвредному характеру, вы можете быть уверены: fetch никогда не будет манипулировать, разрушать или испортить что-либо. Это означает, что вы никогда не сможете получать достаточно часто.

git pull origin master

git pull, напротив, используется с другой целью: обновить текущую ветку HEAD последними изменениями с удаленного сервера. Это означает, что pull не только загружает новые данные; он также напрямую интегрирует его в ваши текущие файлы рабочих копий. Это имеет несколько последствий:

нам нужно использовать git merge, а затем git pull

person raghu    schedule 01.06.2021
comment
Добро пожаловать в Stack Overflow. Если вы решите ответить на старый вопрос, на который есть хорошо обоснованные и правильные ответы, добавление нового ответа в конце дня может не принести вам никакого кредита. Если у вас есть какая-то особенная новая информация или вы убеждены, что все остальные ответы неверны, обязательно добавьте новый ответ, но «еще один ответ», дающий ту же основную информацию через долгое время после того, как вопрос был задан, обычно выигрывал » Я не заслуживаю большого уважения. - person Jonathan Leffler; 08.06.2021