كيف يمكنني التراجع عن آخر الإلتزامات في Git؟




git-commit git-reset (20)

أنا ارتكبت بطريق الخطأ ملفات خاطئة إلى Git ، لكنني لم تدفع الالتزام إلى الخادم حتى الآن.

كيف يمكنني التراجع عن هذه الالتزامات من المستودع المحلي؟


التراجع عن الالتزام الأخير:

git reset --soft HEAD^ أو git reset --soft HEAD~

سيؤدي هذا إلى التراجع عن الالتزام الأخير.

هنا - --soft يعني إعادة --soft إلى التدريج.

HEAD~ أو HEAD^ يعني الانتقال إلى الالتزام قبل HEAD.

استبدال آخر الالتزام بالتزام جديد:

git commit --amend -m "message"

ستحل محل آخر ارتكاب مع الالتزام الجديد.


كيفية إصلاح الالتزام المحلي السابق

استخدم git-gui (أو ما شابه) لتنفيذ git commit --amend . من واجهة المستخدم الرسومية يمكنك إضافة أو إزالة الملفات الفردية من الالتزام. يمكنك أيضًا تعديل رسالة الالتزام.

كيفية التراجع عن الالتزام المحلي السابق

فقط قم بإعادة تعيين الفرع الخاص بك إلى الموقع السابق (على سبيل المثال ، باستخدام gitk أو git rebase ). ثم أعد تطبيق التغييرات من نسخة محفوظة. بعد جمع القمامة في المستودع المحلي الخاص بك ، سيكون الأمر كما لو أن الالتزام غير المرغوب فيه لم يحدث أبدًا. للقيام بكل ذلك في أمر واحد ، استخدم git reset HEAD~1 .

كلمة تحذير : استخدام الإهمال من git reset هو وسيلة جيدة للحصول على نسخة العمل الخاصة بك في حالة مربكة. أوصي بأن يتجنب Git المبتدئين هذا إذا كان بإمكانهم ذلك.

كيفية التراجع عن التزام العامة

إجراء اختيار الكرز العكسي ( git-revert ) للتراجع عن التغييرات.

إذا لم تكن قد سحبت تغييرات أخرى على فرعك ، فيمكنك القيام بذلك ببساطة ...

git revert --no-edit HEAD

ثم ادفع الفرع المحدث الخاص بك إلى المستودع المشترك.

سيعرض سجل الالتزام كلا الالتزامين ، بشكل منفصل .

متقدم: تصحيح الفرع الخاص في المستودع العام

هذا يمكن أن يكون خطيرًا - تأكد من حصولك على نسخة محلية من الفرع للتوثيق.

لاحظ أيضًا: لا تريد القيام بذلك إذا كان شخص آخر قد يعمل على الفرع.

git push --delete (branch_name) ## remove public version of branch

تنظيف الفرع الخاص بك محليا ثم repush ...

git push origin (branch_name)

في الحالة العادية ، ربما لا داعي للقلق بشأن تاريخ ارتكاب فرعك الخاص. ما عليك سوى الضغط على الالتزام بالمتابعة (راجع "كيفية التراجع عن التزام عام" أعلاه) ، وبعد ذلك ، قم بعمل squash-merge لإخفاء السجل.


التراجع عن الالتزام والإعادة

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. هذا ما تريد التراجع عنه
  2. هذا يترك شجرة العمل الخاصة بك (حالة ملفاتك على القرص) دون تغيير ، لكنه يلغي التوليف ويترك التغييرات التي قمت بتجميعها بدون ترتيب (لذا ستظهر على أنها "تغييرات لم تتم إرساؤها للالتزام" في git status ، وستحتاج إلى إضافتها مرة أخرى قبل الالتزام). إذا كنت تريد فقط إضافة المزيد من التغييرات على الالتزام السابق ، أو تغيير الرسالة التزام 1 ، يمكنك استخدام git reset --soft HEAD~ بدلاً من ذلك ، وهو مثل git reset HEAD~ (حيث HEAD~ هو نفس HEAD~1 ) ولكن يترك التغييرات الحالية الخاصة بك على مراحل.
  3. عمل تصحيحات لملفات شجرة العمل.
  4. git add أي شيء تريد تضمينه في التزامك الجديد.
  5. قم بإدخال التغييرات ، وإعادة استخدام رسالة الالتزام القديمة. reset نسخ الرأس القديم إلى .git/ORIG_HEAD ؛ commit بـ -c ORIG_HEAD سيفتح محررًا ، والذي يحتوي في البداية على رسالة السجل من الالتزام القديم ويسمح لك بتحريره. إذا لم تكن بحاجة إلى تحرير الرسالة ، فيمكنك استخدام الخيار -C .

