التراجع عن التزام معين في git تم دفعه إلى إعادة الديمقراطية عن بُعد
-
22-09-2019 - |
سؤال
ما هي أبسط طريقة للتراجع عن التزام معين هو:
- ليس في الرأس أو الرأس
- تم دفعه إلى جهاز التحكم عن بُعد.
لأنه إذا لم يكن الالتزام الأخير ،
git reset HEAD
لا يعمل. ولأنه تم دفعه إلى جهاز التحكم عن بُعد ،
git rebase -i
و
git rebase --onto
سوف يسبب بعض المشكلات في أجهزة التحكم عن بعد.
أكثر من ذلك ، لا أريد تعديل التاريخ حقًا. إذا كان هناك رمز سيء ، فقد كان هناك في التاريخ ويمكن رؤيته. أنا فقط أريدها في نسخة العمل ، ولا أمانع في الاندماج العكسي.
بمعنى آخر ، ما هو شخص سخيف ما يعادل أوامر SVN التالية:
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
الذي يزيل جميع التغييرات من 295 إلى 302 عن طريق دمج جميع التغييرات في تلك المراجعات ، كالتزام جديد.
svn merge -c -302 ^/trunk
الذي يلفت الانتباه 302 ، بالطبع عن طريق إضافة التزام آخر بأن العكس يدمج التغييرات من هذا الالتزام المعني.
اعتقدت أنها يجب أن تكون عملية بسيطة إلى حد ما في GIT وحالة الاستخدام الشائعة إلى حد ما. ما هو الهدف من الالتزامات الذرية؟
لدينا انطلاق خبأ وكل ذلك لضمان أن تكون الالتزامات ذرية تمامًا ، ألا ينبغي أن تتمكن من التراجع عن واحد أو أكثر من تلك الالتزامات الذرية بسهولة؟
المحلول
تحديد تجزئة الالتزام ، باستخدام git log
, ، ثم استخدام git revert <commit>
لإنشاء التزام جديد يزيل هذه التغييرات. بطريقة، git revert
هو عكس git cherry-pick
- يطبق الأخير التصحيح على فرع يفتقده ، ويقوم الأول بإزالته من فرع يحتوي عليه.
نصائح أخرى
أنا لا أحب اللوح التلقائي ذلك git revert
هل هذا قد يكون مفيدًا للبعض.
إذا كنت تريد فقط الملفات المعدلة وليس اللبلاب التلقائي, ، يمكنك استخدام --no-commit
% git revert --no-commit <commit hash>
وهو نفس -n
% git revert -n <commit hash>
لأنه قد تم دفعه بالفعل ، يجب ألا تعالج التاريخ مباشرة. git revert
سيعود تغييرات محددة من الالتزام باستخدام التزام جديد ، وذلك لعدم معالجة تاريخ الالتزام.