سؤال

أواجه صعوبة في فهم الفروق الدقيقة في git-fetch.أنا أفهم أن القيام ب fetch, ، يجلب المراجع البعيدة إلى فرع التتبع المحلي.

لدي بعض الأسئلة بالرغم من ذلك:

  1. هل من الممكن عدم وجود فرع تتبع محلي؟وإذا كان الأمر كذلك، فهل سيتم إنشاؤه تلقائيًا؟

  2. ماذا سيحدث لو قمت ب fetch وتحديد فرع غير تتبع كوجهة؟

  3. تحدد صفحة الدليل الخاصة بـ git-fetch ما يلي:

    git-fetch <options> <repository> <refspec>
    

كيف يمكنني استخدام refspec لجلب المحتويات من جهازي الرئيسي البعيد إلى فرع التتبع عن بعد الخاص به؟أعتقد أن هذا قد يكون ممكنًا إذا كان رأسي الحالي في وضع رئيسي وقمت بالركض

git fetch origin master

ومع ذلك، هل يمكنني استخدام <+?src:dest> refspec لتحقيق نفس الشيء؟أعتقد أن هذا سيساعدني على فهم المفاهيم بشكل أفضل.

وسؤال آخر:

يحتوي ملف .git/config الخاص بي على السطر التالي للجلب (يعرض الأسطر ذات الصلة فقط):

