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




15 Answers

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

$ 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 ، لكنني لم تدفع الالتزام إلى الخادم حتى الآن.

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




استغرق ذلك بعض الوقت لمعرفة ذلك ، لذلك ربما يساعد هذا شخصًا ما ...

هناك طريقتان "للتراجع" عن التزامك الأخير ، اعتمادًا على ما إذا كنت قد قمت بالفعل بإعداد التزامك (تم الدفع إلى مستودع التخزين عن بعد):

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

لنفترض أنني ملتزم محليًا ، ولكني أريد الآن إزالة هذا الالتزام.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

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

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 the changes you made

سيظهر الآن git log أن آخر التزامنا قد تمت إزالته.

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

إذا سبق لك أن نشرت تعهداتك ، فستحتاج إلى إنشاء التزام جديد والذي "سيعيد" التغييرات التي أجريتها على التزامك السابق (الحالي HEAD).

git revert HEAD

ستتم الآن إعادة تغييراتك وتكون جاهزة لك للالتزام:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

لمزيد من المعلومات ، راجع Git Basics - Undoing Things




git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

أو

git reset --hard HEAD~1

تحذير: سيؤدي الأمر أعلاه إلى إزالة التعديلات إلى ملفات .java (وأي ملفات أخرى) التي تريد ارتكابها بشكل دائم.

ستقوم hard reset على HEAD-1 بتعيين نسخة العمل الخاصة بك إلى حالة الالتزام قبل ارتكابك الخاطئ.




استخدم git revert commit-id

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




إذا كان لديك Git Extras مثبتًا ، فيمكنك تشغيل git undo للتراجع عن الالتزام الأخير. سوف التراجع git undo 3 التراجع عن الثلاث مرات الأخيرة.




أنا أفضل استخدام 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 --soft HEAD~1

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

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

أو

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

git revert HEAD

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




على 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 :

git reset --soft HEAD~1

قم بشرح الآتي: ما هي git reset ، إنها تتم reset بشكل أساسي على أي التزام تريد العودة إليه ، ثم إذا --soft مع مفتاح --soft ، --soft إليه ، لكن احتفظ بالتغييرات في ملفك (ملفاتك) ، ستعود إلى المرحلة التي تمت إضافة الملف إليها فقط ، HEAD هو رأس الفرع وإذا قمت بالجمع مع ~1 (في هذه الحالة يمكنك أيضًا استخدام HEAD^ ) ، فسيرجع مرة واحدة فقط إلى ما تريده. ..

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




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

git reflog

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

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

git reset --hard f3cb6e2

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

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

REFLOG FINAL




الجولة الأولى:

git reflog

سوف يعرض لك كل الإجراءات الممكنة التي قمت بها في مستودعك ، على سبيل المثال ، الالتزام ، الدمج ، السحب ، إلخ.

ثم افعل:

git reset --hard ActionIdFromRefLog



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

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

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

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

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

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

git commit --amend -m "message"

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




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

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 rm ثم --amend مع --amend

git rm <pathToFile>

يمكنك أيضًا إزالة أدلة كاملة باستخدام -r أو حتى الدمج مع أوامر Bash الأخرى

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

بعد إزالة الملفات ، يمكنك الالتزام ، مع خيار --amend

git commit --amend -C HEAD # the -C option is to use the same commit message

سيؤدي هذا إلى إعادة كتابة التزامك المحلي حديثًا بإزالة الملفات الإضافية ، لذلك ، لن يتم إرسال هذه الملفات أبدًا على الدُفعة وستتم إزالتها أيضًا من مستودع .git المحلي بواسطة GC.

لقد قمت بالفعل بدفع الالتزام

يمكنك تطبيق نفس الحل الخاص بالسيناريو الآخر ثم القيام git push مع الخيار -f ، ولكن لا يُنصح به لأنه يقوم بالكتابة فوق المحفوظات البعيدة بتغير مختلف (يمكن أن يفسد المستودع الخاص بك).

بدلاً من ذلك ، يجب عليك تنفيذ الالتزام دون - --amend (تذكر ذلك about -amend`: يقوم هذا الخيار بإعادة كتابة السجل في الالتزام الأخير).




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

أمر 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



Related