كيف يمكن اكتشاف ما إذا كان بوابة ارتكاب هو والد أخرى يرتكب?

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

  •  26-09-2019
  •  | 
  •  

سؤال

أنا أكتب السيناريو الذي يجعل بعض تافهة التغييرات ثم تلزم بوابة.لأن هذه هي تافهة التغييرات ، أريد أن أفعل git commit --amend كلما كنت يمكن أن تحصل بعيدا مع ذلك-على وجه التحديد ، عندما تعدل لن "الفوضى" أي فروع أخرى' التاريخ.إذا كان تعديل سوف تصل الفوضى في فرع آخر, أريد أن أفعل القياسية git commit بدلا من ذلك.

على سبيل المثال ، إذا فروع بدا مثل هذا (على غرار "تصور كل فرع التاريخ" في بوابة GUI):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

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

كيف يمكنني أن أجعل البرنامج النصي تلقائيا الكشف عن ما إذا كان ارتكاب أي تشعب من ذلك ؟

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

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

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

المحلول

فقط تشغيل git branch --contains HEAD للحصول على قائمة من الفروع التي "تحتوي على" هذا الالتزام.إذا كانت القائمة فارغة ، التي ترتكب يجب أن تكون آمنة بالنسبة ammending.قد تحتاج أيضا تشمل -a العلم أن القائمة المحلية والبعيدة الفروع.

بدلا من ذلك, هل يمكن مقارنة الناتج من git rev-parse HEAD مع git merge-base HEAD other-branch.إذا كانت هذه ارتكاب معرفات متطابقة الحالي ارتكاب هو في الآخر-فرع ارتكاب التاريخ.

نصائح أخرى

ارتكاب الرسم البياني اتجاه واحد:نظرا لارتكاب تعرف كل من أجداده ، ولكن ليس أي من الأطفال.عليك أن تبدأ في النهاية التراجع حتى تحصل على ارتكاب(ق) التي تريد.

استخدام git rev-list [some commit] --children (رئيس هو الافتراضي):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

العمود الأيسر قائمة ارتكاب SHA-1 في ترتيب زمني عكسي.أي التي ترتكب في حق الأطفال (--children) من هذا الالتزام.أعلى ارتكاب هو الرأس وبالتالي ليس لديها أطفال.

وهكذا, إذا كنت البقرى الخاص بك SHA-1 في هذه القائمة ومن لديه أي حق ، لديها طفل واحد على الأقل:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

في المثال أعلاه ، لارتكاب 6910... لديها طفل ، ef8a....

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