fetch = +refs/heads/*:refs/remotes/origin/*

هل يمكن لأحد أن يشرح ماذا يعني هذا السطر بالضبط؟

هل كانت مفيدة؟

المحلول

أولا، لا يوجد مثل هذا المفهوم تتبع محلي الفروع فقط تتبع عن بعد الفروع.لذا الأصل / سيد هو فرع تتبع عن بعد ل يتقن في ال أصل الريبو.

عادة ما تفعل ذلك بوابة جلب $ عن بعد الذي يقوم بتحديث جميع فروع التتبع عن بعد الخاصة بك، وإنشاء فروع جديدة إذا لزم الأمر.

ومع ذلك، يمكنك أيضًا تحديد مرجع، لكن ذلك لن يؤثر على فروع التتبع عن بُعد، وبدلاً من ذلك، سيجلب الفرع الذي حددته ويحفظه على FETCH_HEAD، ما لم تحدد وجهة.بشكل عام، لا تريد العبث بهذا.

أخيراً،

fetch = +refs/heads/*:refs/remotes/origin/*

وهذا يعني إذا قمت بذلك

git fetch origin

في الواقع سوف تفعل:

git fetch origin +refs/heads/*:refs/remotes/origin/*

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

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

نصائح أخرى

felipec يملك أجاب على معظم القضايا المطروحة في إجابته.

بقي عدد قليل (معظمها مأخوذ من جلب بوابة الصفحة الرئيسية;وهو قديم بعض الشيء في بعض الأماكن، للأسف):

  • لو فرع التتبع عن بعد (الفرع الذي يتتبع بعض الفروع في بعض المستودعات البعيدة) غير موجود، سيتم إنشاؤه.

  • الفرع الذي تدخل إليه ( <dst> في [+]<src>:<dst>) لا يحتاج إلى الإقامة فيه remotes/<remote>/ مساحة الاسم.على سبيل المثال لعكس المستودعات (git clone --mirror) refspec هو 1 إلى 1.في الأيام الخوالي قبل تخطيط أجهزة التحكم عن بعد المنفصلة (قبل remotes/<remote>/ مساحة الاسم لمراجع التتبع عن بعد) يتقن تم جلب فرع إلى فرع يسمى أصل.حتى العلامات الحالية يتم جلبها مباشرة إلى tags/ مساحة الاسم بطريقة معكوسة.

  • إذا كان الفرع الذي ستجلبه (الجانب الأيمن من refspec <src>:<dst> إذا كان موجودًا، فسيقوم Git بالتحقق مما إذا كان التنزيل سيؤدي إلى التقديم السريع، على سبيل المثال.إذا كانت الحالة الحالية في <dst> هو سلف الدولة في <src> في مستودع بعيد معين.إذا لم يكن كذلك، وكنت لا تستخدم -f/--force خيار git-fetch، أو البادئة refspec بـ "+" (استخدم +<src>:<dst> refspec) سيرفض الجلب تحديث هذا الفرع.

  • git fetch origin master يعادل git fetch origin master:, لا git fetch origin master:master;يقوم بتخزين القيمة جلبها يتقن فرع (من بعيد أصل) في FETCH_HEAD, ، وليس في يتقن فرع أو تتبع عن بعد remotes/origin/master فرع.يمكن أن يتبعه git merge FETCH_HEAD.عادة لا يتم استخدامه بشكل مباشر، ولكن كجزء من السحب لمرة واحدة دون تعيين فرع التتبع عن بعد: git pull <URL> <branch>.

  • +refs/heads/*:refs/remotes/origin/* كقيمة ل Remote.origin.fetch متغير التكوين يعني أن كل فرع (المرجع في refs/heads/ مساحة الاسم) في جهاز التحكم عن بعد أصل يتم جلبه إلى فرع التتبع عن بعد المسمى على التوالي في refs/remotes/origin/ مساحة الاسم، على سبيل المثال يتقن فرع في أصل (أي. refs/heads/master المرجع) سيتم جلبه إلى الأصل / سيد فرع التتبع عن بعد (أي. refs/remotes/origin/master المرجع).تعني البادئة "+" أن عملية الجلب ستنجح حتى في حالة عدم التقديم السريع، وهو ما يعني عند إعادة تأسيس الفرع الموجود على جهاز التحكم عن بعد، أو إعادة لفه (إعادة التعيين إلى حالة ما في الماضي) أو تعديله بطريقة أخرى.

ملاحظة جانبية: ربما ترغب في استخدام مستوى أعلى جيت عن بعد أمر لإدارة المستودعات البعيدة والحصول على التحديثات.

لاحظ أن المشرف الرئيسي على Git قد أضاف الآن (Git 2.1، أغسطس 2014) هذا الشرح لـ git fetch:
(يرى ارتكاب fcb14b0 بواسطة جونيو سي هامانو (gitster):

تكوين فروع التتبع عن بعد

غالبًا ما تتفاعل مع نفس المستودع البعيد عن طريق الجلب منه بشكل منتظم ومتكرر.من أجل متابعة التقدم المحرز في مثل هذا المستودع البعيد، git fetch يسمح لك بتكوين remote.<repository>.fetch متغيرات التكوين.

عادة قد يبدو هذا المتغير كما يلي:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*

يتم استخدام هذا التكوين بطريقتين:

  • متى git fetch يتم تشغيله دون تحديد الفروع و/أو العلامات التي سيتم جلبها في سطر الأوامر، على سبيل المثال. git fetch origin أو git fetch, remote.<repository>.fetch يتم استخدام القيم كـ المراجع --- تحدد المراجع التي سيتم جلبها والمراجع المحلية التي سيتم تحديثها.
    المثال أعلاه سيجلب جميع الفروع الموجودة في ملف origin (أي.أي مرجع يطابق الجانب الأيسر من القيمة، refs/heads/*) وتحديث فروع التتبع عن بعد المقابلة في refs/remotes/origin/* تَسَلسُل.

  • متى git fetch يتم تشغيله باستخدام فروع و/أو علامات صريحة لجلبها من سطر الأوامر، على سبيل المثال. git fetch origin master, ، ال <refspec>تحدد العناصر الواردة في سطر الأوامر ما سيتم جلبه (على سبيل المثال. master في المثال، وهو اختصار ل master:, ، والتي بدورها تعني "إحضار"master"الفرع لكنني لا أقول صراحةً ما هو فرع التتبع عن بعد الذي سيتم تحديثه به من سطر الأوامر")، وسيقوم أمر المثال بجلب فقط ال 'master' فرع.
    ال remote.<repository>.fetch تحدد القيم فرع التتبع عن بعد، إن وجد، الذي سيتم تحديثه.
    عند استخدامها بهذه الطريقة، remote.<repository>.fetch القيم ليس لها أي تأثير في اتخاذ القرار ماذا يتم جلبه (أيلا يتم استخدام القيم كمراجع عندما يسرد سطر الأوامر المواصفات)؛يتم استخدامها فقط لاتخاذ القرار أين يتم تخزين المراجع التي تم جلبها من خلال العمل كتعيين.

لاحظ أيضًا أنه مع Git 2.5+ (الربع الثاني من عام 2015)، git merge FETCH_HEAD يستطيع دمج عمليات جلب git المتعددة.

يرى ارتكاب d45366e بواسطة جونيو سي هامانو (gitster), 26 مارس 2015.
(تم الدمج بواسطة جونيو سي هامانو -- gitster -- في ارتكاب bcd1ecd, ، 19 مايو 2015)

"git merge FETCH_HEAD"علمت أن السابق"git fetch" يمكن أن يكون إنشاء دمج الأخطبوط، على سبيل المثال.تسجيل فروع متعددة لم يتم وضع علامة "غير قابلة للدمج" عليها؛
هذا يسمح لنا بفقدان استدعاء النمط القديم "git merge <msg> HEAD $commits..." في تنفيذ "git pull" النصي؛يمكن الآن إهمال بناء جملة النمط القديم.

ال git merge وثيقة أذكر الآن:

متى FETCH_HEAD (ولا يوجد أي التزام آخر) محدد، الفروع المسجلة في .git/FETCH_HEAD الملف عن طريق الاستدعاء السابق لـ git fetch للدمج يتم دمجها في الفرع الحالي.


Git 2.13 (الربع الثاني من عام 2017) يتقاعد رسميًا من بناء الجملة القديم لـ git merge.
يرى ارتكاب b439165 (26 مارس 2015) بواسطة جونيو سي هامانو (gitster).
(تم الدمج بواسطة جونيو سي هامانو -- gitster -- في ارتكاب 1fdbfc4, ، 30 مارس 2017)

merge:يسقط 'git merge <message> HEAD <commit>' بناء الجملة

توقف عن الدعم "git merge <message> HEAD <commit>"بناء الجملة الذي تم إهماله منذ أكتوبر 2007 ، ويصدر رسالة تحذير من الإهمال منذ الإصدار 2.5.0.

وهذا يعني رسالة التحذير ذات النمط القديم "'git merge <msg> HEAD <commit>' is deprecated." ليس أكثر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top