ولكن احذر من أنك إذا أضفت أي تغييرات جديدة إلى الفهرس ، فإن استخدام commit --amend إلى commit --amend السابق.

إذا تم دفع الرمز بالفعل إلى الخادم الخاص بك وكان لديك أذونات الكتابة فوق السجل (rebase) ، ثم:

git push origin master --force

يمكنك أيضًا الاطلاع على هذه الإجابة:

كيفية نقل HEAD العودة إلى موقع سابق؟ (رأس منفصل)

سوف تظهر لك الإجابة المذكورة أعلاه git reflog والذي يستخدم لمعرفة ما هو SHA-1 الذي ترغب في الرجوع إليه. بمجرد العثور على النقطة التي ترغب في التراجع عن استخدام تسلسل الأوامر كما هو موضح أعلاه.

1 لاحظ ، مع ذلك ، أنك لست بحاجة إلى إعادة التعيين إلى التزام سابق إذا كنت قد ارتكبت خطأً في رسالة الالتزام . الخيار الأسهل هو git reset (لإحداث أي تغييرات قمت بها منذ ذلك الحين) ثم git commit --amend ، والذي سيفتح محرر رسالة الالتزام الافتراضي الخاص بك الذي تم git commit --amend مسبقًا برسالة الالتزام الأخيرة.


"إعادة تعيين شجرة العمل إلى الالتزام الأخير"

git reset --hard HEAD^ 

"ملفات غير معروفة نظيفة من شجرة العمل"

git clean    

انظر - Git المرجع السريع

ملاحظة: سيحذف هذا الأمر التزامك السابق ، لذا استخدمه بحذر! git reset --hard - أكثر أمانًا -


أمر واحد:

git reset --soft 'HEAD^' 

إنه يعمل بشكل رائع للتراجع عن الالتزام المحلي الأخير!


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

اختر عدد الإلتزامات التي تريد إدراجها ، ثم استدعِ مثل هذا (لإدراج آخر ثلاثة)

git rebase -i HEAD~3

قائمة عينة

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

بعد ذلك ، ستزيل git الإلتزامات لأي سطر تزيله.


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

git reset --hard HEAD^1

(سيتجاهل هذا الأمر التزامك بالكامل وسيتم فقد التغييرات بالكامل من شجرة العمل المحلية). إذا كنت تريد التراجع عن التزامك ، لكنك تريد التغييرات الخاصة بك في منطقة التدريج (قبل الالتزام فقط بعد git add ) ، git add بإجراء الأمر التالي.

git reset --soft HEAD^1

الآن أصبحت ملفاتك الملتزمة في منطقة التدريج. لنفترض أنك تريد إزالة الملفات ، لأنك تحتاج إلى تعديل بعض المحتويات الخاطئة ، ثم قم بتنفيذ الأمر التالي

git reset HEAD

الآن ملفات ملتزمة قادمة من المنطقة المرحلي إلى المنطقة غير النظامية. الآن الملفات جاهزة للتحرير ، لذا مهما تغيرت ، فأنت تريد أن تذهب للتعديل وتضيفه وتقوم بعمل التزام جديد / جديد.

More


إذا كنت ترغب في التراجع عن ذلك بشكل دائم وكنت قد استنسخت بعض المستودع

يمكن رؤية معرف الالتزام

git log 

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

git reset --hard <commit_id>

git push origin <branch_name> -f

إذا كنت قد ارتكبت غير المرغوب فيه ولكن لم يتم دفعه ،

git reset --soft HEAD~1

