سؤال

كيف يمكنني الرجوع إلى التزام محدد في git؟

أفضل إجابة يمكن أن يقدمها لي شخص ما هي استخدام git revert X مرات حتى أصل إلى الالتزام المطلوب.

لنفترض أنني أريد العودة مرة أخرى إلى التزام مضى عليه 20 مرة، ويجب أن أقوم بتشغيله 20 مرة.

هل هناك طريقة أسهل لعمل هذا الشيء؟

لا يمكنني استخدام إعادة التعيين لأن هذا المستودع عام.

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

المحلول

جرب هذا:

git checkout [revision] .

أين [revision] هو ارتكاب التجزئة (على سبيل المثال: 12345678901234567890123456789012345678ab).

لا تنسى . في النهاية، مهم جدا. سيؤدي ذلك إلى تطبيق التغييرات في الشجرة بأكملها. يجب عليك تنفيذ هذا الأمر في جذر مشروع GIT. إذا كنت في أي دليل فرعي، فإن هذا الأمر يغير فقط الملفات فقط في الدليل الحالي. ثم ارتكب ويجب أن تكون جيدا.

يمكنك التراجع عن هذا

git reset --hard 

من شأنه أن يحذف جميع التعديلات من دليل العمل ومنطقة التدريج.

نصائح أخرى

لاستعادة الالتزام المحدد:

git reset --hard commit_sha

ل Rollback 10 ارتكب مرة أخرى:

git reset --hard HEAD~10

يمكنك استخدام "GIT REVERT" كما هو الحال في المنشور التالي إذا كنت لا ترغب في إعادة كتابة التاريخ

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

حسنا، أعتقد أن السؤال هو، ماذا تقصد ب "لفة مرة أخرى"؟ إذا كنت لا تستطيع ذلك reset لأنها عامة وتريد الاحتفاظ بسجل الالتزام سليمة، هل تعني أنك تريد فقط نسخة عملك لتعكس الالتزام المحدد؟ يستخدم git checkout والالتزام التجزئة.

تحرير: كما تمت الإشارة إليه في التعليقات، باستخدام git checkout دون تحديد فرع سيغادرك في ولاية "لا فرع". يستخدم git checkout <commit> -b <branchname> لتوقيف في فرع، أو git checkout <commit> . لتوقيف في الفرع الحالي.

ينص الملصق الأصلي:

أفضل إجابة شخص ما يمكن أن تعطيني كان للاستخدام git revert X مرات حتى تصل إلى الالتزام المطلوب.

لذلك دعونا نقول أنني أرغب في العودة إلى الالتزام، كل ذلك بفت ان ارتكب قديم، أود تشغيله 20 مرة.

هل هناك طريقة أسهل لعمل هذا الشيء؟

لا يمكنني استخدام إعادة تعيين سبب هذا الريبو عام.

ليس من الضروري استخدامها git revert X مرات. git revert يمكن أن تقبل مجموعة الالتزام كوسيطة، لذلك تحتاج فقط إلى استخدامه مرة واحدة للعودة مجموعة من ارتكابها. على سبيل المثال، إذا كنت ترغب في العودة إلى آخر 20 يرتكب:

git revert --no-edit HEAD~20..

مجموعة الالتزام HEAD~20.. هو اختصار ل HEAD~20..HEAD, ، يعني "البداية من 20ذ يلتزم الوالد من الرأس، والعودة جميع الالتزام بعد ذلك إلى الرأس ".

من شأنه أن يعود إلى آخر 20 يرتكب، على افتراض أن أيا من تلك التي يتم دمج ارتكابها. إذا كانت هناك ارتكامات دمج، فلن تتمكن من العودة إليهم جميعا في أمر واحد، فستحتاج إلى إعادة تقديمها بشكل فردي

git revert -m 1 <merge-commit>

لاحظ أيضا أنني قمت باختبارها باستخدام نطاق مع git revert باستخدام GIT الإصدار 1.9.0. إذا كنت تستخدم إصدار أقدم من GIT، باستخدام نطاق مع git revert قد تعمل أو لا تعمل.

في هذه الحالة، git revert يفضل أكثر من ذلك git checkout.

لاحظ أنه على عكس هذه الإجابة التي تقول للاستخدام git checkout, git revertسيؤدي في الواقع إلى إزالة أي ملفات تمت إضافتها في أي من يرتكب, ، مما يجعل هذه الطريقة الصحيحة للعودة مجموعة من المراجعات.

توثيق

الخطوة 1: جلب قائمة ارتكاب:

git log

ستحصل على قائمة مثل هذا المثال:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

الخطوة 2: النسخة اللازمة ارتكاب التجزئة ولصقها لسحب:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

هذا كل شئ.

git read-tree -um @ $commit_to_revert_to

سوف تفعل ذلك. انها "بوابة الخروج" ولكن دون تحديث الرأس.

يمكنك تحقيق نفس التأثير مع

git checkout $commit_to_revert_to
git reset --soft @{1}

إذا كنت تفضل التوتير أوامر الراحة معا.

هذه تتركك مع Worktree وفهرسك في الحالة المطلوبة، يمكنك فقط git commit لانهاء.

لست متأكدًا مما تغير، ولكن لا يمكنني التحقق من التزام محدد بدون هذا الخيار --detach.الأمر الكامل الذي نجح بالنسبة لي كان:git checkout --detach [commit hash]

للعودة من الحالة المنفصلة، ​​كان عليّ مراجعة فرعي المحلي: git checkout master

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

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

حسنا، بحيث يرتكبكم يعمل لك. لا مزيد من الخطأ. حددت المشكلة. الآن يمكنك العودة إلى آخر الالتزام:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

وتوقيف ملف معين قبل أن تسبب في الخطأ (في حالتي، استخدم مثال gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

وهذه طريقة واحدة للتعامل مع الأخطاء التي أنشأتها في ارتكابها دون تحقيق الأخطاء حتى وقت لاحق.

هل تريد وضع رأس منفصل؟

إذا كنت ترغب في التراجع X الوقت لالتزام معين مع رأس منفصل (مما يعني أنه لا يمكنك فوضى أي شيء)، فكل الوسائل، استخدم ما يلي:

(استبدل X مع عدد ارتكبك للعودة)

git checkout HEAD~X

أي أن أعود ارتكاب واحد:

git checkout HEAD~1

هنا مثال للقيام بذلك

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .

يمكنك العثور على معرف الالتزام المتعلق بكل الالتزام في قسم يرتكز في Github / Bitbucket / Gitlab. انها بسيطة جدا، لنفترض معرف الالتزام الخاص بك هو 5889575 ثم إذا كنت ترغب في العودة إلى هذا الجزء في التعليمات البرمجية الخاصة بك، فأنت ببساطة تحتاج إلى الكتابة

git checkout 5889575 .

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

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