commands - git pull origin master




ما الفرق بين "git pull" و "git fetch"؟ (20)

ما هو الفرق بين git pullو git fetch؟

لفهم هذا ، عليك أولاً أن تفهم أن بوابة git المحلية لا تحتفظ فقط بالمستودع المحلي الخاص بك ، ولكنها تحتفظ أيضًا بنسخة محلية من المستودع البعيد.

git fetchيجلب نسخة محلية من المستودع عن بعد محدثة. على سبيل المثال ، إذا كان مستودع التخزين عن بعد هو GitHub - قد ترغب في إحضار أي تغييرات تم إجراؤها في مستودع التخزين عن بعد إلى نسختك المحلية منه مستودع التخزين عن بعد. سيسمح لك هذا بتنفيذ عمليات مثل المقارنة أو الدمج.

git pullعلى الجانب الآخر ، سيؤدي ذلك إلى خفض التغييرات في المستودع عن بُعد إلى حيث تحتفظ برمزك الخاص. عادةً ، git pullستقوم git fetchأولاً بعمل نسخة محلية من المستودع عن بعد ، ثم تقوم بدمج التغييرات في مستودع التعليمات البرمجية الخاص بك وربما نسخة العمل الخاصة بك.

ملاحظة المنسق: بما أن هذا السؤال قد سبق أن تم نشر 67 إجابة عليه (تم حذف بعض الإجابات ) ، فكر فيما إذا كنت تساهم بشيء جديد قبل نشر شيء آخر.

ما هي الاختلافات بين git pull git fetch ؟


علاوة:

عند التحدث عن السحب والإحضار في الإجابات السابقة ، أود مشاركة حيلة مثيرة للاهتمام ،

git pull --rebase

هذا الأمر أعلاه هو الأمر الأكثر فائدة في حياتي git التي أنقذت الكثير من الوقت.

قبل دفع الالتزام الجديد الخاص بك إلى الخادم ، جرب هذا الأمر وسيقوم تلقائيًا بمزامنة أحدث تغييرات الخادم (مع الجلب + الدمج) وسوف يضع التزامك في الأعلى في سجل git. لا داعي للقلق حول السحب اليدوي / الدمج.

العثور على التفاصيل في: http://gitolite.com/git-pull--rebase



الجواب القصير والسهل هو أن git pull هو مجرد git fetch متبوعة git merge .

من المهم جدًا ملاحظة أن git pull سيتم git pull تلقائيًا سواء أعجبك ذلك أم لا . يمكن أن يؤدي هذا بالطبع إلى تعارضات الدمج. دعنا نقول أن جهاز التحكم عن بعد هو origin والفرع الخاص بك هو master . إذا قمت git diff origin/master قبل السحب ، يجب أن يكون لديك فكرة عن تعارضات الدمج المحتملة ويمكن أن تعد الفرع المحلي وفقًا لذلك.

بالإضافة إلى السحب والدفع ، تتضمن بعض git rebase سير العمل git rebase ، مثل هذا ، والتي أعيد صياغتها من المقالة المرتبطة:

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

إذا وجدت نفسك في مثل هذه الحالة ، قد يكون لديك إغراء git pull --rebase . ما لم تكن حقا ، تعرف حقا ما تقوم به ، أنصح ضد ذلك. هذا التحذير من صفحة man for git-pull ، الإصدار 2.3.5 :

هذا هو وضع التشغيل المحتمل أن تكون خطرة. إنها تعيد كتابة التاريخ ، والذي لا يبشر بالخير عند نشر هذا التاريخ بالفعل. لا تستخدم هذا الخيار ما لم تقرأ git-rebase (1) بعناية.


في بعض الأحيان يساعد التمثيل المرئي.


كلفني ذلك قليلاً لفهم الفرق ، لكن هذا تفسير بسيط. master في مضيفك المحلي هو فرع.

عندما تقوم باستنساخ مستودع يمكنك جلب المستودع بأكمله إلى مضيف محلي. هذا يعني أنه في ذلك الوقت لديك مؤشر أصل / رئيسي إلى HEAD و master pointing إلى نفس HEAD .

