Git rebase: كل ما تريد معرفته
نشرت: 2022-12-15
يجمع الأمر Git rebase بين فرعين من الكود المصدري في فرع واحد. يقوم أمر merge Git بذلك أيضًا. rebase ما يفعله تغيير العنوان الأساسي وكيف يتم استخدامه ومتى يتم استخدام merge بدلاً من ذلك.
انفجار جيت
ما هو Git merge؟
ما هو Git rebase؟
كيفية تغيير مكان إقامته في فرع آخر
Git Rebase مقابل Merge: أيهما يجب أن تستخدمه؟
هل تريد إعادة التأسيس أم لا؟
انفجار جيت
محبطًا من أنظمة التحكم في الإصدارات الأخرى والتحديثات والالتزامات البطيئة الخاصة بها ، وضع Linus Torvalds ، من شهرة Linux kernel ، جانباً شهرًا في عام 2005 لكتابة برنامجه الخاص. أطلق عليها اسم Git.
لقد روجت مواقع مثل GitHub و GitLab و BitBucket بشكل تكافلي واستفادت من Git. يتم استخدام Git اليوم على مستوى العالم ، مع 98 في المائة من 71 ألف مستجيب في استطلاع عام 2022 باستخدام Git كنظام التحكم في الإصدار.
كان أحد قرارات التصميم الرئيسية لشركة Git هو السرعة. على وجه الخصوص ، يجب أن يكون العمل مع الفروع في أسرع وقت ممكن. الفروع هي جزء أساسي من أنظمة التحكم في الإصدار. سيكون لمستودع المشروع فرع رئيسي أو فرع رئيسي. هذا هو المكان الذي توجد فيه قاعدة رمز المشروع. التطوير ، مثل الميزات الجديدة ، يحدث في فروع جانبية منفصلة. هذا يمنع العمل المنجز في الفروع من العبث بالفرع الرئيسي ، ويسمح بالتطوير المتزامن في أجزاء مختلفة من قاعدة الكود.
مع اكتمال التطورات في الفروع الجانبية ، يتم نقل التغييرات إلى الفرع الرئيسي عن طريق دمج فرع التطوير في الفرع الرئيسي. في أنظمة التحكم في الإصدارات الأخرى ، كان العمل مع الفروع صعبًا ومكلفًا من الناحية الحسابية. العمل مع الفروع في Git سريع جدًا وخفيف الوزن جدًا. ما كان في يوم من الأيام تمرينًا مملاً وغالبًا ما يتم تجنبه في أنظمة أخرى ، أصبح تافهًا في Git.
يعد الأمر Git rebase طريقة أخرى لنقل التغييرات من فرع إلى فرع آخر. أمرا merge وإعادة التأسيس لهما أهداف متشابهة ، لكنهما rebase بطرق مختلفة ويؤديان إلى نتائج مختلفة قليلاً.
ما هو Git merge؟
إذن ما هو أمر merge Git؟ لنفترض أنك قمت بإنشاء فرع يسمى dev-branch للعمل على ميزة جديدة.

تقوم ببعض الالتزامات وتختبر ميزتك الجديدة. كل شيء يعمل بشكل جيد. الآن تريد إرسال الميزة الجديدة الخاصة بك إلى الفرع master . يجب أن تكون في الفرع master لدمج الآخر به.
يمكننا التأكد من أننا في الفرع master عن طريق التحقق صراحة من ذلك قبل الدمج.
بوابة الخروج سيد
يمكننا الآن إخبار Git بدمج dev-branch الحالي ، وهو الفرع master .
git merge dev-Branch

لقد اكتمل merge بالنسبة لنا. إذا قمت بتسجيل الخروج من الفرع master وقمت بتجميعه ، فسيحتوي على الميزة المطورة حديثًا فيه. ما قام به Git في الواقع هو دمج ثلاثي. يقارن أحدث عمليات الارتباطات في الفروع master dev-branch التطوير ، والالتزام في الفرع master مباشرة قبل إنشاء dev-branch . ثم يقوم بتنفيذ التزام على الفرع master .
تعتبر عمليات الدمج غير مدمرة لأنها لا تحذف أي شيء ولا تغير أيًا من محفوظات Git. لا يزال dev-branch موجودًا ، ولم يتم تغيير أي من عمليات التنفيذ السابقة. يتم إنشاء التزام جديد يلتقط نتائج الدمج ثلاثي الاتجاهات.
بعد الدمج ، يبدو مستودع Git الخاص بنا كجدول زمني يتفرع منه خط بديل ثم يعود إلى المخطط الزمني الرئيسي.