الرأس ~ 1 هو اختصار للالتزام قبل الرأس. بدلاً من ذلك ، يمكنك الرجوع إلى SHA-1 من التجزئة إذا كنت ترغب في إعادة التعيين. - الخيار - سوفت سيحذف الالتزام لكنه سيترك جميع الملفات التي تم تغييرها "التغييرات التي يجب الالتزام بها" ، حيث ستضعها حالة git.

إذا كنت تريد التخلص من أي تغييرات على الملفات المتعقبة في شجرة العمل لأن الالتزام قبل استخدام الرأس " --hard " بدلاً من ذلك.

أو

إذا كنت قد دفعت بالفعل وسحب شخص ما وهو عادة حالتي ، فلا يمكنك استخدام git reset . ومع ذلك ، يمكنك إجراء إعادة git ،

git revert HEAD

سيؤدي هذا إلى إنشاء التزام جديد يعكس كل شيء تم تقديمه بواسطة الالتزام العرضي.


إضافة / إزالة الملفات للحصول على الأشياء بالطريقة التي تريدها:

git rm classdir
git add sourcedir

ثم تعديل الالتزام:

git commit --amend

سيتم تعديل الالتزام السابق الخاطئ ليعكس حالة الفهرس الجديدة - بعبارة أخرى ، سيكون الأمر كما لو أنك لم ترتكب الخطأ أبداً في المقام الأول.

لاحظ أنه يجب عليك القيام بذلك فقط إذا لم تقم بالدفع بعد. إذا كنت قد دفعت ، فسوف يكون عليك فقط أن تلتزم الإصلاح بشكل طبيعي.


استخدم git revert commit-id

للحصول على معرف الالتزام ، استخدم git log فقط


استخدم reflog للعثور على الحالة الصحيحة

git reflog

رجوع قبل إعادة تعيين

حدد reflog الصحيح (f3cb6e2 في حالتي) ونوع

git reset --hard f3cb6e2

بعد ذلك سيتم إعادة تعيين الريبو إلى HEADid سجل بعد إعادة الضبط

وأخيرا يبدو أن الرفض هو الصورة أدناه

REFLOG FINAL


اكتب git log وابحث عن آخر رمز تجزئة للالتزام ثم أدخل:

git reset <the previous co>

التراجع عن ارتكاب أمر مخيف قليلاً إذا كنت لا تعرف كيف يعمل. ولكن من السهل بشكل مثير للدهشة إذا فهمت.

لنفترض أن لديك هذا ، حيث C هو HEAD و (F) هي حالة ملفاتك.

   (F)
A-B-C
    ↑
  master

أنت تريد أن ترتكب الجريمة (ج) ولا تراه مرة أخرى . تفعل هذا:

git reset --hard HEAD~1

النتيجه هي:

 (F)
A-B
  ↑
master

الآن B هو الرأس. نظرًا لأنك استخدمت --hard ، تتم إعادة تعيين ملفاتك إلى حالتها في ارتكاب الخطأ B.

آه ، لكن لنفترض أن ارتكاب C لم يكن كارثة ، ولكن كان هناك بعض الشيء. أنت تريد التراجع عن الالتزام ، لكن احتفظ بالتغييرات الخاصة بك لبعض التعديلات قبل القيام بتفويض أفضل. البدء من جديد من هنا ، مع C كـ HEAD:

   (F)
A-B-C
    ↑
  master

يمكنك القيام بذلك ، ترك قبالة --hard :

git reset HEAD~1

في هذه الحالة ، تكون النتيجة:

   (F)
A-B-C
  ↑
master

في كلتا الحالتين ، يعد HEAD مجرد مؤشر إلى أحدث التزام. عندما تقوم بإجراء git reset HEAD~1 ، فأنت تخبر Git لتحريك المؤشر HEAD مرة أخرى مرة واحدة. ولكن (ما لم تستخدم - --hard ) تترك ملفاتك كما كانت. حتى الآن تظهر git status التغييرات التي قمت بتسجيلها في C. لم تفقد أي شيء!

للحصول على أخف لمسة ، يمكنك التراجع عن التزامك مع ترك ملفاتك index :

