ما هي نماذج Git المتفرعة التي تناسبك؟


Answers

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

إذا كان لدي فهم لتطوير النواة (سأركز على ذلك) ، فالجميع لديهم مستودع git الخاص بهم لتطوير النواة. هناك مستودع واحد ، linux-2.6.git ، يرعى من قبل Torvalds ، الذي يعمل بمثابة مستودع الإصدار. يستنسخ الأشخاص من هنا إذا كانوا يرغبون في البدء في تطوير ميزة مقابل فرع "الإصدار".

المستودعات الأخرى تقوم ببعض التطوير. الفكرة هي الاستنساخ من linux-2.6 ، التفرع بعدد المرات التي تريدها حتى تصل إلى هذه النقطة حيث لديك ميزة "جديدة" تعمل. بعد ذلك ، عندما يكون ذلك جاهزًا ، يمكنك إتاحته لشخص يعتبر موثوقًا به ، والذي سيقوم بسحب هذا الفرع من المستودع الخاص بك إلى سجله ودمجه في الاتجاه السائد. في النواة linux kernel يحدث هذا على عدة مستويات (الملازمين الموثوقين) حتى يصل إلى linux-2.6.git وعند هذه النقطة يصبح "النواة".

الآن هنا حيث تحصل على الارتباك. لا يجب أن تكون أسماء الفروع متسقة عبر المستودعات على الإطلاق. حتى أتمكن من git pull origin master:vanilla-code ، والحصول على فرع من سيد origin في فرع في بلدي مستودع يسمى vanilla-code . إذا كنت أعرف ما يحدث ، فإنه لا يهم حقاً - يتم توزيعه بمعنى أن جميع المستودعات نظراء لبعضهم البعض وليس مشتركًا فقط عبر العديد من أجهزة الكمبيوتر مثل SVN.

لذلك ، مع أخذ كل ذلك في الاعتبار:

  1. أعتقد أن الأمر متروك لكل مبرمج كيف يفعلون تفرعاتهم. كل ما تحتاجه هو مستودع مركزي لإدارة الإصدارات ، إلخ. قد تكون الإصدارات عبارة عن علامات أو فروع ، وربما تكون الإصلاحات العاجلة فروعًا في حد ذاتها. في الواقع ، من المحتمل أن أقوم بالإصدارات كأغصان حتى تتمكن من الاحتفاظ بها.
  2. أنا أدمج ولا أعدّم. على سبيل المثال ، إذا كنت تأخذ مستودعًا ، استنساخه ، وفرعه ، وقم بعمل بعض التطوير ، ثم اسحب من yourbranch أن تقوم ، في yourbranch فرع آخر ودمج أحدث رسالة master في yourbranch حتى يتمكن شخص آخر من سحب التغييرات الخاصة بك مع جهد قليل قدر الإمكان. من النادر جدا أن نرفض حقا ، في تجربتي.
  3. أعتقد أنها حالة لفهم الطريقة التي تعمل بها Git وما يمكنها فعله. يستغرق الأمر بعض الوقت والكثير من التواصل الجيد - لقد بدأت بالفعل في فهم ما يحدث عندما بدأت استخدام بوابة مع مطورين آخرين وحتى الآن ، بعض الأشياء التي لست متأكداً منها.
  4. دمج النزاعات مفيدة. أعلم ، أعلم ، أنك تريد أن يعمل الجميع ، ولكن الحقيقة هي أن التغييرات في الشفرة تحتاج إلى دمج النتائج في شيء يعمل. دمج النزاعات هي في الواقع مجرد المزيد من البرمجة. لم أجد أبدًا تفسيرًا سهلاً لما يجب فعله حيالها ، لذا فإليك ما يلي: لاحظ الملفات التي تحتوي على تعارضات دمج ، انتقل وتغييرها إلى ما ينبغي أن يكون ، git add . ثم git commit .
  5. ومع ذلك يناسب. كما قلت ، كل مستودع git هو ملكهم للعب مع وأسماء الفرع لا تحتاج إلى أن تكون هي نفسها . إذا كان لديك مستودع تخزين مؤقت ، على سبيل المثال ، يمكنك تنفيذ مخطط تسمية ، ولكنك لا تحتاج إلى كل مطور ، فقط في repo الإصدار.
  6. هذه هي مرحلة الدمج. أنت فقط تدمج في الفروع الإفرادية ، إلخ عندما تنظر في الكود المراد مراجعته / اجتياز اختبار الجودة.

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

تعديل بعض الأفكار الإضافية حول كيفية استخدام بوابة في إعداد تجاري ، حيث يبدو ذلك ملائمًا لـ OP من التعليقات:

  • إن مستودع الإصدار ، الذي سنطلق عليه اسم product.git ، يمكن الوصول إليه من قبل عدد من كبار المبرمجين / الأشخاص التقنيين المسئولين عن العناية الفعلية بالمنتج نفسه. وهي مشابه لدور المراقبين في OSS.
  • من المحتمل أن يكون هؤلاء المبرمجون قادرين جزئياً على تطوير إصدارات جديدة ، لذا قد يقومون أيضًا بترميز أنفسهم والحفاظ على مستودعات varios. قد يقومون بإدارة مستودعات التخزين لميزات جديدة بالفعل وقد يكون لديهم أيضًا مستودعاتهم الخاصة.
  • تحتهم هم المبرمجون المسؤولون عن تطوير البتات الفردية. على سبيل المثال ، قد يكون شخص ما مسؤولاً عن عمل واجهة المستخدم. وبالتالي ، فإنها تدير مستودع UI.git.
  • أدناه هم المبرمجون الفعليون الذين يطورون الميزات كعملهم اليومي الكامل.

