كيف تتراكم من فرع إلى آخر؟
-
21-09-2019 - |
سؤال
لديّ فرعين من سيدي:
- 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
مثال على سير العمل:
يمكننا ان نستخدم 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>