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


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؟ .

Question

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

إذا فعلت 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 reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

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

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

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

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




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

# 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 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 reset --hard <commit_hash>
git push origin <branch_name> --force

المفتاح هنا هو دفع الدفع ، عدم ارتكاب أي رسائل / ارتكاب المزيد




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

git stash
git stash clear

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

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




Try resetting to the desired commit -

git reset <COMMIT_ID>

(to check COMMIT_ID use git log )

This will reset all changed files to un-added state.

Now you can checkout all un-added files by

git checkout .

Check git log to verify your changes.

UPDATE

If you have one and only commit in your repo, try

git update-ref -d HEAD




بعد كل التغييرات ، عند دفع كل هذه الأوامر ، قد تضطر إلى استخدام:

git push -f ...

وليس فقط git push .




العودة إلى الالتزام الأحدث وتجاهل جميع التغييرات المحلية

git reset --hard HEAD



As your commits are pushed remotely, you need to remove them. Let me assume your branch is develop and it is pushed over origin.

You first need to remove develop from origin:

git push origin :develop (note the colon)

Then you need to get develop to the status you want, let me assume the commit hash is EFGHIJK:

git reset --hard EFGHIJK

Lastly, push develop again:

git push origin develop



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

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

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

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

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

git clean -i




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

حلول 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> .




For rollback (or to revert):

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

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

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

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




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

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

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

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




Related