سؤال

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

بواسطة delete, يعني أنه إذا لم تجعل هذا الالتزام، وعندما أقوم بالدفع في المستقبل، فلن تدفع تغييراتي إلى الفرع البعيد.

قرأت مساعدة جيت، وأعتقد أن الأمر الذي يجب أن أستخدمه هو git reset --hard HEAD. وبعد هل هذا صحيح؟

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

المحلول

حذر: git reset --hard سيحذف تغييرات دليل العمل الخاص بك. وبعد تأكد من خبأ أي تغييرات محلية تريد الاحتفاظ بها قبل تشغيل هذا الأمر.

على افتراض أنك تجلس على هذا الالتزام، فإن هذا الأمر سوف يضحه ...

git reset --hard HEAD~1

ال HEAD~1 يعني الالتزام قبل الرأس.

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

git reset --hard <sha1-commit-id>

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

git push origin HEAD --force

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

إذا دفعت بالفعل، فقد يكون من الأفضل استخدامها git revert, لإنشاء "صورة مرآة" تلتزم بالتراجع عن التغييرات. ومع ذلك، سيكون كلاهما يرتكب في السجل.


لعِلمِكَ -- git reset --hard HEAD رائع إذا كنت ترغب في التخلص من العمل قيد التقدم. سوف يعيدك إلى أحدث الالتزام، ومحو جميع التغييرات في شجرة العمل الخاصة بك وفهرسك.


أخيرا، إذا كنت بحاجة إلى العثور على الالتزام بأنك "حذفت"، فمن المعتاد git reflog ما لم يكن لديك القمامة جمع مستودعك.

نصائح أخرى

إذا لم تكن قد دفعت بعد الالتزام في أي مكان، فيمكنك استخدامها git rebase -i لإزالة هذا الالتزام. أولا، اكتشف كم مرة يلتزم ذلك (تقريبا). ثم القيام:

git rebase -i HEAD~N

ال ~N يعني Rebase آخر N ارتكب (N يجب أن يكون رقم، على سبيل المثال HEAD~10). ثم، يمكنك تحرير الملف الذي يقدمه لك GIT لحذف الالتزام المخالف. عند حفظ هذا الملف، سيتم إعادة كتابة GIT ثم يرتكب كل ما يلي كما لو كان الشخص الذي حذفته لم يكن موجودا.

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

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

احتمال آخر هو أحد أوامري المفضلة:

git rebase -i <commit>~1

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

أنا أبذل هذه الإجابة لأنني لا أرى لماذا يريد أي شخص حاول ارتكاب العمل حذف كل هذا العمل بسبب خطأ باستخدام GIT!

إذا كنت ترغب في الحفاظ على عملك وعادل "التراجع" الذي يقوم به الأمر (اشتعلت قبل الدفع إلى Repo):

git reset --soft HEAD~1

لا تستخدم - العلم إلا إذا كنت ترغب في تدمير عملك في التقدم منذ آخر الالتزام.

إزالة الالتزام بأكمله

git rebase -p --onto SHA^ SHA

من الواضح محل "Sha" مع الإشارة التي تريد التخلص منها. "^" في هذا الأمر هو حرفي.

http://sethrobertson.github.io/gitfixum/fixup.html.

إذا لم تنشر تغييرات، لإزالة آخر الالتزام، يمكنك القيام بذلك

$ git reset --hard HEAD^

(لاحظ أن هذا سيقوم أيضا بإزالة جميع التغييرات غير الملتزم بها؛ استخدم بعناية).

إذا نشرت بالفعل الالتزام المحذوفات، فاستخدم git العودة.

$ git revert HEAD
git reset --hard commitId

git push <origin> <branch> --force

ملاحظة: يرض الطرف الذي تريد العودة إليه

قل أننا نريد إزالة ارتكب 2 و 4 من الريبو.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

ملحوظة: تحتاج إلى الحصول على حقوق المسؤول على الريبو منذ أن تستخدم --hard و -f.

  • git checkout b3d92c5 الخروج آخر ارتكاب قابلة للاستخدام.
  • git checkout -b repair إنشاء فرع جديد للعمل عليه.
  • git cherry-pick 77b9b82 تشغيل من خلال الالتزام 3.
  • git cherry-pick 2c6a45b تشغيل من خلال الالتزام 1.
  • git checkout master ماجستير الخروج.
  • git reset --hard b3d92c5 إعادة تعيين ماجستير لآخر ارتكاب قابل للاستخدام.
  • git merge repair دمج فرعنا الجديد على ماجستير.
  • git push -f origin master دفع سيد إلى repo عن بعد.

