Питання Яка різниця між "git pull" та "git fetch"?


Примітка модератора: Враховуючи, що це питання вже було шістдесят чотири відповіді розміщувати на ньому, вважають, чи є ви чи ні що робить щось нове перед публікацією ще одного.

Яка різниця між ними git pull і git fetch?


10149
2017-11-15 09:51


походження


Я знайшов цю добре написану статтю про прозвучатку та прокрутку курсору, яку варто прочитати: longair.net/blog/2009/04/16/git-fetch-and-merge - Marcos Oliveira
Наш альтернативний підхід став git fetch; git reset --hard origin/master як частина нашого робочого процесу. Він знімає локальні зміни, тримає вас у курсі майстра, але переконається, що ви не просто висвітлюєте нові зміни на поточних змінах та створюєте безлад. Ми використовували його на деякий час, і це практично відчуває себе набагато безпечніше. Не забудьте додати / приєднати / приховувати будь-яку незавершену роботу! - Michael Durrant
Переконайтеся, що ви знаєте, як правильно використовувати git stash. Якщо ви запитуєте про "тягнути" та "витягнути", то, можливо, "прив'язка" також потребує пояснення ... - Henry Heleine
Багато людей, що приїжджають з Mercurial, продовжують використовувати "git pull", думаючи, що це еквівалент для "hg pull". Що це не так? Еквівалент Git "hg pull" - це "git get". - Serge Shultz
команда git fetch, яка отримує оновлений код з гілкою, а також отримає нові додані гілки у вашій локальній команді git pull, отримає тільки оновлений код поточної гілки - Kartik Patel


Відповіді:


Найпростішими словами git pull робить a git fetch потім а git merge.

Ви можете зробити це git fetch в будь-який час оновити відділення відстеження в розділі refs/remotes/<remote>/.

Ця операція ніколи не змінює жодних ваших місцевих гілок refs/heads, і безпечно робити, не змінюючи вашу робочу копію. Я навіть чув про людей, що бігають git fetch періодично в роботі cron у фоновому режимі (хоча я б не рекомендував це робити).

А. git pull це те, що ви зробите, щоб забезпечити сучасну локальну гілку з її віддаленою версією, а також оновлювати інші гілки віддаленого відстеження.

Git документація: гіт тягнути


8470
2017-11-15 09:52



"А" git pull "- це те, що ви зробите, щоб забезпечити оновлення вашого сховища" <- не оновлення репозиторію, вже виконане при отриманні? Ви не маєте на увазі, що ваші місцеві осередки оновлюються у віддалених філіях? До злиття: це об'єднує віддалені галузі з вашими локальними копіями цих філій, або що саме тут зливається? - Albert
@ Аllbert: Так, це дивно сформульовано. git pull завжди буде зливатися в поточна гілка. Таким чином, ви вибираєте, яку гілку ви хочете витягнути від, і він тягне його до поточної гілки. The від гілка може бути локальною або віддаленою; це навіть може бути віддаленою галуззю, яка не зареєстрована git remote (тобто ви передаєте URL-адресу в git pull командний рядок). - intuited
@espertus: Ні. Натискання ніколи автоматично не з'єднує. Очікується, що користувач витягне, вирішуючи будь-які конфлікти об'єднання локально, потім поверніться на пульт дистанційного керування. - Greg Hewgill
Якщо я на /home/alice/ і зроби git fetch /home/bob, які параметри я повинен перейти до наступного git merge ? - ripper234
Примітка для людей, що вивчають Git: pull насправді не може бути наслідувати a fetch плюс а merge. Я просто знайшов зміну, де змінюється лише вказівник віддаленої гілки, і merge відмовляється робити що-небудь pull, з іншого боку, швидко переміщує мою гілку відстеження. - Roman Starkov


  • Коли ви використовуєте pull, Гіт намагається автоматично зробити вашу роботу для вас. Це контекстно-чутливий, тому Git об'єднає будь-які потягнуті зобов'язання в галузь, в якій ви зараз працюєте. pull  автоматично об'єднує копії, не дозволяючи спочатку переглянути їх. Якщо ви не керуєте своїми філіями, ви можете зіткнутися з частими конфліктами.

  • Коли ти fetch, Gіt збирає будь-які зобов'язання з цільової гілки, які не існують у вашій поточній гілці та зберігає їх у своєму локальному сховищі. Однак це не з'єднує їх з вашою поточною гілкою. Це особливо корисно, якщо вам потрібно оновлювати своє сховище, але працювати над тим, що може вийти з ладу при оновленні файлів. Для інтеграції команд у вашу головну гілку ви використовуєте merge.


1850
2017-08-18 08:53



