الدليل النهائي لـ Git Merge و Git Rebase

مرحبا بكم في نهاية المطاف دليل لدينا على git mergeو git rebaseالأوامر. سيعلمك هذا البرنامج التعليمي كل ما تحتاج لمعرفته حول الجمع بين الفروع المتعددة مع Git.

جيت دمج

سيقوم git mergeالأمر بدمج أي تغييرات تم إجراؤها على قاعدة التعليمات البرمجية في فرع منفصل لفرعك الحالي كالتزام جديد.

صيغة الأمر كما يلي:

git merge BRANCH-NAME

على سبيل المثال ، إذا كنت تعمل حاليًا في فرع مسمى devوترغب في دمج أي تغييرات جديدة تم إجراؤها في فرع مسمى new-features، يمكنك إصدار الأمر التالي:

git merge new-features

ملاحظة: إذا كانت هناك أية تغييرات غير ملتزم بها في الفرع الحالي ، فلن يسمح لك Git بالدمج حتى يتم تنفيذ جميع التغييرات في الفرع الحالي. للتعامل مع هذه التغييرات ، يمكنك إما:

إنشاء فرع جديد وتنفيذ التغييرات

git checkout -b new-branch-name git add . git commit -m ""

خبئهم

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

التخلي عن كل التغييرات

git reset --hard # removes all pending changes

Git Rebase

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

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

عندما تعيد تحديد الأساس ، يمكنك نقلها على النحو التالي:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

لإعادة الأساسي ، تأكد من أن لديك جميع الالتزامات التي تريدها في تغيير العنوان الأساسي في الفرع الرئيسي. تحقق من الفرع الذي تريد إعادة تأسيسه واكتبه git rebase master(حيث يكون الرئيسي هو الفرع الذي تريد إعادة تأسيسه).

من الممكن أيضًا إعادة إنشاء قاعدة بيانات على فرع مختلف ، بحيث يتم إعادة تأسيس الفرع الذي كان قائمًا على فرع آخر (دعنا نسميها الميزة) على أساس رئيسي:

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

بعد git rebase master branchأو بعد git rebase masterإتمام عملية الدفع للفرع ، ستحصل على:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git rebase التفاعلية في وحدة التحكم

لاستخدامها git rebaseفي وحدة التحكم مع قائمة الالتزامات ، يمكنك اختيار أو تعديل أو إسقاط تغيير الأساسي:

  • أدخل git rebase -i HEAD~5الرقم الأخير الذي يمثل أي عدد من الالتزامات من أحدث إصدار إلى الوراء تريد مراجعته.
  • في vim ، اضغط على esc، ثم iلبدء تحرير الاختبار.
  • على الجانب الأيسر ، يمكنك الكتابة فوق pickأحد الأوامر أدناه. إذا كنت تريد سحق التزام في التزام سابق وتجاهل رسالة الالتزام ، أدخل fمكان pickالالتزام.
  • حفظ وإنهاء محرر النصوص الخاص بك.
  • عند إيقاف تغيير العنوان الأساسي ، قم بإجراء التعديلات اللازمة ، ثم استخدمها git rebase --continueحتى تنجح عملية تغيير العنوان الأساسي.
  • إذا تمت إعادة التأسيس بنجاح ، فأنت بحاجة إلى فرض دفع التغييرات الخاصة بك git push -fلإضافة الإصدار المعاد تأسيسه إلى المستودع البعيد.
  • إذا كان هناك تعارض في الدمج ، فهناك عدد من الطرق لإصلاح ذلك ، بما في ذلك اتباع الاقتراحات الواردة في هذا الدليل. إحدى الطرق هي فتح الملفات في محرر نصوص وحذف أجزاء الكود التي لا تريدها. ثم استخدم git add متبوعًا بـ git rebase --continue. يمكنك تخطي الالتزام المتعارض عن طريق الدخول git rebase --skip، وإيقاف إعادة التعيين عن طريق التشغيل git rebase --abortفي وحدة التحكم الخاصة بك.
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

دمج التعارضات

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

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

إذا نظرت إلى resumé.txtالملف في محرر التعليمات البرمجية الخاص بك ، يمكنك معرفة مكان حدوث التعارض:

<<<<<<>>>>>> updated_address

أضاف Git بعض الأسطر الإضافية إلى الملف:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

فكر   =======في الخط الفاصل للصراع. كل ما بين <<<<<<< HEADو =======هو محتوى الفرع الحالي الذي يشير إليه المرجع HEAD. من ناحية أخرى ، كل ما بين   =======و >>>>>>> updated_addressهو المحتوى الموجود في الفرع الذي يتم دمجه ، updated_address.

Git Merge مقابل Git Rebase

كلا git mergeو git rebaseهي أوامر مفيدة جدا، واحد هو ليس أفضل من الآخر. ومع ذلك ، هناك بعض الاختلافات المهمة جدًا بين الأمرين التي يجب أن تأخذها أنت وفريقك في الاعتبار.

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

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

هذا كل ما تحتاج إلى معرفته للدمج وإعادة التأسيس مع أفضل ما في 'em.