عند بدء العمل والقيام بالتعويضات ، فإنك تقوم بتحويل المؤشر الرئيسي إلى HEAD + your commits. لكن مؤشر الأصل / الرئيسي لا يزال يشير إلى ما كان عليه عند استنساخه.

لذا سيكون الفرق هو:

  • إذا قمت بعملية git fetch ، فستقوم فقط بجلب كل التغييرات في المستودع البعيد ( GitHub ) وتحريك مؤشر الأصل / الرئيسي إلى HEAD . وفي هذه الأثناء ، سيظل مدير الفرع المحلي يشير إلى مكان وجوده.
  • إذا قمت بإجراء git pull ، فستقوم بجلبها بشكل أساسي (كما هو موضح مسبقًا) ودمج أية تغييرات جديدة في الفرع الرئيسي وتحريك المؤشر إلى HEAD .

يمكنك الجلب من مستودع بعيد ، ورؤية الاختلافات ثم سحبها أو دمجها.

هذا مثال لمستودع بعيد يسمى origin وفرع يسمى master تتبع origin/master الفرع البعيد origin/master :

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

git fetchسوف تقوم باسترداد الفروع البعيدة بحيث يمكنك git diffأو git mergeلهم مع الفرع الحالي. git pullسيتم تشغيل الجلب على الفرشاة النائية تتبعه الفرع الحالي ثم دمج النتيجة. يمكنك استخدامها git fetchلمعرفة ما إذا كانت هناك أية تحديثات للفرع البعيد دون الحاجة لدمجها مع فرعك المحلي.


جيت الجلب

يمكنك تنزيل التغييرات على الفرع المحلي من الأصل من خلال الجلب. يسأل Fetch عن الريبو عن بعد عن كل الإلتزامات التي قام بها الآخرون ولكن ليس لديك على الريبو المحلي. يقوم برنامج الجلب بتحميل هذه الإلتزامات وإضافتها إلى المستودع المحلي.

جيت ميرج

يمكنك تطبيق التغييرات التي تم تنزيلها من خلال الجلب باستخدام أمر الدمج. سيؤدي الدمج إلى تنفيذ الإلتزامات التي تم استردادها من الجلب ومحاولة إضافتها إلى فرعك المحلي. سيحافظ الدمج على تاريخ الالتزام بالتغييرات المحلية الخاصة بك ، بحيث أنه عندما تشارك الفرع الخاص بك بالدفع ، ستعرف جيت كيف يمكن للآخرين دمج تغييراتك.

بوابة سحب

تعمل عملية الجلب والدمج معًا في كثير من الأحيان بحيث يتم إنشاء أمر يجمع بين الاثنين ، والسحب. يؤدي السحب إلى الجلب ثم الدمج لإضافة الإلتزامات التي تم تنزيلها إلى فرعك المحلي.


حسنًا ، في ما يلي بعض المعلومات عن git pull و git fetch ، حتى تتمكن من فهم الاختلافات الفعلية ... في بضع كلمات بسيطة ، يحصل الجلب على أحدث البيانات ، ولكن لا يتغير الرمز ولن يتعارض مع رمز الفرع المحلي الحالي ، ولكن سحب الحصول على التغييرات رمز ودمجها الفرع المحلي الخاص بك ، على قراءة للحصول على مزيد من التفاصيل حول كل:

جلبه

سيقوم بتنزيل جميع الحكام والأشياء وأي فروع جديدة إلى المستودع المحلي ...

إحضار الفروع و / أو العلامات (بشكل جماعي ، "refs") من مستودعات أو أكثر ، بالإضافة إلى الأشياء الضرورية لإكمال تواريخها. يتم تحديث فروع التتبع عن بعد (انظر وصف أدناه لطرق التحكم في هذا السلوك).

بشكل افتراضي ، يتم أيضًا جلب أي علامة تشير إلى التواريخ التي يتم جلبها ؛ يتمثل التأثير في إحضار العلامات التي تشير إلى الفروع التي تهمك. يمكن تغيير هذا السلوك الافتراضي باستخدام خيارات --tags أو --no-tags أو عن طريق تكوين remote …tagOpt. باستخدام refspec الذي يجلب العلامات بشكل صريح ، يمكنك إحضار العلامات التي لا تشير إلى الفروع التي تهتم بها أيضًا.