تغيير التاريخ بقوة

على افتراض أنك لا ترغب فقط في حذف الالتزام الأخير، لكنك ترغب في حذف ارتكامات محددة من آخر يرتكب الأخير، اذهب مع:

git rebase -i HEAD~<number of commits to go back>, ، لذا git rebase -i HEAD~5 إذا كنت ترغب في رؤية ارتكاب الخمسة الأخيرة.

ثم في محرر النص تغيير الكلمة pick ل drop بجانب كل الالتزام كنت ترغب في إزالته. حفظ وإنهاء المحرر. هاهو!

تغيير تاريخ إضافي

محاولة git revert <commit hash>. يرجع سوف تنشئ أ الجديد الالتزام بالترفيه الالتزام المحدد.

إذا كنت ترغب في إصلاح آخر الالتزام، فيمكنك التراجع عن الالتزام، وتشغيل الملفات الموجودة فيه، من خلال:

git reset HEAD~1

سيعود ذلك مستودعك إلى حالته قبل إضافة الأوامر GIT التي نظمت الملفات. ستكون التغييرات الخاصة بك في دليل العمل الخاص بك. يشير الرأس ~ 1 إلى الالتزام أدناه الطرف الحالي للفرع.

إذا كنت ترغب في ارتكاب ارتكاب N، لكن احتفظ بتغييرات التعليمات البرمجية في دليل العمل الخاص بك:

git reset HEAD~N

إذا كنت ترغب في التخلص من آخر الالتزام، ولا تريد الاحتفاظ بتغييرات التعليمات البرمجية، يمكنك القيام بإعادة تعيين "الصعب".

git reset --hard HEAD~1

وبالمثل، إذا كنت ترغب في تجاهل آخر يرتكب آخر، ولا تريد الاحتفاظ بتغييرات التعليمات البرمجية:

git reset --hard HEAD~N
git rebase -i HEAD~2

هنا "2" هو عدد ارتكبك تريد إعادة ربطها.

'git rebase -i HEAD`

إذا كنت ترغب في إعادة ربط كل ارتكاب.

ثم ستتمكن من اختيار أحد هذه الخيارات.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

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

يمكنك ببساطة إزالة هذا الالتزام باستخدام الخيار "D" أو إزالة سطر يحتوي على ارتكابك.

للحذف في الفرع المحلي، استخدم

git reset --hard HEAD~1

للحذف في فرع بعيد، استخدم

git push origin HEAD --force

إليك طريقة أخرى للقيام بذلك:

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

git reset --hard COMMIT_ID

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

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

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

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

الخطأ:

أنا git rebase -i --root"إد فرعي، والتفكير بشكل تجسير في أنني أستطيع أن أبدت أول ارتكاب مختلف عن السيد ( جيثب لنظام التشغيل Windows. العرض الافتراضي هو المقارنة مع ماجستير، يختبئ أنه مجمل).

لقد نمت لحية وادي السيليكون في حين أن 900+ يرتكب أنفسهم في سامية. الخروج مع عدم وجود تغييرات، واشتقاما بطاريتي ثم انتقلت إلى حلاقة، حيث ارتكب جميع الفرد البالغ عددها 900 شخص Rebased مريئهم بشكل غير دمج حتى الآن.

مصممة على التغلب على GIT والحفاظ على الأوقات الأصلية، وحذفت هذا المستودع المحلي وإعادة استنساخ من جهاز التحكم عن بعد.

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

استنفاد الخيارات:

لم أتمنى ذلك git revert - سيقوم بإنشاء ارتكاب إضافي، وإعطاء جيت اليد العليا.

git reset --hard HEAD لم يفعل شيئا، بعد التحقق من reflog, ، الأخير وفقط HEAD كان استنساخ - جيت يفوز.

للحصول على أحدث شا، راجعت المستودع عن بعد على Github.com - الفوز الثانوي.

بعد التفكير git reset --hard <SHA> قد عملت، لقد قمت بتحديث فرع آخر إلى إتقان و 1 ... 2 ... Poof! واجه الالتزام - فوز جيت.

