لقد ارتكبت بطريق الخطأ الملفات الخطأ إلى Git ، لكنني لم أقم بالضغط على الخادم حتى الآن.
كيف يمكنني التراجع عن تلك الالتزامات من المستودع المحلي؟
$ 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)
git status
، لذلك ستحتاج إلى إضافة لهم مرة أخرى قبل ارتكاب). إذا كنت فقط تريد إضافة المزيد من التغييرات على الالتزام السابق ، أو تغيير رسالة الالتزام1، يمكنك استخدام git reset --soft HEAD~
بدلاً من ذلك ، والذي يشبه git reset HEAD~
(حيث HEAD~
هو نفسه HEAD~1
) لكنه يترك تغييراتك الحالية على مراحل.git add
أي شيء تريد تضمينه في التزامك الجديد.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
، والتي ستفتح محرر رسالة الالتزام الافتراضي الذي تم ملؤه مسبقًا مع آخر رسالة التزام.
التراجع عن الالتزام أمر مخيف بعض الشيء إذا كنت لا تعرف كيف يعمل. لكنها في الواقع سهلة بشكل مثير للدهشة إذا فهمت ذلك.
لنفترض أن لديك هذا ، حيث 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 يومًا ، لذلك يمكنك عادةً العودة وإنقاذ واحدة لم تقصد التخلص منها.
استغرق هذا بعض الوقت لمعرفة ذلك ، لذلك ربما هذا سوف يساعد شخص ما ...
هناك طريقتان "للتراجع" عن آخر التزام ، وهذا يتوقف على ما إذا كنت قد أعلنت بالفعل التزامك علنًا (تم الدفع إلى مستودع التخزين البعيد) أم لا:
لنفترض أنني ارتكبت محليًا ، لكنني أريد الآن إزالة هذا الالتزام.
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 - تراجع الأشياء
إضافة/إزالة الملفات للحصول على الأشياء بالطريقة التي تريدها:
git rm classdir
git add sourcedir
ثم قم بتعديل الالتزام:
git commit --amend
سيتم تعديل الالتزام الخاطئ السابق ليعكس حالة الفهرس الجديدة - بمعنى آخر ، سيكون الأمر وكأنك لم ترتكب أي خطأ في المقام الأول.
لاحظ أنه يجب عليك القيام بذلك فقط إذا لم تدفع بعد. إذا كنت قد دفعت ، فسيتعين عليك فقط إجراء إصلاح بشكل طبيعي.
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 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
، لفهم أفضل لما يفعله هذا.
إذا قمت بفوضى ، فيمكنك دائمًا استخدام إعادة التسجيل للعثور على الإجازات المنسدلة:
$ 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
استخدم git revert <commit-id>
للحصول على معرف الالتزام ، ما عليك سوى استخدام git log
إذا كنت تخطط للتراجع عن التزام محلي بالكامل ، كل ما قمت بتغييره في الالتزام ، وإذا كنت لا تقلق بشأن أي شيء ، فقم فقط بتنفيذ الأمر التالي.
git reset --hard HEAD^1
(سيتجاهل هذا الأمر التزامك بالكامل وستفقد تغييراتك بالكامل من شجرة العمل المحلية). إذا كنت تريد التراجع عن التزامك ، لكنك تريد إجراء تغييراتك في منطقة التدريج (قبل الالتزام تمامًا مثل git add
) ، فقم بتنفيذ الأمر التالي.
git reset --soft HEAD^1
الآن تأتي ملفاتك الملتزمة إلى منطقة التدريج. لنفترض ما إذا كنت ترغب في رفع مستوى الملفات ، لأنك تحتاج إلى تحرير بعض المحتويات الخاطئة ، فقم بتنفيذ الأمر التالي
git reset HEAD
ألزمت الآن الملفات القادمة من المنطقة المرحلية إلى المنطقة غير المستوية. أصبحت الملفات الآن جاهزة للتعديل ، لذا فكل ما قمت بتغييره ، ترغب في تعديله وإضافته وتقديم التزام جديد/جديد.
إذا كان لديك Git Extras مثبتًا ، يمكنك تشغيل git undo
للتراجع عن الالتزام الأخير. git undo 3
سيؤدي إلى التراجع عن آخر 3 محاولات.
أردت التراجع عن آخر 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>
أفضل استخدام 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 التعهدات لأي خط تزيله.
استخدم 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)
في الحالة العادية ، ربما لا داعي للقلق بشأن كون سجل فرع الفرع الخاص بك أصليًا. ما عليك سوى الضغط على التزام متابعة (راجع "كيفية التراجع عن التزام عام" أعلاه) ، ثم في وقت لاحق ، اسكواش دمج لإخفاء التاريخ.
إذا كنت قد ارتكبت خردة ولكن لم تدفع ،
git reset --soft HEAD~1
HEAD ~ 1 هو اختصار للالتزام قبل الرأس. بدلاً من ذلك ، يمكنك الرجوع إلى SHA-1 من التجزئة إذا كنت تريد إعادة التعيين. - soft الخيار سيحذف الالتزام لكنه سيترك كل ملفاتك التي تم تغييرها "تغييرات يجب الالتزام بها" ، كما ستضعها بوابة git.
إذا كنت تريد التخلص من أي تغييرات على الملفات المتعقبة في شجرة العمل منذ الالتزام قبل استخدام الرأس " - hard " بدلاً من ذلك.
OR
إذا دفعت بالفعل وسحب شخص ما هو حالتي ، لا يمكنك استخدام git reset . ومع ذلك يمكنك أن تفعل بوابة العودة ،
git revert HEAD
سيؤدي هذا إلى إنشاء التزام جديد يعكس كل شيء تم تقديمه بواسطة الالتزام العرضي.
إذا كنت تريد التراجع عنها نهائيًا وكنت قد استنسخت بعض المستودعات
يمكن رؤية معرف الالتزام بواسطة
git log
ثم يمكنك أن تفعل -
git reset --hard <commit_id>
git Push Origin <branch_name> -f
في 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
:
git reset --soft HEAD~1
قم بشرح: ماذا git reset
تعمل ، بشكل أساسي reset
لأي التزام ترغب في العودة إليه ، ثم إذا قمت بضمه مع مفتاح --soft
، فسوف يعود ، لكن مع الاحتفاظ بالتغييرات في ملفك (ملفاتك) ) ، لذلك يمكنك العودة إلى المرحلة التي تمت إضافة الملف إليها للتو ، HEAD
هو رأس الفرع وإذا كنت تتحد مع ~1
(في هذه الحالة تستخدم أيضًا HEAD^
) ، فسوف تعود مرة أخرى إلى التزام واحد وهو ما تريده فقط ...
أقوم بإنشاء الخطوات في الصورة أدناه بمزيد من التفاصيل لك ، بما في ذلك جميع الخطوات التي قد تحدث في المواقف الحقيقية والتزام الكود:
كيفية التراجع عن آخر جيت الالتزام؟
لاستعادة كل شيء إلى ما كان عليه قبل الالتزام الأخير ، نحتاج إلى إعادة التعيين إلى الالتزام قبل HEAD.
إذا كنت لا تريد الاحتفاظ بالتغييرات التي أجريتها:
git reset --hard HEAD^
إذا كنت تريد الاحتفاظ بالتغييرات الخاصة بك:
git reset --soft HEAD^
الآن تحقق من سجل بوابة الخاص بك. سيُظهر أنه قد تمت إزالة التزامنا الأخير.
استخدم reflog للعثور على الحالة الصحيحة
git reflog
REFLOG قبل إعادة الضبط
حدد إعادة التسجيل الصحيحة (f3cb6e2 في حالتي) واكتب
git reset --hard f3cb6e2
بعد ذلك ، سيتم إعادة تعيين الريبو HEAD إلى ذلك العنوان سجل بعد إعادة تعيين
أخيرًا ، يشبه reflog الصورة أدناه
نهائي REFLOG
"إعادة تعيين الشجرة العاملة إلى آخر التزام"
git reset --hard HEAD^
"تنظيف الملفات غير المعروفة من الشجرة العاملة"
git clean
راجع - Git Quick Reference
ملاحظة: سيحذف هذا الأمر الالتزام السابق ، لذا استخدم بحذر! git reset --hard
أكثر أمانًا -
الجولة الأولى:
git reflog
سيعرض لك جميع الإجراءات المحتملة التي قمت بها على مستودعك ، على سبيل المثال ، الالتزام ، الدمج ، السحب ، إلخ.
ثم افعل:
git reset --hard ActionIdFromRefLog
git reset --soft HEAD^
أو git reset --soft HEAD~
هذا سوف التراجع عن الالتزام الأخير.
هنا --soft
يعني إعادة التعيين إلى التدريج.
HEAD~
أو HEAD^
يعني الانتقال إلى الالتزام قبل HEAD.
git commit --amend -m "message"
سيتم استبدال الالتزام الأخير بالالتزام الجديد.
طريق اخر:
راجع الفرع الذي تريد الرجوع إليه ، ثم أعد تعيين نسخة العمل المحلية الخاصة بك مرة أخرى إلى الالتزام الذي ترغب في أن تكون الأحدث على الخادم البعيد (كل شيء بعده سيذهب إلى اللقاء). للقيام بذلك ، في SourceTree ، انقر بزر الماوس الأيمن فوق "إعادة تعيين BRANCHNAME لهذا الالتزام" وحدده.
ثم انتقل إلى دليل مستودعك المحلي وقم بتشغيل هذا الأمر:
git -c diff.mnemonicprefix=false -c core.quotepath=false Push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
سيؤدي هذا إلى محو جميع الإلتزامات بعد المستودع الحالي في مستودعك المحلي ولكن لهذا الفرع الواحد فقط.
اكتب git log
وابحث عن رمز تجزئة الالتزام الأخير ثم أدخل:
git reset <the previous co>
في حالتي ، ارتكبت بطريق الخطأ بعض الملفات التي لم أكن أريدها. لذلك فعلت ما يلي وعملت:
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 reset --soft HEAD~
هناك العديد من الطرق للقيام بذلك:
أمر 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
لإعادة التعيين إلى المراجعة السابقة ، وحذف جميع التغييرات غير الملتزم بها نهائيًا:
git reset --hard HEAD~1
استخدم SourceTree (أداة رسومية لـ Git) لرؤية التزاماتك وشجرتك. يمكنك إعادة تعيينها يدويًا مباشرةً بالنقر بزر الماوس الأيمن فوقها.
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) دليل الصفحة.
هناك نوعان من السيناريوهات الرئيسية
لم تدفع الالتزام بعد
إذا كانت المشكلة هي الملفات الإضافية التي ارتكبتها (وكنت لا تريد الملفات الموجودة في المستودع) ، فيمكنك إزالتها باستخدام 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: هذا الخيار يعيد كتابة التاريخ في آخر التزام).
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
الاعتمادات يذهب إلى @ كيراليسا.
أعتقد أن لديناcode.txtملف. نجري بعض التغييرات عليه ونلتزم به. يمكننا التراجع عن هذا الالتزام بثلاث طرق ، ولكن يجب أولاً معرفة ما هو الملف المرحلي ... الملف المرحلي هو ملف جاهز للالتزام وإذا قمت بتشغيل git status
فسيتم عرض هذا الملف باللون الأخضر اللون ، وإذا لم يتم تنظيم هذا الالتزام ، فسيظهر باللون الأحمر:
هذا يعني أنك إذا قمت بالتغيير ، فلن يتم حفظ تغييراتك على هذا الملف. يمكنك إضافة هذا الملف في مرحلتك باستخدام git add code.txt
ثم الالتزام بالتغيير:
التراجع عن الالتزام الأخير:
الآن إذا أردنا التراجع فقط عن الالتزام دون أي تغييرات أخرى ، يمكننا استخدام
git reset --soft HEAD^
إذا كنا نريد التراجع عن الالتزام وتغييراته (هذا IS DANGEROUS ، لأن التغيير سيخسر) ، يمكننا استخدام
git reset --hard HEAD^
وإذا كنا نريد التراجع عن الالتزام وإزالة التغييرات من المرحلة ، يمكننا استخدام
git reset --mixed HEAD^
أو في شكل قصير git reset HEAD^
عادة ، تريد التراجع ارتكاب لأنك ارتكبت خطأ وتريد إصلاحه - بشكل أساسي ما فعله البروتوكول الاختياري عندما طرح السؤال. إذاً حقاً ، أنت تريد فعلاً إعادة التزام.
تركز معظم الإجابات هنا على سطر الأوامر. على الرغم من أن سطر الأوامر هو أفضل طريقة لاستخدام Git عندما تشعر بالارتياح تجاهه ، إلا أنه على الأرجح غريب بعض الشيء عن القادمين من أنظمة التحكم في الإصدارات الأخرى إلى Git.
إليك كيفية القيام بذلك باستخدام واجهة المستخدم الرسومية. إذا كنت قد قمت بتثبيت Git ، فلديك بالفعل كل ما تحتاجه لاتباع هذه التعليمات.
ملاحظة: سأفترض هنا أنك أدركت أن الالتزام كان خطأ قبل أن تضغط عليه. إذا كنت لا تعرف ماذا يعني الدفع ، فمن المحتمل أنك لم تدفع. حتى الاستمرار في التعليمات. إذا كنت قد دفعت الالتزام الخاطئ ، فإن الطريقة الأقل مخاطرة هي فقط متابعة الالتزام الخاطئ بالتزام جديد يعمل على إصلاح الأشياء ، بالطريقة التي ستقوم بها في نظام التحكم في الإصدار الذي لا يسمح لك بإعادة كتابة السجل.
ومع ذلك ، فإليك كيفية إصلاح أحدث خطأ ارتكبت باستخدام واجهة المستخدم الرسومية:
git gui
التراجع عن الالتزام الأخير
هناك الكثير من المواقف التي تريد حقًا التراجع فيها عن الالتزام الأخير في التعليمات البرمجية الخاصة بك. مثلا لأنك ترغب في إعادة هيكلتها على نطاق واسع - أو حتى تجاهلها تمامًا!
في هذه الحالات ، يكون الأمر "إعادة تعيين" هو أفضل صديق لك:
$ git reset --soft HEAD~1
سيقوم الأمر أعلاه (إعادة التعيين) بترجيع الفرع الحالي HEAD إلى المراجعة المحددة. في مثالنا أعلاه ، نود العودة إلى المثال قبل المراجعة الحالية - مما يؤدي إلى التراجع الفعلي عن التزامنا الأخير.
لاحظ علامة --soft
: هذا يضمن الحفاظ على التغييرات في التراجع عن المراجعات. بعد تشغيل الأمر ، ستجد التغييرات بمثابة تعديلات محلية غير ملتزم بها في نسخة العمل الخاصة بك.
إذا كنت لا تريد الاحتفاظ بهذه التغييرات ، فما عليك سوى استخدام علامة --hard
. تأكد من القيام بذلك فقط عندما تكون متأكدًا من أنك لست بحاجة إلى هذه التغييرات بعد الآن.
$ git reset --hard HEAD~1
فقط التراجع عن الالتزام الأخير:
git reset --soft HEAD~
أو التراجع عن الوقت قبل الالتزام بآخر مرة:
git reset --soft HEAD~2
أو التراجع عن أي التزام سابق:
git reset --soft <commitID>
(يمكنك الحصول على الالتزام باستخدام git reflog
)
عند التراجع عن التزام سابق ، تذكر تنظيف مكان العمل باستخدام
git clean
يمكن العثور على مزيد من التفاصيل في المستندات: git-reset
إذا كنت تعمل معSourceTree، فسيساعدك ذلك.
انقر بزر الماوس الأيمن على الالتزام ثم حدد "إعادة (الفرع الحالي)/ماجستير لهذا الالتزام" والأخير حدد " إعادة تشغيل رقيقة.
للتراجع عن التزامك المحلي ، تستخدم git reset <commit>
. أيضا هذا البرنامج التعليمي مفيد جدا لتظهر لك كيف يعمل.
بدلاً من ذلك ، يمكنك استخدام git revert <commit>
: العودة يجب أن تستخدم عندما تريد إضافة التزام آخر يعيد التغييرات (مع الاحتفاظ بها في سجل المشروع).
التراجع عن الالتزام الأخير:
git reset --soft HEAD^ or git reset --soft HEAD~
هذا سوف التراجع عن الالتزام الأخير.
هنا --soft
يعني إعادة التعيين إلى التدريج.
HEAD~ or HEAD^
يعني الانتقال إلى الالتزام قبل HEAD.
استبدال الالتزام الأخير بالالتزام الجديد:
git commit --amend -m "message"
سيتم استبدال الالتزام الأخير بالالتزام الجديد.
في حالتي ، لقد ارتكبت ودفعت إلى الفرع الخطأ ، لذا فإن ما أردت هو إعادة كل التغييرات إلى الخلف حتى أتمكن من إرسالها إلى فرع جديد صحيح ، لذلك فعلت هذا:
في نفس الفرع الذي ارتكبته ودفعته ، إذا كتبت "حالة بوابة" فلن ترى أي شيء جديد لأنك ارتكبت ودفعت ، اكتب الآن:
git reset --soft HEAD~1
سيؤدي هذا إلى استعادة كل التغييرات (الملفات) مرة أخرى في منطقة المرحلة ، والآن لإعادتها إلى دليل العمل (غير الثابت) الذي تكتبه فقط:
git reset FILE
حيث "الملف" هو الملف الذي تريد الالتزام به مرة أخرى. الآن ، يجب أن يكون هذا الملف في دليل العمل (غير ثابت) مع كل التغييرات التي قمت بها. يمكنك الآن التغيير إلى أي فرع تريده وإجراء التغييرات في هذا الفرع. آمل أن يساعد هذا الأشخاص الآخرين الذين ارتكبوا نفس الخطأ الذي ارتكبته. بالطبع ، لا يزال الفرع الأولي الذي ارتكبته موجودًا مع كل التغييرات ، لكن في حالتي كان هذا جيدًا ، إذا لم يكن الأمر مناسبًا لك ، فيمكنك البحث عن طرق لإعادة هذا الالتزام في هذا الفرع.
عند الحديث عن الأوامر المتعلقة بـ Git في الإجابات السابقة ، أود أن أشارك دورات Git النموذجية مع جميع القراء والتي قد تكون مفيدة. هنا كيف أعمل مع جيت ،
استنساخ أول مرة من الخادم البعيد
git clone $project
السحب من جهاز التحكم عن بعد (عندما لا يكون لدي التزام محلي معلق بالدفع)
git pull
إضافة ملف محلي جديد 1 إلى $ to_be_committed_list (فقط تخيل $ to_be_committed_list يعني staged
area)
git add $file1
إزالة file2 المضافة عن طريق الخطأ من $ to_be_committed_list (افترض أن file2 يضاف مثل الخطوة 3 ، التي لم أكن أريدها)
git reset $file2
ارتكاب file1 الموجود في $ to_be_committed_list
git commit -m "commit message description"
مزامنة الالتزام المحلي مع مستودع التخزين عن بعد قبل الدفع
git pull --rebase
حل المشكلة عند حدوث تعارض تكوين المتطلبات المسبقة mergetool
git mergetool #resolve merging here, also can manually merge
إضافة ملفات حل النزاع ، دعنا نقول file1
:
git add $file1
استمرار الأمر rebase السابقة
git rebase --continue
دفع جاهز ومزامنة آخر التزام محلي
git Push Origin head:refs/for/$branch # branch = master, dev, etc.
مستخدمو الدراسات المرئية (2015 ، إلخ)
إذا لم تتمكن من المزامنة في Visual Studio حيث لا يُسمح لك بالضغط على فرع مثل "تطوير" ، فبقدر ما حاولت ، في Visual Studio NEET THEتعودNOR theإعادة تعيين(الثابت أو لينة) ستعمل.
لكل إجابة بأطنان التصويت:
استخدم هذا الأمر في موجه Prompt of root الخاص بمشروعك لتقييد أي شيء سيحاول دفعه:
git reset --hard HEAD~1
قم بنسخ ملفاتك أو نسخها احتياطيًا في حال لم ترغب في فقد أي عمل ، إلخ ...
لنفترض أنك ارتكبت خطأً محليًا ودفعته إلى مستودع بعيد. يمكنك التراجع عن الفوضى باستخدام هذين الأمرين:
أولاً ، نحتاج إلى تصحيح مستودعنا المحلي من خلال الرجوع إلى الالتزام الذي نريده:
git reset --hard <previous good commit id where you want the local repository to go>
الآن نحن ندفع بقوة هذا الالتزام الجيد على مستودع التخزين عن بُعد باستخدام هذا الأمر:
git Push --force-with-lease
الإصدار "مع التأجير" لخيار القوة سيمنع الحذف العرضي للتعهدات الجديدة التي لا تعرف عنها (أي أن تأتي من مصدر آخر منذ آخر سحب لديك).
حصلت على معرف الالتزام من bitbucket
ثم فعلت:
git checkout commitID .
مثال:
git checkout 7991072 .
وقد أعادته إلى نسخة العمل من هذا الالتزام.
لديك عدة خيارات للتراجع عن الالتزام الأخير. فيما يلي بعض خياراتك التي تلخص في إجابة واحدة مع مقتطفات الشفرة
، بادئ ذي بدء ، تحتاج إلى معرفة ما هي "خاطئة" الالتزامات التي ترغب في تجاهلها. سوف نستخدم 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 القيام بذلك.
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
.
ما عليك القيام به سهل وسريع
git commit --amend
إذا كان فرع خاص أو
git commit -m 'Replace .class files with .Java files'
إذا كان فرع مشترك أو عام.
إزالة التزام خاطئ تم دفعه بالفعل إلى جيثب
git Push Origin +(previous good commit id):(branch name)
يرجى تحديد معرف الالتزام الجيد الأخير الذي ترغب في إعادة تعيينه في جيثب.
فمثلا. إذا كان معرف الالتزام الأخير خاطئًا ، فحدد معرف الالتزام السابق في أمر git أعلاه مع اسم الفرع.
يمكنك الحصول على رقم الالتزام السابق باستخدام git log
استخدم هذا الأمر:
git checkout -b old-state number_commit
استخدم هذا الأمر
git checkout -b old-state 0d1d7fc32
يمكنك دائمًا تنفيذ git checkout <SHA code>
من الإصدار السابق ثم الالتزام مرة أخرى باستخدام الرمز الجديد.
للتخلص من (كل التغييرات في) الالتزام الأخير ، الالتزامان الأخيران والآخر 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 أيضًا.
يمكنك التراجع عن التزامات Git بطريقتين: الأولى هي أنه يمكنك استخدام git revert
، إذا كنت تريد الاحتفاظ بسجل الالتزام:
git revert HEAD~3
git revert <hashcode of commit>
ثانيًا ، يمكنك استخدام git reset
، الذي سيحذف كل سجل الالتزام الخاص بك ويجلب رأسك للالتزام أينما تريد.
git reset <hashcode of commit>
git reset HEAD~3
يمكنك أيضًا استخدام الكلمة الأساسية --hard
إذا بدأ أي منها في التصرف بطريقة أخرى. ولكن ، أود أن أوصي به فقط حتى يكون ضروريًا للغاية.
المرجع: كيفية التراجع عن الالتزام الأخير في بوابة؟
إذا كان لديك Git Extensions مثبتًا فيمكنك التراجع/التراجع بسهولة عن أي التزام (يمكنك تنزيل ملحقات git من هنا ).
افتح Git Extensions ، انقر بزر الماوس الأيمن على الالتزام الذي ترغب في الرجوع إليه ، ثم حدد "ارتداد الالتزام".
سيتم فتح نافذة منبثقة (انظر لقطة الشاشة أدناه)
حدد "إنشاء التزام تلقائيًا" إذا كنت ترغب في الالتزام بالتغييرات التي تم إرجاعها مباشرةً أو إذا كنت تريد الالتزام يدويًا بالتغييرات التي تم إرجاعها مع الحفاظ على المربع غير محدد وانقر على زر "عكس هذا الالتزام".
المتطلب السابق: عند إجراء تعديل لملف موجود في مستودعك ، يعتبر هذا التغيير مبدئيًا أنه غير منظم. من أجل الالتزام بالتغييرات ، يجب أن يتم تنظيمه مما يعني إضافته إلى الفهرس باستخدام
git add
. أثناء عملية الالتزام ، تتم إضافة الملفات التي يتم تنظيمها إلى فهرس.
لنأخذ مثالا:
- A - B - C (master)
HEAD
يشير إلى C
ويطابق الفهرس C
.
git reset --soft B
بقصد إزالة الالتزام C و توجيه السيد/HEAD إلى B .git status
، يمكنك مشاهدة الملفات المفهرسة في الالتزام C as المرحلي .git commit
في هذه المرحلة إلى إنشاء التزام جديد بـ نفس التغييرات التي أجريتها C git reset --mixed B
.git add
ثم تلتزم كالمعتاد.git reset --hard B
نأمل أن تساعد هذه المقارنة بين العلامات المتاحة للاستخدام مع أمر git reset
شخصًا ما على استخدامها بحكمة. راجع هذه لمزيد من التفاصيل link1 & link2
ما عليك سوى استخدام git reset --hard <last good SHA>
لإعادة ضبط التغييرات وإعطاء التزام جديد. يمكنك أيضًا استخدام git checkout -- <bad filename>
.
لقد وجدت هذا الموقع الذي يصف كيفية التراجع عن الأشياء التي ارتكبتها في المستودع.
بعض الأوامر:
git commit --amend # Change last commit
git reset HEAD~1 --soft # Undo last commit
يمكنك التراجع عن التزاماتك من المستودع المحلي. يرجى اتباع السيناريو أدناه.
في الصورة أدناه ، أتحقق من فرع "الاختبار" (باستخدام أمر Git git checkout -b test
) كحالة محلية وتحقق من الحالة (باستخدام أمر Git git status
) للفرع المحلي الذي لا يوجد شيء يجب الالتزام به.
في صورة الصورة التالية ، يمكنك أن ترى هنا أنني قمت ببعض التغييرات في Filter1.txt وأضفت هذا الملف إلى منطقة التدريج وبعد ذلك التزمت بالتغييرات التي أجريتها مع بعض الرسائل (باستخدام أمر Git git commit -m "Doing commit to test revert back"
).
"-m لرسالة الالتزام"
في الصورة التالية ، يمكنك رؤية سجل الإلتزامات الخاص بك بغض النظر عن ما قمت به من إلتزامات (باستخدام أمر Git git log
).
لذلك في الصورة أعلاه ، يمكنك رؤية معرف الالتزام مع كل التزام ومع رسالة الالتزام الآن ، مهما كان الالتزام الذي ترغب في الرجوع إليه أو التراجع عن نسخة من رقم الالتزام والضغط على الأمر Git أدناه ، git revert {"paste your commit id"}
. مثال:
git revert 9ca304ed12b991f8251496b4ea452857b34353e7
لقد عادت مرة أخرى الالتزام الأخير. الآن إذا قمت بفحص حالة Git الخاصة بك ، يمكنك رؤية الملف المعدل الذي هو Filter1.txt وما زال يتعين الالتزام به.
إن أبسط طريقة للتراجع عن الالتزام الأخير هي
git reset HEAD^
سيؤدي ذلك إلى إحضار حالة المشروع قبل الالتزام.
هنا هو الموقع: 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 :)
في IntelliJ IDEA ، يمكنك فقط فتح سجل مستودع Git بالضغط Alt+9، انقر بزر الفأرة الأيمن على بعض العلامات من قائمة commits ، واختر: "Reset Current Branch to Here ...".
من أجل الاكتمال ، سأقدم الطريقة الواضحة الواضحة التي أغفلتها الإجابات السابقة.
نظرًا لعدم دفع الالتزام ، لم يتغير جهاز التحكم عن بُعد ، لذلك:
يعد ذلك ضروريًا في بعض الأحيان إذا كان عميل Git الهائل يذهب وداعًا. (على سبيل المثال ، أخطاء non-fast-forward
)
لا تنسَ إعادة الالتزام بـ المحفوظة التغييرات منذ آخر عملية دفع.
تعتبر إعادة تعيين وإسقاط التعيينات هي الأفضل عندما تريد الحفاظ على السجل نظيفًا عند اقتراح تصحيحات على فرع عام وما إلى ذلك.
إذا كان لديك لإسقاط الالتزام العلوي ثم يساعد بطانة واحدة التالية
git rebase --onto HEAD~1 HEAD
ولكن إذا كنت تريد إسقاط 1 من العديد من الإلتزامات ، قلت ذلك
أ -> ب -> ج -> د -> سيد
وتريد إسقاط الالتزام 'c'
git rebase --onto b c
هذا سيجعل "ب" كقاعدة جديدة من "د" القضاء على "ج"
العنوان:
قبل إعادة التعيين ، يجب أن نعرف عن 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
هنا هو التمثيل البياني:
ابحث عن رمز تجزئة الالتزام الأخير من خلال الاطلاع على السجل من خلال:
git log
ثم
git reset <the previous co>
إذا كنت ترغب في التخلص من الملفات الخاطئة ، فعليك القيام بذلك
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
جرب هذا ، إعادة التعيين الثابت على الالتزام السابق حيث لم تتم إضافة هذه الملفات ، ثم:
git reset --hard <commit_hash>
تأكد من حصولك على نسخة احتياطية من تغييراتك في الحال ، حيث إنها عملية إعادة تعيين صعبة ، مما يعني أنها ستفقد (ما لم تخبئها مسبقًا)
git reset --soft HEAD~1
ستؤدي إعادة التعيين إلى إرجاع الفرع الحالي HEAD إلى المراجعة المحددة. ملاحظة - إشارة سوفت: هذا يضمن الحفاظ على التغييرات في التراجع عن المراجعات. بعد تشغيل الأمر ، ستجد التغييرات بمثابة تعديلات محلية غير ملتزم بها في نسخة العمل الخاصة بك.
إذا كنت لا ترغب في الاحتفاظ بهذه التغييرات ، فما عليك سوى استخدام علامة - hard. تأكد من القيام بذلك فقط عندما تكون متأكدًا من أنك لست بحاجة إلى هذه التغييرات بعد الآن.
git reset --hard HEAD~1
التراجع عن التزامات متعددة
git reset --hard 0ad5a7a6
ومع ذلك ، ضع في اعتبارك أن استخدام أمر إعادة الضبط يؤدي إلى إلغاء جميع الإلتزامات التي جاءت بعد الإعادة إلى:
ما أقوم به في كل مرة أحتاج فيها للتراجع عن التزام/ارتكاب:
git reset HEAD~<n>
// عدد الإلتزامات الأخيرة التي أحتاج إليها للتراجعgit status
// اختياري. جميع الملفات الآن باللون الأحمر (غير مخزنة).
الآن ، يمكنني إضافة الملفات التي أحتاج إليها فقط:
git add <file names> & git commit -m "message" -m "details"
git checkout <filename>
git Push Origin <branch name> -f
// use -f لإجبار Push.سوف تواجه هذه المشكلة:
$ 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 .
الحصول على معرف الالتزام الأخير باستخدام هذا الأمر (في سجل واحد في الأعلى هو الأحدث):
git log
الحصول على معرف الالتزام (GUID) وتشغيل هذا الأمر:
git revert <commit_id>
استبدل نسختك المحلية بما في ذلك تغييراتك بإصدار الخادم ، وسيرغم هذا السطرين من الشفرة على السحب والكتابة المحلية. افتح موجه الأوامر وانتقل إلى جذر مشروع git. إذا كنت تستخدم VS ، فانقر فوق Team ، Synch وانقر على "Open Command Prompt" (انظر الصورة) أدناه.
مرة واحدة في كمد موجه المضي قدما في الإرشادات التالية اثنين.
git fetch --all
ثم أنت تفعل
git reset --hard Origin/master
سيؤدي هذا إلى الكتابة فوق الإصدار المحلي الحالي باستخدام إصدار git server
git revert commit
سيؤدي ذلك إلى إنشاء التغييرات المعاكسة من الالتزام الذي تريد الرجوع إليه ، ثم الالتزام بهذه التغييرات فقط. أعتقد أن هذه هي أبسط طريقة.
عمومًا ، لا أريد التراجع عن مجموعة من التعهدات ، ولكنني أعدّل التزامًا سابقًا بالطريقة التي أتمنى أن تكون قد ارتكبت بها في المقام الأول.
لقد وجدت نفسي أصلح ماضٍ مرارًا وتكرارًا بما يكفي لدرجة أنني كتبت نصًا له.
إليك سير العمل:
git commit-edit <commit-hash>
سينقلك هذا إلى الالتزام الذي تريد تعديله.
ستكون التغييرات في الالتزام un مراحل ، جاهزة للتظاهر كما كنت ترغب في أن تكون هذه هي المرة الأولى.
إصلاح ومرحلة الالتزام كما يحلو لك كان في المقام الأول.
(قد ترغب في استخدام git stash save --keep-index
لإخفاء أي ملفات لا تلتزم بها)
أعد الالتزام باستخدام --amend
، على سبيل المثال:
git commit --amend
أكمل 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
إذا كنت تريد ببساطة حذف جميع التغييرات/التعهدات المحلية وجعل فرعك المحلي يشبه فرع الأصل الذي بدأته من ...
git reset --hard Origin/branch-name
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