تم دمج فرع dev-branch master .
إذا كان لديك الكثير من الفروع في مشروع واحد ، فقد يصبح تاريخ المشروع محيرًا. هذا هو الحال غالبًا إذا كان للمشروع العديد من المساهمين. نظرًا لأن جهود التطوير تنقسم إلى العديد من المسارات المختلفة ، فإن تاريخ التطوير غير خطي. يصبح فك تشابك سجل الالتزام أكثر صعوبة إذا كان للفروع فروعها الخاصة.
لاحظ أنه إذا كانت لديك تغييرات غير ملزمة في الفرع master ، فستحتاج إلى القيام بشيء ما مع هذه التغييرات قبل أن تتمكن من دمج أي شيء فيها. يمكنك إنشاء فرع جديد وتنفيذ التغييرات هناك ، ثم إجراء الدمج. ستحتاج بعد ذلك إلى دمج فرعك المؤقت مرة أخرى في الفرع الرئيسي.
يعمل هذا ، لكن لدى Git أمرًا يحقق نفس الشيء ، دون الحاجة إلى إنشاء فروع جديدة. يخزن الأمر stash تغييراتك غير الملتزم بها نيابة عنك ، ويتيح لك معاودة الاتصال بها باستخدام stash pop .
كنت ستستخدمهم مثل هذا:
خبأ git merge dev-Branch خبأ البوب
النتيجة النهائية هي فرع مدمج ، مع استعادة التغييرات غير المحفوظة.
ما هو Git rebase؟
يحقق أمر Git rebase أهدافه بطريقة مختلفة تمامًا. يستغرق الأمر جميع الالتزامات من الفرع الذي ستعيد تأسيسه ويعيد تشغيلها في نهاية الفرع الذي تعيد التأسيس عليه.
بأخذ مثالنا السابق ، قبل تنفيذ أي إجراء ، يبدو مستودع Git الخاص بنا على هذا النحو. لدينا فرع يسمى dev-branch ونريد نقل هذه التغييرات إلى الفرع master .


بعد تغيير العنوان الأساسي ، يبدو rebase زمني واحد وخطي تمامًا للتغييرات.

تمت إزالة dev-branch dev ، وأضيفت dev-branch الفرع الرئيسي. والنتيجة النهائية هي نفسها كما لو أن الالتزامات في dev-branch قد تم الالتزام بها فعليًا مباشرة إلى الفرع master في المقام الأول. لا يتم تعليق الالتزامات على الفرع master فقط ، بل يتم "إعادة تشغيلها" وإضافتها جديدة.
هذا هو السبب في أن الأمر rebase يعتبر مدمرًا. لم يعد الفرع المعاد تأسيسه موجودًا كفرع منفصل ، وتمت إعادة كتابة محفوظات Git لمشروعك. لا يمكنك في وقت لاحق تحديد الالتزامات التي تم إجراؤها في الأصل dev-branch .
ومع ذلك ، فإنه يترك لك تاريخًا مبسطًا وخطيًا. مقارنة بمستودع يحتوي على عشرات أو حتى مئات الفروع والدمج ، أو قراءة سجل Git أو استخدام واجهة مستخدم رسومية git لإلقاء نظرة على رسم بياني للمستودع ، فإن المستودع المعاد تأسيسه هو أمر سهل الفهم.
كيفية تغيير مكان إقامته في فرع آخر
لنجرب مثال git rebase . لدينا مشروع بفرع يسمى new-feature . سوف rebase تأسيس هذا الفرع على الفرع master مثل هذا.
أولاً ، نتحقق من عدم وجود تغييرات معلقة في الفرع master .
حالة بوابة
نتحقق من فرع new-feature .
بوابة الخروج ميزة جديدة
نطلب من rebase إعادة تعيين الفرع الحالي إلى الفرع الرئيسي.
git rebase master
يمكننا أن نرى أنه لا يزال لدينا فرعين.
فرع بوابة
نعود إلى الفرع master
بوابة الخروج سيد
نقوم بدمج فرع الميزة الجديدة في الفرع الحالي ، وهو في حالتنا الفرع master .
بوابة دمج ميزة جديدة

ومن المثير للاهتمام ، أنه لا يزال لدينا فرعين بعد الدمج النهائي.