التحقق مرة أخرى إلى ماجستير، الوقت لمحاولة git rebase -i <SHA>, ، ثم أزل الخط ... دون جدوى، حزين ليقول. "إذا قمت بإزالة خط هنا، فسيتم فقد الالتزام". آه ... لامع على ميزة جديدة القزم n00b. في ال 2.8.3 ملاحظات الإصدار.

الحل:

git rebase -i <SHA> من ثم d, drop = remove commit.

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

https://twitter.com/olman/status/706006896273063936.

يوم جيد لك.

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

أعتقد أنه لا توجد وسيلة لإزالة الالتزام أوامر الخزف. وبعد الطريقة الوحيدة هي إزالتها من السجل والإجازات ثم لتنفيذ git prune --expire -now.

مصدر: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8.

حذف الالتزام الأخير

على سبيل المثال ارتكاب آخر

جيت دفع الأصل + AA61ab32 ^: ماجستير

الآن تريد حذف هذا الالتزام ثم طريقة سهلة للقيام بذلك التالية

خطوات

  1. أولا إعادة تعيين الفرع إلى الوالد من الالتزام الحالي

  2. القوة - دفعها إلى جهاز التحكم عن بعد.

git reset HEAD^ --hard

git push origin -f

لالتزام معين، تريد إعادة تعيين هو متابع

git reset bb676878^ --hard

git push origin -f

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

git commit --amend -m "New message here"

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

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

يمكنك أيضا تمرير خيار "No-Edit" بدلا من "-M" إذا كنت تفضل استخدام رسالة الالتزام السابقة.

مستندات:http://git-scm.com/docs/git-commit.html.

إذا كنت ترغب في الحفاظ على السجل، فيوضح الالتزام والعودة، يجب عليك استخدام:

git revert GIT_COMMIT_HASH

أدخل الرسالة التي تشرح لماذا تتسلم ثم:

git push  

عند إصدارها git log سترى كل من رسائل السجل "الخاطئة" والعودة.

إذا كنت قد دفعت بالفعل، فابحث أولا عن الالتزام الذي تريد أن تكون عليه في الرأس ($ git_commit_hash_here), ثم قم بتشغيل ما يلي:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

ثم كل مكان تم استنساخ الريبو، تشغيل:

git reset --hard origin/master

ما أقوم به عادة عندما ارتكب ويدفع (إذا دفع أي شخص يلتزم هذه المشكلة):

git reset --hard HEAD~1

git push -f origin

نأمل أن تكون هذه المساعدة

إعادة تعيين على الفرع المحلي

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

قوة دفع إلى الأصل

git push -f origin

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

git reset --hard HEAD
git clean -f
git pull

إذا كنت ترغب في الاحتفاظ بتغييراتك، وإزالة الالتزام الأخير

git reset --soft HEAD^
git pull

delete local commit

كما ترون على الصورة أعلاه أريد حذف العودة "اختبار التغيير 2" الالتزام (معرف SHA1: 015B5220C50E3DFB1063F23789D92AE1D3481A2.(يمكنك الحصول على معرف SHA1 باستخدام gitk أمر في جيت باش)).

لذلك يمكنني استخدام (كل شيء آخر يعمل على المحلي فقط. تحتاج إلى الضغط بعد الحذف):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 // أنها احتياطي لك هذا الالتزام (معرف SHA1 من اختبار التغيير 4. الالتزام 515B5220C50E3DFB1063F23789D92AE1D3481A2.)
  2. git reset --hard HEAD~1 // احتياطي لك قبل ارتكاب واحد.
  3. git reset --hard HEAD^ // لإزالة آخر الالتزام من الجيت

بعد حذف:

after delete commit

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

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

جيت إعادة تعيين --hard.

جيت دفع رأس المنشأ - فورسم

إذا تم وضع علامة واحدة أو أكثر من ارتكابها، حذف العلامة (العلامات) أولا. خلاف ذلك لا يتم إزالة الالتزام الموسوم.

// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

المرجعي: كيفية حذف الالتزام في git، المحلية والبعيدة

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

استخدام git العودة https:/git-scm.com/docs/git-revert. سوف يعيد كل التعليمات البرمجية ثم يمكنك القيام بالالتزام التالي. وسوف يشير الرأس إلى هذا الالتزام الأخير. عاد الرقيق أبدا حذف لكنه لن يؤثر عليك آخر مرة.

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