يمكن لجلب إحضار git من إما مستودع أو عنوان URL واحد ، أو من مستودعات متعددة في وقت واحد إذا تم إعطاؤه ويوجد أجهزة تحكم عن بعد. دخول في ملف التكوين. (انظر git-config 1 ).

عند عدم تحديد أي جهاز تحكم عن بعد ، سيتم استخدام جهاز التحكم عن بُعد بشكل افتراضي ، ما لم يكن هناك فرع من فروع upstream تم تكوينه للفرع الحالي.

تتم كتابة أسماء المراجعين التي يتم إحضارها ، مع أسماء الكائنات التي يشيرون إليها ، إلى .git / FETCH_HEAD. قد يتم استخدام هذه المعلومات من خلال البرامج النصية أو أوامر git الأخرى ، مثل git-pull.

سحب بوابة

سيتم تطبيق التغييرات من بعيد إلى الفرع الحالي في المحلية ...

يدمج التغييرات من مستودع تخزين عن بعد في الفرع الحالي. في وضعه الافتراضي ، يكون سحب git هو اختزال لـ git fetch متبوعًا بدمج git FETCH_HEAD.

بتعبير أدق ، يتم تشغيل git pull مع إحضار المعلمات المحددة ودمج git لدمج رؤوس الفروع المسترجعة في الفرع الحالي. مع -rebase ، فإنه يعمل git rebase بدلاً من دمج git.

يجب أن يكون اسم مستودع بعيد حيث تم تمريره إلى git-fetch 1 . يمكن تحديد اسم مرجع بعيد عشوائي (على سبيل المثال ، اسم علامة) أو حتى مجموعة من المراجع مع فروع التتبع عن بعد (مثل refs / heads / : refs / remotes / origin / ) ، ولكن عادةً ما يكون الاسم فرع في المستودع عن بعد.

القيم الافتراضية للقراءة من تكوين "عن بعد" و "دمج" للفرع الحالي كما هو محدد بواسطة git-branch - track.

أنا أيضا إنشاء البصرية أدناه لتظهر لك كيف git fetch git pull العمل معا ...

1


git pull == (git fetch + git merge)

لا يتغير إحضار جيت إلى الفروع المحلية.

إذا كان لديك بالفعل مستودع محلي مع جهاز تحكم عن بعد للمشروع المطلوب ، يمكنك انتزاع جميع الفروع والعلامات لجهاز التحكم عن بعد باستخدام git إحضار. ... الجلب لا يجري أي تغييرات على الفروع المحلية ، لذلك ستحتاج إلى دمج فرع بعيد مع فرع محلي مقترن لدمج تغييرات الجلب الجديدة. من جيثب


تحاول أن تكون واضحة وبسيطة.

على بوابة سحب الأمر الواقع shortcutل بوابة جلب تليها دمج بوابة أو بوابة rebase قيادة اعتمادا على التكوين الخاص بك. يمكنك تكوين مستودع Git بحيث يكون سحب git هو عملية الجلب متبوعة ب rebase.


تمثيل رسومي بسيط للمبتدئين ،

هنا،

git pull  

سوف تجلب رمز من مستودع و rebase مع المحلية ... في سحب جيت هناك إمكانية الحصول على عمليات جديدة الحصول على.

ولكن في ،

جلبه

سيحصل على رمز من المستودع ونحتاج إلى إعادة تعيينه يدويًا باستخدام git rebase

على سبيل المثال: أنا ذاهب لجلب من الخادم الرئيسي و rebase ذلك في بلدي المحلية الرئيسية.

1) سحب git (تتم عملية rebase تلقائيًا):

git pull origin master

هنا الأصل هو سيد الريبو الخاص بك عن بعد هو فرعك

2) إحضار بوابة (تحتاج إلى rebase يدوياً):

git fetch origin master

سيجلب تغييرات الخادم من الأصل. وستكون في موقعك المحلي حتى تقوم بمزاحتها بنفسك. نحتاج إلى إصلاح التعارضات يدويًا عن طريق التحقق من الرموز.

