كيفية إرجاع مستودع Git إلى التزام سابق



15 Answers

عودة نسخة العمل إلى الالتزام الأخير

للرجوع إلى التزام سابق ، مع تجاهل أي تغييرات:

git reset --hard HEAD

حيث يرتكز الأخير في الفرع الحالي

عودة نسخة العمل إلى التزام قديم

للرجوع إلى التزام أقدم من الالتزام الأخير:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

تذهب الاعتمادات إلى سؤال مماثل حول Stack Overflow ، رجوع إلى ارتكاب بتجزئة SHA في Git؟ .

git git-checkout git-reset git-revert

كيف أعود من حالتي الحالية إلى لقطة مصنوعة على ارتكاب معين؟

إذا فعلت git log ، git log على الإخراج التالي:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

كيف تعود للالتزام من 3 نوفمبر ، أي ارتكبت 0d1d7fc ؟




أفضل خيار بالنسبة لي وربما الآخر هو خيار إعادة تعيين Git:

git reset --hard <commidId> && git clean -f

لقد كان هذا هو الخيار الأفضل بالنسبة لي! انها بسيطة وسريعة وفعالة!

ملاحظة: كما هو مذكور في التعليقات ، لا تفعل ذلك إذا كنت تشارك فرعك مع أشخاص آخرين لديهم نسخ من الإلتزامات القديمة

أيضا من التعليقات ، إذا كنت تريد طريقة أقل "بالز" يمكنك استخدامها

git clean -i




إذا كنت تريد "إلغاء" ، فقم بمسح آخر رسالة التزام ، ثم أعد وضع الملفات المعدلة في التدريج ، فيمكنك استخدام الأمر:

git reset --soft HEAD~1
  • --soft يشير إلى أنه يجب الاحتفاظ بالملفات غير الملتزم بها كملفات عمل معارضة لـ --hard والتي من شأنها التخلص منها.
  • HEAD~1 هو الالتزام الأخير. إذا كنت تريد التراجع عن الالتزام بـ 3 ، فيمكنك استخدام HEAD~3 . إذا كنت تريد التراجع إلى رقم مراجعة محدد ، فيمكنك أيضًا إجراء ذلك باستخدام تجزئة SHA.

هذا أمر مفيد للغاية في الحالات التي ارتكبت فيها الخطأ وأنت تريد التراجع عن ارتكاب آخر.

المصدر: http://nakkaya.com/2009/09/24/git-delete-last-commit/




يمكنك القيام بذلك بواسطة الأمرين التاليين:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

سيزيل التزام Git السابق.

إذا كنت ترغب في الاحتفاظ بالتغييرات ، فيمكنك أيضًا استخدام:

git reset --soft [previous Commit SHA id here]

ثم سيحفظ تغييراتك.




بدائل اضافية لحلول جيفرومي

حلول Jefromi هي بالتأكيد الأفضل ، ويجب عليك بالتأكيد استخدامها. ومع ذلك ، من أجل اكتمالها ، أردت أيضًا عرض هذه الحلول البديلة الأخرى التي يمكن استخدامها أيضًا في التراجع عن ارتكاب (بمعنى أنك تنشئ التزامًا جديدًا يلغي التغييرات في الالتزام السابق ، تمامًا مثل ما يحدث في git revert ) .

ولكي نكون واضحين ، فإن هذه البدائل ليست هي الطريقة المثلى لعكس الإلتزامات ، حلول Jefromi هي ، لكني فقط أريد أن أشير إلى أنه يمكنك أيضًا استخدام هذه الطرق الأخرى لتحقيق الشيء نفسه مثل git revert .

البديل 1: Resets و Soft Resets

هذا هو نسخة معدلة قليلاً من حل تشارلز بيلي للعودة إلى ارتكاب من قبل التجزئة SHA في جيت؟ :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

هذا يعمل أساسا باستخدام حقيقة أن إعادة تعيين لينة ستترك حالة ارتكاب السابق نظمت في مؤشر / منطقة التدريج ، والتي يمكنك بعد ذلك ارتكاب.

البديل 2: حذف الشجرة الحالية واستبدالها بالواحد الجديد

يأتي هذا الحل من حل svick ل Checkout الالتزام القديم وجعله التزام جديد :

git rm -r .
git checkout <commit> .
git commit

وبالمثل للبديل رقم 1 ، فإن هذا ينتج حالة <commit> في نسخة العمل الحالية. من الضروري إجراء git rm أولاً لأن إلغاء git checkout لن يؤدي إلى إزالة الملفات التي تمت إضافتها منذ <commit> .




حسنا ، العودة إلى الالتزام السابق في بوابة هو سهل جدا ...

العودة مرة أخرى دون الاحتفاظ بالتغييرات:

git reset --hard <commit>

العودة مرة أخرى مع الاحتفاظ بالتغييرات:

git reset --soft <commit>

قم بشرح الآتي: باستخدام git reset ، يمكنك إعادة التعيين إلى حالة معينة ، فمن الشائع استخدامه باستخدام تجزئة الالتزام كما ترى أعلاه.

ولكن كما ترون الفرق هو استخدام العلمين - --soft و - --soft ، افتراضيًا git reset باستخدام - علم --soft ، ولكن من الممارسات الجيدة دائمًا استخدام العلم ، أشرح كل الأعلام:

