سؤال

لديّ فرعين من سيدي:

  • v2.1: (الإصدار 2) لقد كنت أعمل لعدة أشهر
  • WSS: أنشأت أمس لإضافة ميزة واحدة محددة إلى ماجستير (في الإنتاج)

هل هناك طريقة لنسخ الالتزامات بالأمس من WSS إلى v2.1؟

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

المحلول

يجب أن يكون لديك بالفعل سير عمل يتيح لك القيام بذلك من خلال الاندماج:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

لذلك كل ما عليك فعله هو git checkout v2.1 و git merge wss. إذا لم تتمكن من فعل ذلك لسبب ما ، ولا يمكنك استخدامه جيت ريباس لنقل فرع WSS الخاص بك إلى المكان الصحيح ، فإن الأمر للاستيلاء على التزام واحد من مكان ما وتطبيقه في مكان آخر جيت الكرز-باخ. فقط تحقق من الفرع الذي تريد تطبيقه عليه ، وتشغيله git cherry-pick <SHA of commit to cherry-pick>.

بعض الطرق التي قد يوفرها لك Rebase:

إذا كان تاريخك يبدو هكذا:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

يمكنك استخدام git rebase --onto v2 v2-only wss لنقل WSS مباشرة إلى V2:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

ثم يمكنك الاندماج! إذا كنت حقا ، حقا ، هل حقا لا يمكنك الوصول إلى النقطة التي يمكنك من خلالها الاندماج ، فلا يزال بإمكانك استخدام Rebase للقيام بفعالية في العديد من نقاط الكرز في وقت واحد:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

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

نصائح أخرى

يستخدم

git cherry-pick <commit>

للتقديم <commit> لك الفرع الحالي.

أنا شخصياً ربما أتحقق من الالتزامات التي أختارها gitk واختيارهم مع النقرات اليمنى عند دخول الالتزام هناك بدلاً من ذلك.


إذا كنت ترغب في الذهاب أكثر تلقائية (مع كل مخاطرها) وافتراض كل الالتزامات منذ أن حدث بالأمس على WSS ، يمكنك إنشاء قائمة الالتزامات باستخدام git log مع (--pretty اقترحه Jefromi)

git log --reverse --since=yesterday --pretty=%H

لذلك كل شيء معًا على افتراض أنك تستخدم bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

إذا حدث خطأ ما هنا (هناك الكثير من الإمكانات) ، فأنت في ورطة لأن هذا يعمل على الخروج المباشر ، لذلك إما أن تقوم بالرباط اليدوي أو تستخدم Rebase كما اقترح Jefromi.

git cherry-pick : تطبيق التغييرات التي قدمتها بعض الالتزامات الحالية

افترض أن لدينا فرع أ مع (x ، y ، z) يرتكب. نحن بحاجة إلى إضافة هذه الالتزامات إلى فرع ب. سوف نستخدم cherry-pick عمليات.

عندما نستخدم cherry-pick, ، يجب أن نضيف الالتزامات على الفرع ب بنفس الترتيب الزمني الذي تظهر فيه الالتزامات في الفرع أ.

يدعم Cherry-Pick مجموعة من الالتزام

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

مثال على سير العمل:

enter image description here

يمكننا ان نستخدم cherry-pick مع والخيارات

-أ أو -edit : مع هذا الخيار ، سيتيح لك Git Cherry-Pick تعديل رسالة الالتزام قبل الالتزام.

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

هنا مثيرة للاهتمام مقالة - سلعة بخصوص cherry-pick.

يمكنك إنشاء تصحيح من الالتزامات التي تريد نسخها و ضع التصحيح إلى فرع الوجهة.

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

git branch deploy deploy_template
git checkout deploy
git rebase master

سيؤدي ذلك إلى إنشاء نشر فرع جديد (أستخدم -f للكتابة فوق فرع النشر الحالي) على Deploy_Template ، ثم Rebase هذا الفرع الجديد على Master ، تاركًا Deploy_Template دون أن تمسه.

بالنسبة للحالة البسيطة المتمثلة في نسخ آخر الالتزام من WSS الفرع إلى v2.1 ، يمكنك ببساطة الاستيلاء على معرف الالتزام (git log --oneline | head -n 1) وافعل:

git checkout v2.1
git merge <commit>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top