Згоден, чудовий коментар. Ось чому я ненавиджу шумити. Коли б колись було б сенс, щоб інструмент перегляду зробив для вас коди? І хіба не те, що з'єднує два файли? Що робити, якщо ці два редагування фізично розділені у файлі, але LOGICALLY у розбіжності? - Lee Dixon
@elexhobby short put, git fetch лише оновлює ваш .git/ каталог (AKA: локальний репозиторій) і нічого поза .git/ (AKA: робоче дерево). Це не змінює місцевих гілок, і це не торкається master або Це торкається remotes/origin/master хоча (див git branch -avv) Якщо у вас є більше пультів, спробуйте git remote update. Це git fetch для всіх пультів у одній команді. - Tino
@Тіно твій, дійсно, є найважливішим моментом. Люди, можливо, не знають, що "віддалені" філії фактично зберігаються як купа хешей .git/refs/remotes/origin/. - Chris
Коли ви отримуєте, Gіt збирає будь-які зобов'язання з цільової гілки, які не існують у вашій поточній гілці, і зберігає їх у своєму локальному сховищі - як я бачу те, що було знято з пульта дистанційного керування, і як я можу з'єднати його з місцевими відділами? - アレックス
@Тіно Що я до сих пір не розумію ... в чому справа? Навіщо користуватися, якщо завантажується лише оновлення .git? Яка цільова перевага і що я повинен робити після цього? - BadHorsie


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

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

Gіt був розроблений для підтримки більш розподіленої моделі без потреби в центральному сховищі (хоча ви, звичайно, можете використовувати його, якщо хочете). Також GIT був розроблений таким чином, що для клієнта та "сервера" не потрібно одночасно бути в Інтернеті. Gіt був розроблений таким чином, щоб люди з ненадійним посиланням могли обмінюватися кодом електронною поштою навіть. Можна повністю відключити і записати компакт-диск для обміну кодом за допомогою GIT.

Для підтримки цієї моделі git підтримує місцевий репозиторій з вашим кодом, а також додатковий локальний сховище, який відображає стан віддаленого сховища. Якщо зберігати копію віддаленого сховища локально, git може з'ясувати необхідні зміни, навіть якщо віддалений сховище недоступне. Пізніше, коли вам потрібно відправити зміни комусь іншому, git може перенести їх як набір змін з моменту часу, відомий у віддаленому сховищі.

  • git fetchце команда, яка говорить: «Оновлювати мою локальну копію віддаленого сховища».

  • git pull каже "внесіть зміни в віддалений сховище, де я зберігаю свій код".

Зазвичай git pull робить це, роблячи a git fetch щоб оновити локальну копію віддаленого сховища, а потім об'єднати зміни у ваш власний сховище кодів і, можливо, вашу робочу копію.

Забрати - це мати на увазі, що часто є принаймні три копії проекту на вашій робочій станції. Одна копія - ваш власний сховище з вашою власною історією зобов'язань. Другий копія - це ваша робоча копія, де ви редагуєте та створюєте. Третім прикладом є ваша локальна "кешована" копія віддаленого сховища.


1008
2018-03-31 18:43



Технічно локальні та віддалені сховища дійсно однакові. У Git сховище є a DAG від покарання до батьків. Філії є, технічно, не більш ніж значущими назвами зобов'язань. Єдина відмінність між локальними та віддаленими філіями полягає в тому, що до віддалених до них додаються remoteName/  Гіт з землі вгору дуже добре читається. Як тільки ви зрозумієте, як діє Гіт - і це чудово простий, дійсно - все просто має сенс. - Emil Lundberg
Велике спасибі за пояснення. Я досі не зрозумів, що Gіt був розроблений так, що вам не потрібно було мати центральне сховище. Кожен завжди говорить "DVCS", коли описує Gіt, але як відносно новий програміст, це мені нічого не означає. я ніколи бачив CVCS, і я взагалі ніколи не працював з віддаленим сховищем від центру, співпрацюючи з іншими (наприклад, Github), тому до цих пір я ще не зрозумів, що зробив Git спеціальним. - Brian Peterson
Отже, виходячи з цього, чому НЕ це хороша ідея, щоб отримати пробну роботу з роботою cron? Завжди зберігати копію віддаленого комп'ютера, на якому ви працюєте, на локальній машині, здається, є гарною ідеєю. Справді, я почуваюсь написанням сценарію, який перевіряє, чи зможу я оновлювати свій пульт за останні 24 години, і підключити його до вудека для підключення до Інтернету. - Brian Peterson
Однією з причин, чому НЕ хороша ідея мати роботу cron: часто, коли я працюю над новим квитком, або на оновленнях філії, мені подобається бачити зміни, які було отримано. Якщо зміни не з'являться під час отримання, я буду більше впевнений у питанні мого товариша програміста, "як ти натиснув?". Я також отримую відчуття того, наскільки сильно "відсікаю" в сховищі з тих пір, як я останній раз приїхав. Це також допомагає мені відчути суму та швидкість змін, які в даний час здійснюються в цьому сховищі. - Michael Durrant
@Nabheet Справа в тому, що Git є контент-орієнтованим. Він зберігає дані лише один раз, і вказує на нього кілька разів. Ось чому в Git навіть кілька зобов'язань на вершині оригіналу не впливають на розмір репо, оскільки більшість об'єктів однакові. - cst1992