git reset --soft HEAD~1

هذا لا يترك ملفاتك بمفردها ، بل إنه يترك المؤشر وحده. عندما تقوم git status ، سترى أن الملفات نفسها موجودة في الفهرس كما كان من قبل. في الواقع ، بعد هذا الأمر مباشرة ، يمكنك القيام به في git commit وسوف تكون إعادة نفس الالتزام الذي قمت به للتو.

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

كلا ، لا يزال هناك طريقة لاستعادتها. اكتب git reflog (جزئي) الالتزام التي قمت git reflog . ابحث عن الالتزام الذي قمت بتدميره وقم بذلك:

git checkout -b someNewBranchName shaYouDestroyed

لقد قمت الآن بإحياء هذا الالتزام. في الواقع ، لا يتم القضاء على الالتزام في Git لمدة 90 يومًا ، لذا يمكنك عادةً الرجوع لإنقاذ شخص ما لا يعني التخلص منه.


طريق اخر:

تحقق من الفرع الذي تريد العودة إليه ، ثم أعد تعيين نسخة العمل المحلية الخاصة بك مرة أخرى إلى الالتزام الذي تريد أن يكون أحدث نسخة على الخادم البعيد (كل شيء بعد ذلك سيذهب وداعًا). للقيام بذلك ، في SourceTree I بالنقر بزر الفأرة الأيمن على "إعادة تعيين BRANCHNAME لهذا الالتزام" وتحديدها.

ثم انتقل إلى الدليل المحلي لمستودع التخزين الخاص بك وقم بتشغيل هذا الأمر:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

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


على SourceTree (واجهة المستخدم الرسومية لـ GitHub) ، يمكنك النقر بزر الماوس الأيمن فوق الالتزام والقيام "بالغاء العكسي". يجب أن يؤدي ذلك إلى التراجع عن تغييراتك.

على المحطة:

يمكنك استخدام بدلاً من ذلك:

git revert

أو:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

في حالتي ارتكبت بطريق الخطأ بعض الملفات لم أكن أريد أن. لذلك فعلت ما يلي وعملت:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

تحقق من النتائج باستخدام gitk أو git log --stat


هناك العديد من الطرق للقيام بذلك:

أمر Git للتراجع عن الالتزام الأخير / الالتزام السابق:

تحذير: لا تستخدم - إذا لم تكن تعرف ما تفعله. - إن الخطير شديد الخطورة ، وقد يحذف ملفاتك.

الأمر الأساسي لإعادة الالتزام في Git هو:

$ git reset --hard <COMMIT -ID>

أو

$ git reset --hard HEAD~<n>

COMMIT-ID : معرف الالتزام

n: عدد مرات الالتزام الأخيرة التي تريد التراجع عنها

يمكنك الحصول على معرف الالتزام كما هو موضح أدناه:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

حيث تلتزم d81d3f1 و be20eb8 .

الآن دعونا نرى بعض الحالات:

لنفترض أنك تريد التراجع عن الالتزام الأخير "d81d3f1". فيما يلي خياران:

$ git reset --hard d81d3f1

أو

$ git reset --hard HEAD~1

لنفترض أنك تريد التراجع عن الالتزام 'be20eb8':

$ git reset --hard be20eb8

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

$ git reset --help

كيفية التراجع عن Git الأخيرة تلتزم؟

لاستعادة كل شيء إلى ما كان عليه قبل الالتزام الأخير ، نحتاج إلى إعادة التعيين على الالتزام قبل HEAD.

  1. إذا كنت لا ترغب في الاحتفاظ بالتغييرات التي قمت بها:

    git reset --hard HEAD^
    
  2. إذا كنت ترغب في الاحتفاظ بالتغييرات الخاصة بك:

    git reset --soft HEAD^
    

تحقق الآن من سجل git الخاص بك. وسوف تظهر أن التزامنا الأخير قد أزيل.


لإعادة التعيين إلى النسخة السابقة ، قم بحذف جميع التغييرات غير الملتزم بها نهائيًا:

git reset --soft HEAD~ 




git-revert