يتمثل الاختلاف الآن في أن رأس فرع new-feature ورئيس الفرع master قد تم تعيينهما للإشارة إلى نفس الالتزام ، ولا يظهر سجل Git أنه اعتاد أن يكون فرع new-feature منفصلة ، بصرف النظر عن تسمية الفرع.

Git Rebase مقابل Merge: أيهما يجب أن تستخدمه؟
إنها ليست حالة إعادة rebase مقابل merge . كلاهما أمران قويتان ومن المحتمل أن تستخدمهما كليهما. ومع ذلك ، هناك حالات استخدام لا rebase فيها تغيير العنوان الأساسي جيدًا. يعد عدم انتقاء الأخطاء التي تسببها أخطاء استخدام merge أمرًا مزعجًا ، ولكن عدم انتقاء الأخطاء التي تسببها إعادة الأساسي هو أمر rebase .
إذا كنت المطور الوحيد الذي يستخدم مستودعًا ، فهناك فرصة أقل للقيام بشيء ما باستخدام rebase بيانات جديدة تكون كارثية. لا يزال بإمكانك إعادة تحديد rebase في الاتجاه الخاطئ على سبيل المثال ، وإعادة تحديد موقع rebase الرئيسي الخاص بك إلى فرع new-feature . لاستعادة الفرع master الخاص بك ، ستحتاج إلى إعادة rebase مرة أخرى ، هذه المرة من فرع new-feature إلى فرعك master . سيؤدي ذلك إلى استعادة فرعك master ، وإن كان ذلك بتاريخ غريب المظهر.
لا تستخدم rebase في الفروع المشتركة حيث من المحتمل أن يعمل الآخرون. ستتسبب التغييرات التي أجريتها على المستودع الخاص بك في حدوث مشكلات لكثير من الأشخاص عندما تدفع التعليمات البرمجية المعاد تأسيسها إلى مستودعك البعيد.
إذا كان لمشروعك عدة مساهمين ، فالشيء الآمن الذي يمكنك فعله هو استخدام قاعدة بيانات جديدة فقط في rebase المحلي الخاص بك ، وليس في الفروع العامة. وبالمثل ، إذا كانت طلبات السحب تشكل جزءًا من مراجعات الكود ، فلا تستخدم rebase . أو على الأقل ، لا تستخدم تغيير rebase بعد إنشاء طلب السحب. من المحتمل أن ينظر مطورو آخرون في التزاماتك ، مما يعني أن هذه التغييرات موجودة في فرع عام ، حتى لو لم يكونوا في الفرع master .
يكمن الخطر في أنك rebase الالتزامات التي تم دفعها بالفعل إلى مستودع بعيد ، وقد يكون المطورون الآخرون قد اعتمدوا بالفعل على تلك الالتزامات. ستؤدي عملية تغيير اسمك المحلية إلى rebase هذه الالتزامات الحالية. إذا قمت بدفع هذه التغييرات إلى المستودع ، فلن تحظى بشعبية.
سيتعين على المساهمين الآخرين المرور بعملية merge فوضوي لإعادة عملهم إلى المستودع. إذا قمت بعد ذلك بسحب تغييراتهم مرة أخرى إلى مستودعك المحلي ، فستواجه حينئذٍ إلغاء انتقاء فوضى من التغييرات المكررة.
هل تريد إعادة التأسيس أم لا؟
قد يتم حظر Rebase في مشروعك. قد تكون هناك اعتراضات محلية وثقافية. تعتبر بعض المشاريع أو المنظمات تغيير العنوان الأساسي rebase من أشكال البدعة وفعل تدنيس. يعتقد بعض الناس أن تاريخ Git يجب أن يكون سجلًا دائمًا لا يمكن انتهاكه لما حدث. rebase ، قد تكون إعادة الأساسي غير مطروحة على الطاولة.
ولكن ، عند استخدامها محليًا ، في الفروع الخاصة ، rebase عملية تغيير العنوان الأساسي أداة مفيدة.
ادفع بعد إعادة التأسيس ، وقصرها على الفروع حيث تكون أنت المطور الوحيد. أو على الأقل ، حيث توقفت جميع عمليات التطوير ، ولم يقم أي شخص آخر ببناء أي عمل آخر بناءً على التزامات فرعك.
افعل ذلك وستتجنب أي مشاكل.
ذات صلة: كيفية التحقق من إصدار Git الخاص بك وتحديثه