Ось Зображення Олівера Стіла про те, як все це все з'єднується:

enter image description here

Якщо є достатній інтерес, я вважаю, що можу оновити зображення для додавання git clone і git merge...


664
2018-06-09 13:30



Оновлене зображення з git clone і git merge буде дуже корисним! - MEMark
Так, будь ласка, додайте git merge - це повинно чітко показати це merge називається окремо, НЕ так само, як дзвонити pull оскільки pull зливається лише з віддаленого та ігнорує вашу місцеву організацію у вашій локальній гілці, яка стежить за віддаленою гілкою, що відтягується. - JustAMartin
Картина варта тисячі слів! Чи оновлено зображення з клоном і зливається потоки даних десь? Будь-які інші потоки даних крім того, що вже є на діаграмі? - shikhanshu
@Contango, будь ласка, додайте клон і об'єднайте. Було б корисно для новачків, як я. - rents
Існує дві схеми, що показують клон і зливаються з іншими відповідями (внизу) тридцять і другий пасажир. - intotecho


Один приклад використання git fetch полягає в тому, що наступне буде повідомляти вам про будь-які зміни в віддаленій галузі після останнього тягнення ..., тому ви можете перевірити, перш ніж робити фактичний тягнути, який може змінити файли у поточній гілці та робочій копії.

git fetch
git diff ...origin

428
2018-05-07 19:23



Велике поповнення! Я був заплутаний точками, чи не так: git diff origin - harm
чому ні git diff ..origin? - Erik Allik
git diff origin і git diff ..origin, здається, працюють, але це не дивно ... речі - Marc
@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. - Max Nanasy
жодна з .. команди не працювала для мене (на Windows), але git diff origin/masterпрацює, як зазначено нижче - Brian Burns


Мені коштувало трохи зрозуміти, яка різниця, але це просто пояснення. master у вашому localhost це філія.

Коли ви клонуватимете сховище, ви отримаєте весь сховище для вас локального хоста. Це означає, що у вас є початковий / основний покажчик на той час HEAD і майстер вказує на те ж саме HEAD.

коли ви починаєте працювати і виконуєте завдання, ви переходите на основний вказівник HEAD + ваша обставина. Але походження / майстер покажчик все ще вказує на те, що було, коли ви клонувалися.

Отже, різниця буде:

  • Якщо ти робиш git fetch він просто витягне всі зміни у віддаленому сховищі (GitHub) і перемістити початковий / основний покажчик на HEAD. Тим часом ваш місцевий магістр буде продовжувати вказувати на те, де він знаходиться.
  • Якщо ти робиш git pull, він буде робити в основному завантажувати (як було пояснено раніше) і об'єднати будь-які нові зміни у вашу головну гілку і перемістити покажчик на HEAD.

342
2018-05-11 18:37



origin / master є локальним відділенням, яке є КОПІЮ майстра походження. Коли ви отримаєте, ви оновлюєте локальний: / origin / master. Після того, як ви дійсно зрозумієте, що все, що є в гіті, є галуззю, це має великий сенс і є дуже потужним способом підтримувати різні набори змін, створювати швидкі локальні гілки, об'єднувати та переробляти, і взагалі отримують велику цінність за рахунок дешевої розгалуження модель - cam8001
Досі заплутаний. я думав git fetch було буквально завантажувати зміни на віддалене репо в місцевий репо, але НЕ зобов'язуюсь їх робити - тобто вони все ще повинні бути додані / допущені до вашого місцевого репо. - krb686
Придбати тільки тягне з віддаленого / походження (github) до вашого місцевого походження. Але це не з'єднує його з вашими справними робочими файлами. якщо ви зробите потяг, він буде завантажувати і об'єднати ваші поточні робочі файли - Gerardo


Інколи допомагає візуальне зображення.

enter image description here


180
2018-01-25 17:28



Я думаю, що картина повинна показати, що вона також впливає на місцеву репо. Тобто, Git pull - це поєднання впливу на місцеву репо та робочу копію. На даний момент, здається, це просто впливає на робочу копію. - 太極者無極而生
@ 太極 者 無極 而 生 Договірна - це зображення досить вводить в оману, тому що це виглядає як git pull є пропускаючи Принесіть, що, звичайно, неточно. - forresthopkinsa
@htardarkpassenger чому ти не оновлює своє зображення. Тоді, це буде найкращим оснащенням для новачків. ^ ^ - cmcromance
яка різниця між "локальним сховищем" та "робочим копією"? Чи не вони обидва локальні на комп'ютері? - theITvideos