إذن ماذا يحدث؟ حسنا ، الجميع يسحب في بداية كل يوم من مصدر "المنبع" أي مستودع الإصدار (الذي سيحتوي أيضا على الأرجح أحدث المواد من تطوير الأيام السابقة). الجميع يفعل هذا ، مباشرة. هذا سوف يذهب على فرع في مستودعهم ، وربما يسمى "سيد" أو ربما إذا كنت تدعى "الأحدث". ثم يقوم المبرمج ببعض العمل. قد يكون هذا العمل شيئًا ليسوا متأكدين منه ، لذا يقومون بعمل فرع ، يقومون بالعمل. إذا لم ينجح ، يمكنهم حذف الفرع والعودة. إذا حدث ذلك ، فسيتعين عليهم الاندماج في الفرع الرئيسي الذي يعملون عليه حاليًا. سوف نقول هذا هو مبرمج واجهة المستخدم يعمل على latest-ui حتى يقوم git checkout latest-ui متبوعاً git merge abc-ui-mywhizzynewfeature . ثم يقول قيادته الفنية (الرصاص واجهة المستخدم) مهلا ، لقد أكملت هذه المهمة ، وسحب مني. لذا فإن واجهة المستخدم تؤدي إلى git pull user-repo lastest-ui:lastest-ui-suchafeature-abc . بعد ذلك تظهر واجهة المستخدم على ذلك الفرع وتقول ، في الواقع ، هذا جيد جدًا ، ui-latest . ثم قد يخبر الجميع تحته أن يسحب منه على ui-latest فروعه أو أيا كان الاسم الذي أعطاه لهم ، وبالتالي يتم استكشاف الميزة من قبل المطورين. إذا كان الفريق سعيدًا ، فقد يطلب قائد واجهة المستخدم اختبارًا يؤدي إلى سحبه منه ودمج التغييرات. ينتشر ذلك إلى الجميع (في اتجاه التغيير) الذي يقوم باختباره وتقديم تقارير الأخطاء وما إلى ذلك. وفي النهاية ، إذا اجتازت الميزة اختبارًا إلخ ، فقد يدمجها أحد كبار الخبراء الفنيين في النسخة العاملة الحالية من البرنامج ، وعند هذه النقطة ثم يتم نشر جميع التغييرات مرة أخرى إلى أسفل. وما إلى ذلك وهلم جرا.

إنها ليست طريقة "تقليدية" للعمل وهي مصممة لتكون "مدفوعة نظراء" بدلاً من "هرمية" مثل SVN / CVS. في الجوهر ، كل شخص قد ارتكبت ، ولكن فقط محليًا. هو الوصول إلى المخزون والمستودع الذي تحدده على أنه repo الإصدار الذي يسمح لك باستخدام التسلسل الهرمي.

Question

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

  1. نماذج سير العمل / المتفرعة

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

  2. الدمج مقابل إعادة الشراء (التاريخ المتشابك مقابل المتسلسل)

    يجب pull --rebase واحد - أو pull --rebase الانتظار مع العودة إلى الخط الرئيسي حتى تنتهي مهمتك؟ أنا شخصياً أميل نحو الدمج لأن هذا يحافظ على إيضاح مرئي عن أي أساس بدأت المهمة وانتهيت ، وأنا أفضل أن merge --no-ff لهذا الغرض. لديها عيوب أخرى ومع ذلك. كذلك لم يدرك العديد من الأشخاص خاصية الدمج - وهي أنه ليس commutative (لا يعني دمج فرع الموضوع في الصفحة الرئيسية دمج رئيسي في فرع الموضوع).

  3. أنا أبحث عن سير عمل طبيعي

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

  4. كيفية تجنب خلق صراعات دمج (بسبب اختيار الكرز)؟

    ما يبدو كطريقة مؤكدة لإنشاء تعارض الدمج هو الاختيار بين الفروع ، ولا يمكن دمجها مرة أخرى؟ هل يمكن لتطبيق نفس الالتزام في العودة (كيف نفعل ذلك؟) في أي من الفرعين أن يحل هذا الوضع؟ هذا هو أحد الأسباب التي تجعلني لا أجرؤ على الدفع نحو سير عمل قائم على الدمج إلى حد كبير.

  5. كيف تتحلل في فروع موضعية؟

    ندرك أنه سيكون من الرائع تجميع تكامل نهائي من فروع الموضوع ، ولكن غالبًا ما يكون عمل مطورينا غير محدد بشكل واضح (أحيانًا ما يكون بسيطًا مثل "الدس حوله") وإذا تم إدخال بعض الرموز بالفعل في موضوع "منوعات" ، لا يمكن اخراجها من هناك مرة أخرى ، وفقا للسؤال أعلاه؟ كيف تعمل على تحديد / اعتماد / تخريج / تحرير فروع مواضيعك؟

  6. الإجراءات المناسبة مثل مراجعة الكود والتخرج ستكون جميلة بالطبع.

    لكننا ببساطة لا نستطيع إبقاء الأمور متشابكة بما فيه الكفاية لإدارة هذا - أي اقتراحات؟ فروع التكامل والرسوم التوضيحية؟

فيما يلي قائمة بالأسئلة ذات الصلة:

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




أنا شخصياً أحاول الاحتفاظ بكود جاهز للإصدار فقط في الفرع الرئيسي.

عندما أعمل على ميزة جديدة أو bugfix أفعل ذلك في فرع. أنا أيضا اختبار الوحدة في الفرع. إذا كان كل شيء يعمل جيدًا ، فعندئذ فقط أقوم بدمج / rebase مرة أخرى في الصفحة الرئيسية.

أحاول استخدام اصطلاحات تسمية الفرع الشائعة أيضًا ، مثل:

  • خلل / recursive_loop
  • خلل / sql_timeout
  • ميزة / new_layout
  • ميزة / enhanced_search



Links