كيف يمكنني تقسيم ارتكاب غيتوم مدفون في التاريخ؟
-
29-09-2019 - |
سؤال
لقد عثرت على تاريخي وأريد إجراء بعض التغييرات عليها. المشكلة هي أن لديّ التزام بتغييرين غير ذوي صلة ، وهذا الالتزام محاط ببعض التغييرات الأخرى في تاريخي المحلي (غير المحبب).
أرغب في تقسيم هذا الالتزام قبل أن أخرجه ، لكن معظم الأدلة التي أراها لها علاقة بتقسيم أحدث التزامك ، أو التغييرات المحلية غير الملتزمة. هل من الممكن القيام بذلك لالتزام مدفون في التاريخ قليلاً ، دون الحاجة إلى "إعادة" الالتزامات منذ ذلك الحين؟
المحلول
هناك دليل لتقسيم الالتزامات في Manpage Rebase. الملخص السريع هو:
أداء Rebase تفاعلي بما في ذلك الالتزام الهدف (على سبيل المثال
git rebase -i <commit-to-split>^ branch
) وتمييزها ليتم تحريرها.عندما تصل Rebase إلى هذا الالتزام ، استخدم
git reset HEAD^
لإعادة التعيين قبل الالتزام ، ولكن الحفاظ على شجرة عملك سليمة.أضف تغييرات بشكل تدريجي وارتكابها ، مما يجعل العديد من الالتزامات حسب الرغبة.
add -p
يمكن أن يكون مفيدًا لإضافة بعض التغييرات في ملف معين فقط. يستخدمcommit -c ORIG_HEAD
إذا كنت ترغب في إعادة استخدام رسالة الالتزام الأصلية لالتزام معين.إذا كنت ترغب في اختبار ما ترتكبه (فكرة جيدة!) استخدم
git stash
لإخفاء الجزء الذي لم تلتزم به (أوstash --keep-index
قبل أن ترتكبها) ، اختبر ، إذنgit stash pop
لإعادة الباقي إلى شجرة العمل. استمر في الالتزامات حتى تحصل على جميع التعديلات ، أي أن لديك شجرة عمل نظيفة.يجري
git rebase --continue
للمضي قدماً في تطبيق الالتزامات بعد الالتزام بالتقسيم الآن.
نصائح أخرى
إليك كيفية القيام بذلك السحر.
قل الالتزام ed417ae هو الشخص الذي تريد تغييره ؛ أنه يحتوي على تغييرين غير مرتبطين ويتم دفنه تحت واحدة أو أكثر. يضرب ll
لإظهار السجل ، وانتقل إلى ED417AE:
ثم ضرب r
لفتح المنبثقة Rebase
و m
لتعديل الالتزام في النقطة.
لاحظ كيف @
هناك الآن على الالتزام الذي تريد الانقسام - وهذا يعني أن الرأس الآن في هذا الالتزام:
نريد الانتقال إلى الوالد ، لذا انتقل إلى الوالد (47E18B3) وضرب x
(magit-reset-quickly
, ، ملزمة o
إذا كنت تستخدم evil-magit
) وادخل لأقول "نعم قصدت الالتزام في نقطة". يجب أن يبدو سجلك الآن مثل:
الآن ، ضرب q
للذهاب إلى حالة Magit العادية ، ثم استخدم UNSTAGE العادية u
أمر بإلغاء مراحله ما لا يذهب في الالتزام الأول ، والالتزام c
الباقي كالمعتاد ، ثم s
tage و c
ommit ما يدور في الالتزام الثاني ، وعند الانتهاء: ضرب r
لفتح المنبثقة Rebase
وآخر r
للمتابعة ، وانتهت! ll
الآن يظهر:
لتقسيم الالتزام <commit>
وأضف التزام جديد قبل هذا, وحفظ تاريخ المؤلف <commit>
, ، - الخطوات التالية:
تحرير الالتزام قبل
<commit>
git rebase -i <commit>^^
NB: ربما ستكون هناك حاجة أيضًا إلى التحرير
<commit>
كذلك.اختيار الكرز
<commit>
في الفهرسgit cherry-pick -n <commit>
إعادة تعيين تغييرات غير ضرورية بشكل تفاعلي من الفهرس وإعادة ضبط شجرة العمل
git reset -p && git checkout-index -f -a
كبديل ، فقط تخبئ تغييرات غير ضرورية بشكل تفاعلي:
git stash push -p -m "tmp other changes"
قم بإجراء تغييرات أخرى (إن وجدت) وإنشاء الالتزام الجديد
git commit -m "upd something" .
اختياريا ، كرر العناصر 2-4 لإضافة المزيد من الالتزامات الوسيطة.
استمر في التكرار
git rebase --continue
إذا لم تكن قد دفعت بعد ، فما عليك سوى الاستخدام git rebase
. أفضل ، استخدام git rebase -i
للتحرك يربط بشكل تفاعلي. يمكنك تحريك الالتزام المخالف إلى الأمام ، ثم تقسيمه كما تريد ونقل البقع مرة أخرى (إذا لزم الأمر).