كيف يمكنني تقسيم ارتكاب غيتوم مدفون في التاريخ؟

StackOverflow https://stackoverflow.com/questions/4307095

سؤال

لقد عثرت على تاريخي وأريد إجراء بعض التغييرات عليها. المشكلة هي أن لديّ التزام بتغييرين غير ذوي صلة ، وهذا الالتزام محاط ببعض التغييرات الأخرى في تاريخي المحلي (غير المحبب).

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

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

المحلول

هناك دليل لتقسيم الالتزامات في 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:

initial log

ثم ضرب r لفتح المنبثقة Rebase

rebase popup

و m لتعديل الالتزام في النقطة.

لاحظ كيف @ هناك الآن على الالتزام الذي تريد الانقسام - وهذا يعني أن الرأس الآن في هذا الالتزام:

modifying a commit

نريد الانتقال إلى الوالد ، لذا انتقل إلى الوالد (47E18B3) وضرب x (magit-reset-quickly, ، ملزمة o إذا كنت تستخدم evil-magit) وادخل لأقول "نعم قصدت الالتزام في نقطة". يجب أن يبدو سجلك الآن مثل:

log after resetting

الآن ، ضرب q للذهاب إلى حالة Magit العادية ، ثم استخدم UNSTAGE العادية u أمر بإلغاء مراحله ما لا يذهب في الالتزام الأول ، والالتزام c الباقي كالمعتاد ، ثم stage و commit ما يدور في الالتزام الثاني ، وعند الانتهاء: ضرب r لفتح المنبثقة Rebase

rebase popup

وآخر r للمتابعة ، وانتهت! ll الآن يظهر:

all done log

لتقسيم الالتزام <commit> وأضف التزام جديد قبل هذا, وحفظ تاريخ المؤلف <commit>, ، - الخطوات التالية:

  1. تحرير الالتزام قبل <commit>

    git rebase -i <commit>^^
    

    NB: ربما ستكون هناك حاجة أيضًا إلى التحرير <commit> كذلك.

  2. اختيار الكرز <commit> في الفهرس

    git cherry-pick -n <commit>
    
  3. إعادة تعيين تغييرات غير ضرورية بشكل تفاعلي من الفهرس وإعادة ضبط شجرة العمل

    git reset -p && git checkout-index -f -a
    

    كبديل ، فقط تخبئ تغييرات غير ضرورية بشكل تفاعلي: git stash push -p -m "tmp other changes"

  4. قم بإجراء تغييرات أخرى (إن وجدت) وإنشاء الالتزام الجديد

    git commit -m "upd something" .
    

    اختياريا ، كرر العناصر 2-4 لإضافة المزيد من الالتزامات الوسيطة.

  5. استمر في التكرار

    git rebase --continue
    

إذا لم تكن قد دفعت بعد ، فما عليك سوى الاستخدام git rebase. أفضل ، استخدام git rebase -i للتحرك يربط بشكل تفاعلي. يمكنك تحريك الالتزام المخالف إلى الأمام ، ثم تقسيمه كما تريد ونقل البقع مرة أخرى (إذا لزم الأمر).

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