سؤال

لقد واجهت مشكلة صغيرة هنا:كان لدي فرع مشكلة محددة 28s في جيت، أنني اندمجت في العام develop فرع.اتضح أنني قمت بذلك بسرعة كبيرة، لذا استخدمت git-revert للتراجع عن عملية الدمج.ولكن الآن حان الوقت للاندماج 28s داخل develop, ، لكن أمر git-merge يرى الدمج الأصلي، ويعلن بسعادة أن كل شيء على ما يرام وأن الفروع قد تم دمجها بالفعل.ماذا أفعل الآن؟هل تريد إنشاء التزام "إرجاع" إرجاع "28 ثانية -> تطوير""؟لا يبدو أنها طريقة جيدة للقيام بذلك، لكن لا أستطيع أن أتخيل أي طريقة أخرى في الوقت الحالي.

كيف يبدو هيكل الشجرة:

Git log output

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

المحلول

يجب عليك "الرجوع إلى الوراء".يعتمد الأمر على كيفية إرجاع ذلك، فقد لا يكون الأمر سهلاً كما يبدو.انظر الى وثيقة رسمية حول هذا الموضوع.

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

لكى يسمح:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

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

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

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

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

نعم ، الأمر أكثر تعقيدا ، ولا ، لن ينجح دائما (في بعض الأحيان الجواب هو:"عفوا ، لم يكن علي حقا دمجها ، لأنها لم تكن كذلك جاهز حتى الآن ، وأحتاج حقا إلى التراجع الجميع من الدمج").إذن أنت حقا يجب أن تعيد الدمج ، ولكن عندما تريد إعادة الدمج ، فأنت الآن بحاجة إلى القيام بذلك عن طريق التراجع عن العودة.

نصائح أخرى

لنفترض لديك مثل هذا التاريخ

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

وأين A، B فشل يرتكب وW - وتعود من M

وحتى قبل أن تبدأ في تحديد المشاكل وجدت أنني لا الكرز اختيار من W تلتزم فرع بلدي

git cherry-pick -x W

وبعد ذلك I تعود W ارتكاب على فرع بلدي

git revert W 

وبعد أن يمكن أن تستمر نتائج المباريات.

والتاريخ النهائي قد تبدو:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

عند أبعث PR أنه سوف يظهر بوضوح أن العلاقات العامة هي التراجع تعود ويضيف بعض يرتكب جديدة.

للعودة إلى الوضع السابق دون إفساد سير العمل كثيرًا:

  • قم بإنشاء نسخة مهملات محلية من تطوير
  • التراجع عن التزام العودة على النسخة المحلية من التطوير
  • قم بدمج تلك النسخة في فرع الميزات الخاص بك، وادفع فرع الميزات الخاص بك إلى خادم git الخاص بك.

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

لتعود وتعود في GIT:

git revert <commit-hash-of-previous-revert>

بدلا من استخدام git-revert كان بإمكانك استخدام هذا الأمر في devel فرع ل رمى (التراجع عن) التزام الدمج الخاطئ (بدلاً من التراجع عنه فقط).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

سيؤدي هذا أيضًا إلى ضبط محتويات دليل العمل وفقًا لذلك. احرص:

  • احفظ تغييراتك في فرع التطوير (منذ الدمج الخاطئ) لأنهم أيضا سيتم محوها من قبل git-reset.يتم تنفيذ جميع الالتزامات بعد الالتزام الذي تحدده ك ال git reset سوف تختفي الحجة!
  • أيضا ، لا تفعل ذلك إذا تم سحب التغييرات الخاصة بك بالفعل من مستودعات أخرى لأن إعادة التعيين ستعيد كتابة المحفوظات.

أنصح بدراسة git-reset man-page بعناية قبل تجربة ذلك.

الآن، بعد إعادة التعيين، يمكنك إعادة تطبيق تغييراتك devel ومن ثم القيام به

git checkout devel
git merge 28s

سيكون هذا اندماجًا حقيقيًا من 28s داخل devel مثل الأولي (وهو الآن تم محوها من تاريخ Git).

ولقد وجدت هذه الوظيفة عندما يواجه نفس المشكلة. أجد فوق wayyy إلى مخيف للقيام صلابة إعادة تعيين الخ سوف ينتهي حذف شيء أنا لا أريد أن، ولن تكون قادرة على الحصول على إعادته.

وبدلا من ذلك راجعت في ارتكاب أردت فرع العودة إلى مثل git checkout 123466t7632723. ثم تحويلها إلى git checkout my-new-branch فرع. I ثم حذف فرع لم أكن أريد أكثر من ذلك. طبعا هذا لن ينجح الا اذا كنت قادرا على رمي بعيدا الفرع الذي افسدت.

وأود أن أقترح عليك اتباع الخطوات التالية للعودة لتعود، ويقول SHA1.

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

والآن إنشاء العلاقات العامة لusers/yourname/revertOfSHA1 فرع

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

عند هذه النقطة، سيكون لديك فرع "تطوير" نظيف يمكنك دمج فرع الميزات الخاص بك فيه كما تفعل بانتظام.

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