it-swarm.asia

كيف يمكنني التراجع عن أحدث عمليات ارتكابها في جيت؟

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

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

19555
Hamza Yerlikaya

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

$ 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 سيضيفها إلى التزامك السابق.

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

git Push Origin master --force

يمكنك أيضًا إلقاء نظرة على هذه الإجابة:

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

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


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

21138
Esko Luontola

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

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

   (F)
A-B-C
    ↑
  master

تريد التزام نووي C وعدم رؤيته مرة أخرى . أنت تفعل هذا:

git reset --hard HEAD~1

النتيجه هي:

 (F)
A-B
  ↑
master

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

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

   (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. لم تفقد أي شيء!

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

git reset --soft HEAD~1

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

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

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

git checkout -b someNewBranchName shaYouDestroyed

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

10245
Ryan Lundy

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

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

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

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

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 ستظهر أنه تمت إزالة التزامنا الأخير.

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

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

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 - تراجع الأشياء

1951
Andrew

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

git rm classdir
git add sourcedir

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

git commit --amend

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

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

1680
bdonlan
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 بتعيين نسخة العمل الخاصة بك إلى حالة الالتزام قبل الالتزام الخاطئ.

948
Lennart Koopmann

لتغيير الالتزام الأخير

استبدال الملفات في الفهرس:

git rm --cached *.class
git add *.Java

ثم ، إذا كان فرعًا خاصًا ، تعديل الالتزام:

git commit --amend

أو ، إذا كان فرعًا مشتركًا ، فقم بتقديم التزام جديد:

git commit -m 'Replace .class files with .Java files'


(لتغيير التزام سابق ، استخدم rebase رهيبة تفاعلية )


ProTip ™: أضف *.class إلى gitignore لإيقاف هذا الحدوث مرة أخرى.


للعودة التزاما

يعد تعديل الالتزام هو الحل الأمثل إذا كنت بحاجة إلى تغيير الالتزام الأخير ، ولكن الحل العام هو reset.

يمكنك إعادة تعيين git على أي التزام باستخدام:

git reset @~N

حيث N هو عدد مرات التعيين قبل HEAD ، و @~ يعاد ضبطها على الالتزام السابق.

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

git reset @~
git add *.Java
git commit -m "Add .Java files"

تحقق من git help reset ، وتحديداً الأقسام الموجودة على --soft--mixed و --hard ، لفهم أفضل لما يفعله هذا.

Reflog

إذا قمت بفوضى ، فيمكنك دائمًا استخدام إعادة التسجيل للعثور على الإجازات المنسدلة:

$ git reset @~
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~
2c52489 [email protected]{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


722
Zaz

استخدم git revert <commit-id>

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

606
Jaco Pretorius

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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

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

أكثر من

488
Madhan Ayyasamy

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

463
nickf

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

Prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
Prompt> git Push Origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
Prompt>
431
neoneye

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

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

git rebase -i HEAD~3

قائمة العينة

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

بعد ذلك سوف يزيل Git التعهدات لأي خط تزيله.

411
Steven Penny

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

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

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

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

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

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

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

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

git revert --no-edit HEAD

ثم ادفع فرعك المحدث إلى مستودع التخزين المشترك.

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


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

هذا يمكن أن يكون خطيرًا - تأكد من أن لديك نسخة محلية من الفرع لإعادة تهيئته.

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

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

تنظيف فرعك محليا ثم إعادة إعداد ...

git Push Origin (branch_name)

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

396
nobar

إذا كنت قد ارتكبت خردة ولكن لم تدفع ،

git reset --soft HEAD~1

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

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

OR

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

git revert HEAD

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

318
santos_mgr

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

يمكن رؤية معرف الالتزام بواسطة

git log 

ثم يمكنك أن تفعل -

git reset --hard <commit_id>

git Push Origin <branch_name> -f
314
poorva

في 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.
266
Varun Parakh

أمر واحد:

git reset --soft 'HEAD^' 

إنه عمل رائع للتراجع عن آخر التزام محلي!

249
Manish Shrivastava

ما عليك سوى إعادة تعيينها باستخدام الأمر أدناه باستخدام git:

git reset --soft HEAD~1

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

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

 How to undo the last commits in Git?

238
Alireza

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

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

  1. إذا كنت لا تريد الاحتفاظ بالتغييرات التي أجريتها:

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

    git reset --soft HEAD^
    

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

220
Ranjithkumar Ravi

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

git reflog

reflog before REFLOG قبل إعادة الضبط

حدد إعادة التسجيل الصحيحة (f3cb6e2 في حالتي) واكتب

git reset --hard f3cb6e2

بعد ذلك ، سيتم إعادة تعيين الريبو HEAD إلى ذلك العنوان reset effect سجل بعد إعادة تعيين

أخيرًا ، يشبه reflog الصورة أدناه

reflog after نهائي REFLOG

178
Shubham Chaudhary

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

git reset --hard HEAD^ 

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

git clean    

راجع - Git Quick Reference

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

171
Ravi_Parmar

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

git reflog

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

ثم افعل:

git reset --hard ActionIdFromRefLog
154
U. Ali

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

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

هذا سوف التراجع عن الالتزام الأخير.

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

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


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

git commit --amend -m "message"

سيتم استبدال الالتزام الأخير بالالتزام الجديد.

146
akshay_rahar

طريق اخر:

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

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

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

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

140
CommaToast

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

git reset <the previous co>
131
user853293

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

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

127
egridasov

بسيط ، قم بتشغيل هذا في سطر الأوامر:

git reset --soft HEAD~ 
118
kyo

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

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

تحذير: لا تستخدم - بجد إذا كنت لا تعرف ماذا تفعل. - الخطير جدًا خطير ، وقد يحذف ملفاتك.

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

$ git reset --hard <COMMIT -ID>

أو

$ git reset --hard HEAD~<n>

معرف الالتزام : معرف الالتزام

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
117
Upen

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

git reset --hard HEAD~1
116
thestar

استخدم SourceTree (أداة رسومية لـ Git) لرؤية التزاماتك وشجرتك. يمكنك إعادة تعيينها يدويًا مباشرةً بالنقر بزر الماوس الأيمن فوقها.

116
iOS Coder

لالتزام محلي

git reset --soft HEAD~1

أو إذا كنت لا تتذكر بالضبط في أي ارتكاب ، يمكنك استخدام

git rm --cached <file>

لالتزام دفعت

الطريقة الصحيحة لإزالة الملفات من محفوظات المخزون تستخدم git filter-branch. هذا هو،

git filter-branch --index-filter 'git rm --cached <file>' HEAD

لكنني أوصيك باستخدام هذا الأمر بعناية. اقرأ المزيد فيgit-filter-branch (1) دليل الصفحة.

115
geoom

هناك نوعان من السيناريوهات الرئيسية

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

إذا كانت المشكلة هي الملفات الإضافية التي ارتكبتها (وكنت لا تريد الملفات الموجودة في المستودع) ، فيمكنك إزالتها باستخدام git rm ثم الالتزام بـ --amend

git rm <pathToFile>

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

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

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

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

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

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

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

بدلاً من ذلك ، يجب عليك القيام بالالتزام دون --amend (تذكر هذا حول -endend: هذا الخيار يعيد كتابة التاريخ في آخر التزام).

115
dseminara

ماذا تستخدم ، reset --soft أو reset --hard؟

أنا مجرد إضافة سنتين لإجابة @ Kyralessa:

إذا لم تكن متأكدًا من ما يجب استخدامه ، فاضغط على --soft (استخدمت هذه الاتفاقية لتذكرها - s oft للأمان).

لماذا ا ؟

إذا اخترت --hard عن طريق الخطأ ، فستفقدتغييراتك كما لم تكن من قبل. إذا اخترت --soft عن طريق الخطأ ، فيمكنك تحقيق نفس نتائج --hard عن طريق تطبيق أوامر إضافية

git reset HEAD file.html
git checkout -- file.html

مثال كامل

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

الاعتمادات يذهب إلى @ كيراليسا.

102
amd

يمكنك استخدام:

git reset [email protected]{1}

سيؤدي هذا الأمر إلى حذف الالتزام الخاطئ دون تسجيل Git.

66
Jade Han

أعتقد أن لديناcode.txtملف. نجري بعض التغييرات عليه ونلتزم به. يمكننا التراجع عن هذا الالتزام بثلاث طرق ، ولكن يجب أولاً معرفة ما هو الملف المرحلي ... الملف المرحلي هو ملف جاهز للالتزام وإذا قمت بتشغيل git status فسيتم عرض هذا الملف باللون الأخضر اللون ، وإذا لم يتم تنظيم هذا الالتزام ، فسيظهر باللون الأحمر:

 enter image description here

هذا يعني أنك إذا قمت بالتغيير ، فلن يتم حفظ تغييراتك على هذا الملف. يمكنك إضافة هذا الملف في مرحلتك باستخدام git add code.txt ثم الالتزام بالتغيير:

 enter image description here

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

  1. الآن إذا أردنا التراجع فقط عن الالتزام دون أي تغييرات أخرى ، يمكننا استخدام

    git reset --soft HEAD^

     enter image description here

  2. إذا كنا نريد التراجع عن الالتزام وتغييراته (هذا IS DANGEROUS ، لأن التغيير سيخسر) ، يمكننا استخدام

    git reset --hard HEAD^

     enter image description here

  3. وإذا كنا نريد التراجع عن الالتزام وإزالة التغييرات من المرحلة ، يمكننا استخدام

    git reset --mixed HEAD^ أو في شكل قصير git reset HEAD^

     enter image description here

65
Ali Motameni

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

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

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

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

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

  1. انتقل إلى مستودعك في سطر الأوامر وابدأ واجهة المستخدم الرسومية بـ git gui
  2. اختر "تعديل الالتزام الأخير". سترى رسالة الالتزام الأخيرة والملفات التي نظمتها والملفات التي لم تفعلها.
  3. الآن قم بتغيير الأشياء إلى الطريقة التي تريدها أن تبدو بها وانقر فوق الالتزام.
64
Carl

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

هناك الكثير من المواقف التي تريد حقًا التراجع فيها عن الالتزام الأخير في التعليمات البرمجية الخاصة بك. مثلا لأنك ترغب في إعادة هيكلتها على نطاق واسع - أو حتى تجاهلها تمامًا!

في هذه الحالات ، يكون الأمر "إعادة تعيين" هو أفضل صديق لك:

$ git reset --soft HEAD~1

سيقوم الأمر أعلاه (إعادة التعيين) بترجيع الفرع الحالي HEAD إلى المراجعة المحددة. في مثالنا أعلاه ، نود العودة إلى المثال قبل المراجعة الحالية - مما يؤدي إلى التراجع الفعلي عن التزامنا الأخير.

لاحظ علامة --soft: هذا يضمن الحفاظ على التغييرات في التراجع عن المراجعات. بعد تشغيل الأمر ، ستجد التغييرات بمثابة تعديلات محلية غير ملتزم بها في نسخة العمل الخاصة بك.

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

$ git reset --hard HEAD~1

 Enter image description here

57
Mohit

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

git reset --soft HEAD~

أو التراجع عن الوقت قبل الالتزام بآخر مرة:

git reset --soft HEAD~2

أو التراجع عن أي التزام سابق:

git reset --soft <commitID>

(يمكنك الحصول على الالتزام باستخدام git reflog)

عند التراجع عن التزام سابق ، تذكر تنظيف مكان العمل باستخدام

git clean

يمكن العثور على مزيد من التفاصيل في المستندات: git-reset

54
steven

إذا كنت تعمل معSourceTree، فسيساعدك ذلك.

انقر بزر الماوس الأيمن على الالتزام ثم حدد "إعادة (الفرع الحالي)/ماجستير لهذا الالتزام" والأخير حدد " إعادة تشغيل رقيقة.

 Enter image description here

54
Alexandr

للتراجع عن التزامك المحلي ، تستخدم git reset <commit>. أيضا هذا البرنامج التعليمي مفيد جدا لتظهر لك كيف يعمل.

بدلاً من ذلك ، يمكنك استخدام git revert <commit>: العودة يجب أن تستخدم عندما تريد إضافة التزام آخر يعيد التغييرات (مع الاحتفاظ بها في سجل المشروع).

49
mfathy00

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

git reset --soft HEAD^ or git reset --soft HEAD~

هذا سوف التراجع عن الالتزام الأخير.

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

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

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

git commit --amend -m "message"

سيتم استبدال الالتزام الأخير بالالتزام الجديد.

47
Ankit Patidar

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

في نفس الفرع الذي ارتكبته ودفعته ، إذا كتبت "حالة بوابة" فلن ترى أي شيء جديد لأنك ارتكبت ودفعت ، اكتب الآن:

git reset --soft HEAD~1

سيؤدي هذا إلى استعادة كل التغييرات (الملفات) مرة أخرى في منطقة المرحلة ، والآن لإعادتها إلى دليل العمل (غير الثابت) الذي تكتبه فقط:

git reset FILE

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

45
FraK

دورة بوابة نموذجية

عند الحديث عن الأوامر المتعلقة بـ Git في الإجابات السابقة ، أود أن أشارك دورات Git النموذجية مع جميع القراء والتي قد تكون مفيدة. هنا كيف أعمل مع جيت ،

  1. استنساخ أول مرة من الخادم البعيد

    git clone $project

  2. السحب من جهاز التحكم عن بعد (عندما لا يكون لدي التزام محلي معلق بالدفع)

    git pull

  3. إضافة ملف محلي جديد 1 إلى $ to_be_committed_list (فقط تخيل $ to_be_committed_list يعني staged area)

    git add $file1

  4. إزالة file2 المضافة عن طريق الخطأ من $ to_be_committed_list (افترض أن file2 يضاف مثل الخطوة 3 ، التي لم أكن أريدها)

    git reset $file2

  5. ارتكاب file1 الموجود في $ to_be_committed_list

    git commit -m "commit message description"

  6. مزامنة الالتزام المحلي مع مستودع التخزين عن بعد قبل الدفع

    git pull --rebase

  7. حل المشكلة عند حدوث تعارض تكوين المتطلبات المسبقة mergetool

    git mergetool #resolve merging here, also can manually merge

  8. إضافة ملفات حل النزاع ، دعنا نقول file1:

    git add $file1

  9. استمرار الأمر rebase السابقة

    git rebase --continue

  10. دفع جاهز ومزامنة آخر التزام محلي

    git Push Origin head:refs/for/$branch # branch = master, dev, etc.

44
Sazzad Hissain Khan

مستخدمو الدراسات المرئية (2015 ، إلخ)

إذا لم تتمكن من المزامنة في Visual Studio حيث لا يُسمح لك بالضغط على فرع مثل "تطوير" ، فبقدر ما حاولت ، في Visual Studio NEET THEتعودNOR theإعادة تعيين(الثابت أو لينة) ستعمل.

لكل إجابة بأطنان التصويت:

استخدم هذا الأمر في موجه Prompt of root الخاص بمشروعك لتقييد أي شيء سيحاول دفعه:

git reset --hard HEAD~1

قم بنسخ ملفاتك أو نسخها احتياطيًا في حال لم ترغب في فقد أي عمل ، إلخ ...

41
Tom Stickel

لنفترض أنك ارتكبت خطأً محليًا ودفعته إلى مستودع بعيد. يمكنك التراجع عن الفوضى باستخدام هذين الأمرين:

أولاً ، نحتاج إلى تصحيح مستودعنا المحلي من خلال الرجوع إلى الالتزام الذي نريده:

git reset --hard <previous good commit id where you want the local repository  to go>

الآن نحن ندفع بقوة هذا الالتزام الجيد على مستودع التخزين عن بُعد باستخدام هذا الأمر:

git Push --force-with-lease

الإصدار "مع التأجير" لخيار القوة سيمنع الحذف العرضي للتعهدات الجديدة التي لا تعرف عنها (أي أن تأتي من مصدر آخر منذ آخر سحب لديك).

37
KawaiKx

حصلت على معرف الالتزام من bitbucket ثم فعلت:

git checkout commitID .

مثال:

git checkout 7991072 .

وقد أعادته إلى نسخة العمل من هذا الالتزام.

36
ioopl

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

، بادئ ذي بدء ، تحتاج إلى معرفة ما هي "خاطئة" الالتزامات التي ترغب في تجاهلها. سوف نستخدم git reflog للعثور عليه.


git reflog

يمكنك دائمًا استخدام reflog أيضًا.
git reflog سيعرض أي تغيير قام بتحديث HEAD وسيؤدي التحقق من إدخال إعادة التسجيل المرغوب إلى تعيين HEAD مرة أخرى إلى هذا الالتزام.

في كل مرة يتم فيها تعديل HEAD سيكون هناك إدخال جديد في reflog.
يشبه reflog أمر محفوظات Unix ويتم الاحتفاظ به محليًا على جهازك.

git reflog
git checkout [email protected]{...}
# or
git checkout <sha-1>

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

 enter image description here


git reset HEAD --hard <commit_id>

"نقل" راسك مرة أخرى إلى الالتزام المطلوب.
ستعيد Git reset فحص محتوى الالتزام المطلوب لمنطقة التدريج و/أو إلى دليل العمل الخاص بك استنادًا إلى القيمة --hard/--soft/--mixed التي تختارها. سيقوم --hard بتحديث كلاً من منطقة المرحلة ودليل العمل بالمحتوى المحدد وسوف "يفصل" أي تعهدات أخرى تتجاوز هذه النقطة في فرعك المحلي.

إذا لم تكن تلك الالتزامات جزءًا من أي فرع آخر ، فستصبح "متدلية".
يعني محتوى "dangle" أن هناك محتوى غير قابل للوصول في مستودعك المحلي ولا يمثل جزءًا من أي فرع آخر ويمكن إزالته أو إزالته بواسطة gc.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

يوضح هذا المخطط أي أمر يفعل ما.
كما ترون هناك reset && checkout ، عدِّل HEAD.

 enter image description here

34
CodeWizard

ما عليك القيام به سهل وسريع

    git commit --amend

إذا كان فرع خاص أو

    git commit -m 'Replace .class files with .Java files'

إذا كان فرع مشترك أو عام.

32
Yahs Hef

إزالة التزام خاطئ تم دفعه بالفعل إلى جيثب

git Push Origin +(previous good commit id):(branch name)

يرجى تحديد معرف الالتزام الجيد الأخير الذي ترغب في إعادة تعيينه في جيثب.

فمثلا. إذا كان معرف الالتزام الأخير خاطئًا ، فحدد معرف الالتزام السابق في أمر git أعلاه مع اسم الفرع.

يمكنك الحصول على رقم الالتزام السابق باستخدام git log

30
V V

استخدم هذا الأمر:

git checkout -b old-state number_commit
27
Fadid

استخدم هذا الأمر

git checkout -b old-state 0d1d7fc32
27
Jishnu Sukumaran

يمكنك دائمًا تنفيذ git checkout <SHA code> من الإصدار السابق ثم الالتزام مرة أخرى باستخدام الرمز الجديد.

25
shreshta bm

للتخلص من (كل التغييرات في) الالتزام الأخير ، الالتزامان الأخيران والآخر n:

git reset --hard HEAD~1
git reset --hard HEAD~2
...
git reset --hard HEAD~n

وللتخلص من أي شيء بعد التزام محدد:

git reset --hard <commit sha>

على سبيل المثال،

git reset --hard 0d12345

PS:
1- كن حذراً ، بسبب الخيار "الثابت" ، فإنه يحذف التغييرات المحلية في الريبو الخاص بك ويعود إلى الالتزام المذكور سابقًا. يجب تشغيل هذا إذا كنت متأكدًا من أنك عابث في التزامك (التزاماتك) الأخيرة وترغب في العودة في الوقت المناسب.

2 - عادةً ما تكون 7 أحرف من "التزام شا" كافية ، ولكن في المشروعات الكبيرة ، قد تحتاج إلى 12 حرفًا لضمان أن تكون فريدة من نوعها. يمكنك أيضا ذكر كل 40 حرفا شا.

3- تعمل الأوامر المذكورة أعلاه في جيثب لنظام التشغيل Windows أيضًا.

24
Alisa

يمكنك التراجع عن التزامات Git بطريقتين: الأولى هي أنه يمكنك استخدام git revert ، إذا كنت تريد الاحتفاظ بسجل الالتزام:

git revert HEAD~3
git revert <hashcode of commit>

ثانيًا ، يمكنك استخدام git reset ، الذي سيحذف كل سجل الالتزام الخاص بك ويجلب رأسك للالتزام أينما تريد.

git reset <hashcode of commit>
git reset HEAD~3

يمكنك أيضًا استخدام الكلمة الأساسية --hard إذا بدأ أي منها في التصرف بطريقة أخرى. ولكن ، أود أن أوصي به فقط حتى يكون ضروريًا للغاية.

20
Shwetank

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

إذا كان لديك Git Extensions مثبتًا فيمكنك التراجع/التراجع بسهولة عن أي التزام (يمكنك تنزيل ملحقات git من هنا ).

افتح Git Extensions ، انقر بزر الماوس الأيمن على الالتزام الذي ترغب في الرجوع إليه ، ثم حدد "ارتداد الالتزام".

 Git Extensions screen shot

سيتم فتح نافذة منبثقة (انظر لقطة الشاشة أدناه)

 Revert commit popup

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

18
Ranadheer Reddy

الفرق بين بوابة إعادة تعيين - مختلطة ، - لينة و - الثابت

المتطلب السابق: عند إجراء تعديل لملف موجود في مستودعك ، يعتبر هذا التغيير مبدئيًا أنه غير منظم. من أجل الالتزام بالتغييرات ، يجب أن يتم تنظيمه مما يعني إضافته إلى الفهرس باستخدام git add. أثناء عملية الالتزام ، تتم إضافة الملفات التي يتم تنظيمها إلى فهرس.

لنأخذ مثالا:

- A - B - C (master)

HEAD يشير إلى C ويطابق الفهرس C.

--ناعم

  • عندما ننفذ git reset --soft B بقصد إزالة الالتزام C و توجيه السيد/HEAD إلى B .
  • سيشير الآن المعلم/HEAD إلى B ، لكن المؤشر لا يزال قد تغير من C .
  • عند تنفيذ git status ، يمكنك مشاهدة الملفات المفهرسة في الالتزام C as المرحلي .
  • سيؤدي تنفيذ git commit في هذه المرحلة إلى إنشاء التزام جديد بـ نفس التغييرات التي أجريتها C

--مختلط

  • تنفيذ git reset --mixed B.
  • عند التنفيذ ، سيشير master/HEAD إلى B ويتم تعديل الفهرس أيضًا لمطابقة B بسبب العلم المختلط المستخدم.
  • إذا ركضنا التزامًا في هذه المرحلة ، فلن يحدث شيء منذ الفهرس يطابق HEAD .
  • لا تزال لدينا التغييرات في دليل العمل ، ولكن نظرًا لعدم وجودها في الفهرس ، تظهر حالة git أنها غير مقسمة .
  • لارتكابهم ، فأنت git add ثم تلتزم كالمعتاد.

--الصعب

  • تنفيذ git reset --hard B
  • عند التنفيذ ، سيشير master/HEAD إلى B ويعدل دليل العمل الخاص بك
  • التغييرات المضافة في C و جميع التغييرات غير الملتزم بها ستكون إزالتها .
  • ستتطابق الملفات الموجودة في نسخة العمل مع الالتزام B ، وسيؤدي ذلك إلى فقد جميع التغييرات التي تم إجراؤها على الالتزام C بالإضافة إلى التغييرات غير الملتزم بها نهائيًا

نأمل أن تساعد هذه المقارنة بين العلامات المتاحة للاستخدام مع أمر git reset شخصًا ما على استخدامها بحكمة. راجع هذه لمزيد من التفاصيل link1 & link2

16
Keshan Nageswaran

ما عليك سوى استخدام git reset --hard <last good SHA> لإعادة ضبط التغييرات وإعطاء التزام جديد. يمكنك أيضًا استخدام git checkout -- <bad filename>.

16
hubot

لقد وجدت هذا الموقع الذي يصف كيفية التراجع عن الأشياء التي ارتكبتها في المستودع.

بعض الأوامر:

git commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit
16
Eugen Konkov

يمكنك التراجع عن التزاماتك من المستودع المحلي. يرجى اتباع السيناريو أدناه.

في الصورة أدناه ، أتحقق من فرع "الاختبار" (باستخدام أمر Git git checkout -b test) كحالة محلية وتحقق من الحالة (باستخدام أمر Git git status) للفرع المحلي الذي لا يوجد شيء يجب الالتزام به.

 Enter image description here

في صورة الصورة التالية ، يمكنك أن ترى هنا أنني قمت ببعض التغييرات في Filter1.txt وأضفت هذا الملف إلى منطقة التدريج وبعد ذلك التزمت بالتغييرات التي أجريتها مع بعض الرسائل (باستخدام أمر Git git commit -m "Doing commit to test revert back").

"-m لرسالة الالتزام"

 Enter image description here

في الصورة التالية ، يمكنك رؤية سجل الإلتزامات الخاص بك بغض النظر عن ما قمت به من إلتزامات (باستخدام أمر Git git log).

 Enter image description here

لذلك في الصورة أعلاه ، يمكنك رؤية معرف الالتزام مع كل التزام ومع رسالة الالتزام الآن ، مهما كان الالتزام الذي ترغب في الرجوع إليه أو التراجع عن نسخة من رقم الالتزام والضغط على الأمر Git أدناه ، git revert {"paste your commit id"}. مثال:

git revert 9ca304ed12b991f8251496b4ea452857b34353e7

 Enter image description here

لقد عادت مرة أخرى الالتزام الأخير. الآن إذا قمت بفحص حالة Git الخاصة بك ، يمكنك رؤية الملف المعدل الذي هو Filter1.txt وما زال يتعين الالتزام به.

 Enter image description here

15
Raj S. Rusia

إن أبسط طريقة للتراجع عن الالتزام الأخير هي

git reset HEAD^

سيؤدي ذلك إلى إحضار حالة المشروع قبل الالتزام.

15
Arun Karnawat

هنا هو الموقع: Oh shit, git! .

فيما يلي العديد من الوصفات كيفية التراجع عن الأشياء في Git. البعض منهم:

يا القرف ، أنا بحاجة إلى تغيير الرسالة على الالتزام الأخير!

git commit --amend
# follow prompts to change the commit message

يا القرف ، لقد ارتكبت بطريق الخطأ شيئا لإتقانه كان ينبغي أن يكون في فرع جديد!

# Create a new branch from the current state of master
git branch some-new-branch-name
# Remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# Your commit lives in this branch now :)
15
Eugen Konkov

في IntelliJ IDEA ، يمكنك فقط فتح سجل مستودع Git بالضغط Alt+9، انقر بزر الفأرة الأيمن على بعض العلامات من قائمة commits ، واختر: "Reset Current Branch to Here ...".

13
Krzysztof Walczewski

من أجل الاكتمال ، سأقدم الطريقة الواضحة الواضحة التي أغفلتها الإجابات السابقة.

نظرًا لعدم دفع الالتزام ، لم يتغير جهاز التحكم عن بُعد ، لذلك:

  1. احذف المستودع المحلي.
  2. استنساخ مستودع التحكم عن بعد.

يعد ذلك ضروريًا في بعض الأحيان إذا كان عميل Git الهائل يذهب وداعًا. (على سبيل المثال ، أخطاء non-fast-forward)

لا تنسَ إعادة الالتزام بـ المحفوظة التغييرات منذ آخر عملية دفع.

13
Dominic Cerisano

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

إذا كان لديك لإسقاط الالتزام العلوي ثم يساعد بطانة واحدة التالية

git rebase --onto HEAD~1 HEAD

ولكن إذا كنت تريد إسقاط 1 من العديد من الإلتزامات ، قلت ذلك

أ -> ب -> ج -> د -> سيد

وتريد إسقاط الالتزام 'c'

git rebase --onto b c

هذا سيجعل "ب" كقاعدة جديدة من "د" القضاء على "ج"

13
Khem

العنوان:

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

بوابة الالتزام:

كل تغيير يتم تعيينه بموجب التزام يتم تمثيله بواسطة علامة فريدة. لا يمكن حذف الالتزامات. لذلك إذا كنت تريد الالتزام الأخير ، يمكنك ببساطة الدخول فيه باستخدام git reset.

يمكنك الغوص في الالتزام الأخير باستخدام طريقتين:

الطريقة 1: (إذا كنت لا تعرف رقم الالتزام ، ولكنك تريد الانتقال إلى الأول)

git reset HEAD~1  # It will move your head to last commit

الطريقة 2: (إذا كنت تعرف الالتزام الذي قمت بإعادة تعيينه ببساطة على التزامك المعروف)

git reset 0xab3 # رقم الالتزام

ملاحظة: إذا كنت تريد معرفة التزامًا جديدًا ، فحاول git log -p -1

هنا هو التمثيل البياني:

 Enter image description here

13
Silent Spectator

ابحث عن رمز تجزئة الالتزام الأخير من خلال الاطلاع على السجل من خلال:

git log

ثم

git reset <the previous co>
12
Praveen Singh

 enter image description here

على افتراض أنك تعمل في Visual Studio ، إذا ذهبت إلى سجل فرعك ونظرت في جميع التزاماتك ، فما عليك سوى تحديد الحدث قبل الالتزام الذي تريد التراجع عنه ، وانقر بزر الماوس الأيمن فوقه ، وحدد Revert. بهذه السهولة.

11
Uchiha Itachi

إذا كنت ترغب في التخلص من الملفات الخاطئة ، فعليك القيام بذلك

git reset --soft <your_last_good_commit_hash_here> هنا ، إذا قمت بـ git status ، فسترى الملفات في منطقة التدريج. يمكنك تحديد الملفات الخاطئة وإنزالها من منطقة التدريج.

مثل ما يلي.

git reset wrongFile1 wrongFile2 wrongFile3

يمكنك الآن فقط إضافة الملفات التي تحتاج إلى دفع ،

git add goodFile1 goodFile2

ارتكبهم

git commit -v أو git commit -am "Message"

ودفع

git Push Origin master

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

بواسطة

git reset --hard <your_last_good_commit_hash_here>

git Push Origin master

إذا قمت بالفعل بنشر ملفاتك الخاطئة على الخادم ، فيمكنك استخدام علامة --force للدفع إلى الخادم وتحرير السجل.

git Push --force Origin master

8
nPcomp

جرب هذا ، إعادة التعيين الثابت على الالتزام السابق حيث لم تتم إضافة هذه الملفات ، ثم:

git reset --hard <commit_hash>

تأكد من حصولك على نسخة احتياطية من تغييراتك في الحال ، حيث إنها عملية إعادة تعيين صعبة ، مما يعني أنها ستفقد (ما لم تخبئها مسبقًا)

7
serdarsenay
git reset --soft HEAD~1

ستؤدي إعادة التعيين إلى إرجاع الفرع الحالي HEAD إلى المراجعة المحددة. ملاحظة - إشارة سوفت: هذا يضمن الحفاظ على التغييرات في التراجع عن المراجعات. بعد تشغيل الأمر ، ستجد التغييرات بمثابة تعديلات محلية غير ملتزم بها في نسخة العمل الخاصة بك.

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

 git reset --hard HEAD~1

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

git reset --hard 0ad5a7a6

ومع ذلك ، ضع في اعتبارك أن استخدام أمر إعادة الضبط يؤدي إلى إلغاء جميع الإلتزامات التي جاءت بعد الإعادة إلى:  enter image description here

6
Abu Bakr

ما أقوم به في كل مرة أحتاج فيها للتراجع عن التزام/ارتكاب:

  1. git reset HEAD~<n> // عدد الإلتزامات الأخيرة التي أحتاج إليها للتراجع
  2. git status // اختياري. جميع الملفات الآن باللون الأحمر (غير مخزنة).

  3. الآن ، يمكنني إضافة الملفات التي أحتاج إليها فقط:

    • git add <file names> & git commit -m "message" -m "details"
  4. اختياري: يمكنني استرجاع تغييرات ملفات البقية ، إذا كنت بحاجة ، إلى حالتها السابقة ، مع الخروج:
    • git checkout <filename>
  5. إذا كنت قد دفعت به بالفعل إلى الأصل البعيد ، في السابق:
    • git Push Origin <branch name> -f // use -f لإجبار Push.
5
Theo Itzaris

إذا كنت تريد التراجع عن الالتزام الأول في إعادة الشراء الخاص بك

سوف تواجه هذه المشكلة:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

يحدث الخطأ لأنه إذا كان الالتزام الأخير هو الالتزام الأولي (أو عدم وجود أي أهل) للمستودع ، فلا يوجد HEAD ~.

حل

إذا كنت ترغب في إعادة تعيين الالتزام الوحيد على فرع "الرئيسي"

$ git update-ref -d HEAD
$ git rm --cached -r .
5
Nicholas

الحصول على معرف الالتزام الأخير باستخدام هذا الأمر (في سجل واحد في الأعلى هو الأحدث):

git log

الحصول على معرف الالتزام (GUID) وتشغيل هذا الأمر:

git revert <commit_id>
4
Nalan Madheswaran

استبدل نسختك المحلية بما في ذلك تغييراتك بإصدار الخادم ، وسيرغم هذا السطرين من الشفرة على السحب والكتابة المحلية. افتح موجه الأوامر وانتقل إلى جذر مشروع git. إذا كنت تستخدم VS ، فانقر فوق Team ، Synch وانقر على "Open Command Prompt" (انظر الصورة) أدناه.

 Visual Studio

مرة واحدة في كمد موجه المضي قدما في الإرشادات التالية اثنين.

git fetch --all

ثم أنت تفعل

git reset --hard Origin/master

سيؤدي هذا إلى الكتابة فوق الإصدار المحلي الحالي باستخدام إصدار git server

2
shiraz
git revert commit

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

https://git-scm.com/docs/git-revert

2
Gjorgi Gjorgiev

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

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

لقد وجدت نفسي أصلح ماضٍ مرارًا وتكرارًا بما يكفي لدرجة أنني كتبت نصًا له.

إليك سير العمل:

  1. git commit-edit <commit-hash>
    

    سينقلك هذا إلى الالتزام الذي تريد تعديله.

    ستكون التغييرات في الالتزام un مراحل ، جاهزة للتظاهر كما كنت ترغب في أن تكون هذه هي المرة الأولى.

  2. إصلاح ومرحلة الالتزام كما يحلو لك كان في المقام الأول.

    (قد ترغب في استخدام git stash save --keep-index لإخفاء أي ملفات لا تلتزم بها)

  3. أعد الالتزام باستخدام --amend ، على سبيل المثال:

    git commit --amend
    
  4. أكمل rebase:

    git rebase --continue
    

اتصل بهذا بعد git-commit-edit وضعه في $PATH الخاص بك:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "[email protected]"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo
2
Tom Hale

إذا كنت تريد ببساطة حذف جميع التغييرات/التعهدات المحلية وجعل فرعك المحلي يشبه فرع الأصل الذي بدأته من ...

git reset --hard Origin/branch-name

1
JeremyWeir
git Push --delete (branch_name) //this will be removing the public version of your branch

git Push Origin (branch_name) //This will add the previous version back
0
Omkaar.K