--ناعم

لا تغيّر العلامة الافتراضية كما هو موضح ، ولا تحتاج إلى توفيرها ، شجرة العمل ، بل تضيف كل ملفات التغييرات الجاهزة للالتزام ، لذا عليك الرجوع إلى حالة الالتزام التي تتغير التغييرات على الملفات دون ضبطها.

--الصعب

كن حذرا مع هذه العلامة ، فإنه يعيد تعيين شجرة العمل وجميع التغييرات التي تم إجراؤها على الملفات المتعقبة وسوف تختفي جميع!

لقد قمت أيضًا بإنشاء الصورة أدناه التي قد تحدث في الحياة الحقيقية باستخدام git:




بافتراض أنك تتحدث عن المعلم وعن الفرع المعني (الذي يقال ، قد يكون هذا أي فرع عمل تهتم به):

# Revert local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Revert remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

لقد وجدت الإجابة من في آخر بلوق حذف عن بعد Git ريبو إلى ارتكاب محدد .




هناك أمر (ليس جزءًا من Git الأساسي ، ولكنه موجود في حزمة git-extras ) على وجه التحديد للتراجع والقيام بالالتزامات القديمة:

git back

لكل صفحة رجل ، يمكن أيضا أن تستخدم على هذا النحو:

# Remove the latest three commits
git back 3



يمكنك إكمال كل هذه الخطوات الأولية بنفسك والرجوع إلى git repo.

  1. اسحب أحدث إصدار من مستودع التخزين الخاص بك من Bitbucket باستخدام git pull --allالأمر.

  2. قم بتشغيل الأمر git log بـ -n 4 من الجهاز الخاص بك. الرقم بعد تحديد -n عدد الإلتزامات في السجل بدءًا من أحدث التزام في السجل المحلي.

    $ git log -n 4

  3. إعادة تعيين سجل محفوظات المستودع الخاص بك باستخدام git reset --hard HEAD~Nمكان N هو عدد الإلتزامات التي تريد إعادة الرأس إليها. في المثال التالي ، سيتم تعيين الرأس مرة أخرى إلى التزام واحد ، إلى آخر التزام في محفوظات المخزون:

  4. ادفع التغيير إلى git repo باستخدام git push --forceلفرض دفع التغيير.

إذا كنت تريد git repository إلى التزام سابق

git pull --all
git reset --hard HEAD~1
git push --force



للاحتفاظ بالتغييرات من الالتزام السابق إلى HEAD والانتقال إلى الالتزام السابق ، قم بما يلي:

git reset <SHA>

إذا لم تكن التغييرات مطلوبة من الالتزام السابق إلى HEAD وتجاهل جميع التغييرات فقط ، فنفذ ما يلي:

git reset --hard <SHA>



هذه طريقة أخرى لإعادة التعيين مباشرةً إلى التزام حديث

git stash
git stash clear

أنه يمسح مباشرة جميع التغييرات التي قمت بها منذ ارتكاب الماضي.

ملاحظة: لديها مشكلة صغيرة. كما أنه يحذف جميع التغييرات التي خبّنتها مؤخرًا. الذي أعتقد أنه في معظم الحالات لا ينبغي أن يهم.




الرجوع هو أمر التراجع عن الالتزام.

git revert <commit1> <commit2> 

عينة:

git revert 2h3h23233

إنه قادر على أخذ نطاق من الرأس مثل أدناه. هنا 1 يقول "تعود آخر التزام".

git revert HEAD~1..HEAD

ثم افعل git push




حاول إعادة تعيين الالتزام المرغوب -

git reset <COMMIT_ID>

(للتحقق من استخدام COMMIT_ID git log)

سيؤدي ذلك إلى إعادة تعيين جميع الملفات التي تم تغييرها إلى حالة غير مضافة.

الآن يمكنك checkoutجميع الملفات غير المضافة من قبل

git checkout .

تحقق git logللتحقق من تغييراتك.

تحديث

إذا كان لديك واحد وتلتزم فقط في الريبو الخاص بك ، حاول

git update-ref -d HEAD




إذا كنت تريد تصحيح بعض الأخطاء في الالتزام الأخير ، فسيكون استخدام بديل git commit --amend أمرًا بديلاً جيدًا . إذا لم يتم الإشارة إلى الالتزام الأخير من خلال أي مرجع ، فسيؤدي ذلك إلى الخدعة ، لأنه ينشئ التزامًا مع نفس الوالد مثل الالتزام الأخير. إذا لم يكن هناك إشارة إلى الالتزام الأخير ، فسيتم إهماله ببساطة وسيكون هذا الالتزام هو الالتزام الأخير. هذه طريقة جيدة لتصحيح الالتزامات دون الرجوع عن التماس. ومع ذلك فقد حدودها الخاصة.




للرجوع (أو العودة):

  1. git revert --no-commit "commit-code-to-remove" HEAD (على سبيل المثال git revert --no-commit d57a39d HEAD)
  2. ارتكاب
  3. دفعة غيت

حاول أعلاه خطوتين ، وإذا وجدت هذا هو ما تريد ثم دفع git.

إذا وجدت خطأ ما:

العودة git - أبورت




Related