حذف ارتكب من فرع في جيت
-
20-09-2019 - |
سؤال
أود أن أعرف كيفية حذف الالتزام.
بواسطة 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" مع الإشارة التي تريد التخلص منها. "^" في هذا الأمر هو حرفي.
إذا لم تنشر تغييرات، لإزالة آخر الالتزام، يمكنك القيام بذلك
$ 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 ^: ماجستير
الآن تريد حذف هذا الالتزام ثم طريقة سهلة للقيام بذلك التالية
خطوات
أولا إعادة تعيين الفرع إلى الوالد من الالتزام الحالي
القوة - دفعها إلى جهاز التحكم عن بعد.
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" إذا كنت تفضل استخدام رسالة الالتزام السابقة.
إذا كنت ترغب في الحفاظ على السجل، فيوضح الالتزام والعودة، يجب عليك استخدام:
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
كما ترون على الصورة أعلاه أريد حذف العودة "اختبار التغيير 2" الالتزام (معرف SHA1: 015B5220C50E3DFB1063F23789D92AE1D3481A2.(يمكنك الحصول على معرف SHA1 باستخدام gitk
أمر في جيت باش)).
لذلك يمكنني استخدام (كل شيء آخر يعمل على المحلي فقط. تحتاج إلى الضغط بعد الحذف):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// أنها احتياطي لك هذا الالتزام (معرف SHA1 من اختبار التغيير 4. الالتزام 515B5220C50E3DFB1063F23789D92AE1D3481A2.)git reset --hard HEAD~1
// احتياطي لك قبل ارتكاب واحد.git reset --hard HEAD^
// لإزالة آخر الالتزام من الجيت
بعد حذف:
جيت إعادة تعيين --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 العودة https:/git-scm.com/docs/git-revert. سوف يعيد كل التعليمات البرمجية ثم يمكنك القيام بالالتزام التالي. وسوف يشير الرأس إلى هذا الالتزام الأخير. عاد الرقيق أبدا حذف لكنه لن يؤثر عليك آخر مرة.