git rebase origin/master

هذا سوف rebase رمز في المحلية. قبل ذلك تأكد أنك في الفرع الصحيح.


نحن ببساطة نقول:

git pull == git fetch + git merge

إذا قمت بتشغيل git pull، لا تحتاج إلى دمج البيانات المحلية. إذا قمت بتشغيل git fetch، فهذا يعني أنه يجب عليك تشغيل git mergeللحصول على أحدث رمز إلى جهازك المحلي. خلاف ذلك ، لن يتم تغيير رمز الجهاز المحلي دون دمج.

لذلك في Git Gui ، عند إجراء عملية الجلب ، يجب عليك دمج البيانات. لن يؤدي إجراء عملية الجلب نفسها إلى تغيير الشفرة على المستوى المحلي. يمكنك التحقق من ذلك عند تحديث الشفرة عن طريق جلبها بمجرد الجلب والنقر عليها ؛ الرمز لن يتغير. ثم قمت بدمج ... سترى رمز تغييرها.


هذا التمثيل البياني التفاعلي مفيد جدا في git understanging: http://ndpsoftware.com/git-cheatsheet.html

git fetch فقط "التنزيلات" التغييرات من البعيد إلى المستودع المحلي الخاص بك. git pull بتنزيل التغييرات ويدمجها في الفرع الحالي. "في وضعه الافتراضي ، يكون git pull هو اختزال لـ git fetch متبوعًا git merge FETCH_HEAD ."


أود أن أحصل على بعض التمثيل البصري للوضع لأدرك هذه الأشياء. ربما يرغب مطورو آخرون في رؤيتها أيضًا ، لذلك فإليك الإضافة. لست متأكدًا تمامًا من صحة كل شيء ، لذا يرجى التعليق إذا وجدت أي أخطاء.

                                         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.

بعض المزايا الرئيسية لوجود مرآة مسترجعة لجهاز التحكم عن بعد هي:

  • الأداء (التمرير خلال جميع الالتزامات والرسائل دون محاولة الضغط عليه من خلال الشبكة)
  • ملاحظات حول حالة الريبو المحلي (على سبيل المثال ، أستخدم SourceTree من Atlassian ، والتي ستعطيني مصباحًا يشير إلى ما إذا كنت ملتزمًا أو متخلفًا عن الأصل. يمكن تحديث هذه المعلومات باستخدام GIT FETCH).

والفرق الوحيد بين git pullو git fetchهو ما يلي:

git pull يسحب من فرع بعيد ويدمجها.

git fetch فقط جلب من الفرع البعيد لكنه لا يدمج

أي git pull = git fetch + git merge ...


يسمح Git بتطبيق الالتزام الأقدم زمنًا بعد الالتزام الأحدث. وبسبب ذلك ، يتم تقسيم فعل نقل الالتزامات بين المستودعات إلى خطوتين:

  1. نسخ التزام جديد من الفرع البعيد لنسخ هذا الفرع البعيد داخل repo محلي.

    (الريبو إلى عملية الريبو) [email protected] >> remote/origin/[email protected]

  2. دمج الالتزام الجديد بالفرع المحلي

    (داخل عملية إعادة الشراء) remote/origin/[email protected] >> [email protected]

هناك طريقتان للقيام بالخطوة 2. يمكنك:

  1. شوكة الفرع المحلي بعد السلف المشترك الأخير وإضافة عمليات جديدة متوازية مع الإلتزامات التي تنفرد بالمستودع المحلي ، وتنتهي من خلال دمج الالتزام ، وإغلاق الشوكة.
  2. أدرج عمليات الإلتزام الجديدة بعد السلف المشترك الأخير ، ثم قم بطلب الإلتزام بالمستودع الفريد.

في gitالمصطلح ، الخطوة 1 هي git fetch، الخطوة 2 هي git mergeأوgit rebase

git pullهو git fetchوgit merge


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.

ستقوم بالسحب إذا كنت تريد دمج التاريخ ، فستحضر إذا كنت تريد "الرمز" لأن بعض الأشخاص قام بوضع علامات على بعض المقالات هنا.


git pull = git fetch + git merge 




git-fetch