كيف يمكنني العودة من حالتي الحالية إلى لقطة تم تنفيذها على التزام معين؟
إذا قمت بـ git log
، فعندئذٍ أحصل على الإخراج التالي:
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
كيف يمكن الرجوع إلى الالتزام من 3 نوفمبر ، أي الالتزام 0d1d7fc
؟
هذا يعتمد كثيرا على ما تقصد ب "العودة".
إذا كنت ترغب في العودة إليها مؤقتًا ، والاستغفار ، ثم العودة إلى حيث أنت ، كل ما عليك فعله هو التحقق من الالتزام المطلوب:
# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32
أو إذا كنت ترغب في القيام بالتعهدات أثناء وجودك هناك ، فاستمر في إنشاء فرع جديد أثناء وجودك فيه:
git checkout -b old-state 0d1d7fc32
للعودة إلى المكان الذي كنت فيه ، فقط تحقق من الفرع الذي كنت فيه مرة أخرى. (إذا قمت بإجراء تغييرات ، كما هو الحال دائمًا عند التبديل بين الفروع ، فسيتعين عليك التعامل معها حسب الاقتضاء. يمكنك إعادة التعيين لرميها بعيدًا ؛ يمكنك التخزين المؤقت والخروج والدخول السريع لأخذها معك ؛ يمكنك الالتزام لهم إلى فرع هناك إذا كنت تريد فرع هناك.)
من ناحية أخرى ، إذا كنت ترغب حقًا في التخلص من كل ما قمت به منذ ذلك الحين ، فهناك احتمالان. إحداهما ، إذا لم تنشر أيًا من هذه الالتزامات ، فقم بإعادة تعيين:
# 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.
إذا كنت في حالة من الفوضى ، فقد ألغيت بالفعل تغييراتك المحلية ، ولكن يمكنك على الأقل العودة إلى ما كنت عليه من قبل من خلال إعادة التعيين مرة أخرى.
من ناحية أخرى ، إذا كنت قد نشرت العمل ، فربما لا ترغب في إعادة تعيين الفرع ، نظرًا لأن هذا يعيد كتابة السجل بشكل فعال. في هذه الحالة ، يمكنك بالفعل العودة إلى التعهدات. باستخدام Git ، يكون للرجوع معنى محدد للغاية: إنشاء التزام باستخدام التصحيح العكسي لإلغائه. بهذه الطريقة لا تعيد كتابة أي سجل.
# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053
# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD
#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053
# Reverting a merge commit
git revert -m 1 <merge_commit_sha>
# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .
# Then commit. Be sure and write a good message describing what you just did
git commit
تغطي git-revert
manpage في الواقع الكثير من هذا في وصفه. رابط آخر مفيد هو هذا القسم git-scm.com يناقش git-revert .
إذا قررت أنك لا تريد العودة بعد كل شيء ، فيمكنك العودة إلى الخلف (كما هو موضح هنا) أو إعادة التعيين إلى ما قبل العودة (انظر القسم السابق).
قد تجد هذه الإجابة مفيدة في هذه الحالة:
كيفية نقل HEAD العودة إلى موقع سابق؟ (رأس منفصل)
للعودة إلى التزام سابق ، مع تجاهل أي تغييرات:
git reset --hard HEAD
حيث HEAD هو الالتزام الأخير في فرعك الحالي
للعودة إلى التزام أقدم من الالتزام الأخير:
# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced
# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}
git commit -m "Revert to 56e05fced"
# Updates working copy to reflect the new commit
git reset --hard
الاعتمادات تذهب إلى سؤال مماثل في Stack Overflow ،الرجوع إلى التزام من قبل SHA _ التجزئة في Git؟.
الكثير من الإجابات المعقدة والخطيرة هنا ، لكنها في الواقع سهلة:
git revert --no-commit 0766c053..HEAD
git commit
سيعيد هذا كل شيء من HEAD إلى تجزئة الالتزام ، مما يعني أنه سيعيد إنشاء حالة الالتزام في شجرة العمل كما لو / كل التزام منذ أن تم إرجاعه. يمكنك بعد ذلك الالتزام بالشجرة الحالية ، وسيخلق التزامًا جديدًا معادلًا للالتزام الذي "عادت إليه".
(تسمح العلامة --no-commit
بإرجاع بوابة جميع الإلتزامات مرة واحدة - وإلا فستتم مطالبتك برسالة لكل التزام في النطاق ، وتناثر السجل مع إلتزامات جديدة غير ضرورية.)
هذا هو طريقة آمنة وسهلة للعودة إلى الحالة السابقة . لا يتم تدمير أي سجل ، لذلك يمكن استخدامه لالتزامات تم الإعلان عنها بالفعل.
الخيار الأفضل بالنسبة لي وربما الآخرين هو خيار Git reset:
git reset --hard <commidId> && git clean -f
كان هذا هو الخيار الأفضل بالنسبة لي! انها بسيطة وسريعة وفعالة!
ملاحظة: كما هو مذكور في التعليقات ، لا تفعل هذا إذا كنت تشارك فرعك مع أشخاص آخرين لديهم نسخ من الإلتزامات القديمة
وأيضًا من التعليقات ، إذا كنت تريد استخدام طريقة أقل تشويشًا فيمكنك استخدامها
git clean -i
قبل الإجابة ، دعونا نضيف بعض الخلفية ، وشرح ما هو HEAD
هذا.
First of all what is HEAD?
HEAD
هو مجرد إشارة إلى الالتزام الحالي (الأحدث) في الفرع الحالي. لا يمكن أن يكون هناك سوى HEAD
في أي وقت محدد (باستثناء git worktree
).
يتم تخزين محتوى HEAD
داخل .git/HEAD
، ويحتوي على 40 بايت SHA-1 من الالتزام الحالي.
detached HEAD
إذا لم تكن على أحدث التزام - بمعنى أن HEAD
يشير إلى التزام سابق في التاريخ ، فسيتم تسميتهdetached HEAD
.
في سطر الأوامر ، سيبدو هكذا - SHA-1 بدلاً من اسم الفرع لأن HEAD
لا يشير إلى طرف الفرع الحالي:
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
هذا سوف الخروج فرع جديد مشيرا إلى الالتزام المطلوب. وهذا الأمر الخروج إلى التزام معين.
في هذه المرحلة ، يمكنك إنشاء فرع والبدء في العمل من هذه النقطة على:
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# Create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
يمكنك دائمًا استخدام reflog
أيضًا. سيعرض git reflog
أي تغيير قام بتحديث HEAD
وسيقوم التحقق من إدخال إعادة التسجيل المطلوب بتعيين HEAD
مرة أخرى على هذا الالتزام.
في كل مرة يتم فيها تعديل HEAD سيكون هناك إدخال جديد في reflog
git reflog
git checkout [email protected]{...}
هذا سوف يعيدك إلى الالتزام الذي تريده
git reset HEAD --hard <commit_id>
"نقل" رأسك مرة أخرى إلى الالتزام المطلوب.
# 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.
git rebase --no-autostash
أيضًا.يوضح هذا المخطط أي أمر يفعل ما. كما ترون هناك reset && checkout
قم بتعديل HEAD
.
إذا كنت ترغب في "إلغاء الالتزام" ، ومسح آخر رسالة التزام ، وإعادة الملفات المعدلة مرة أخرى في التدريج ، يمكنك استخدام الأمر:
git reset --soft HEAD~1
--soft
إلى أنه يجب الاحتفاظ بالملفات غير الملتزم بها كملفات عاملة مقابل --hard
والتي ستتجاهلها.HEAD~1
هو الالتزام الأخير. إذا كنت ترغب في التراجع عن 3 إلتزامات ، يمكنك استخدام HEAD~3
. إذا كنت ترغب في العودة إلى رقم مراجعة محدد ، فيمكنك أيضًا القيام بذلك باستخدام تجزئة SHA الخاصة به.هذا أمر مفيد للغاية في الحالات التي ارتكبت فيها الشيء الخطأ وتريد التراجع عن هذا الالتزام الأخير.
المصدر: http://nakkaya.com/2009/09/24/git-delete-last-commit/
لقد جربت الكثير من الطرق لعكس التغييرات المحلية في Git ، ويبدو أن هذا يعمل بشكل أفضل إذا كنت ترغب فقط في العودة إلى أحدث حالة التزام.
git add . && git checkout master -f
وصف قصير:
git revert
.git checkout <commithashcode>
.لقد وجدت طريقة أكثر ملاءمة وبساطة لتحقيق النتائج أعلاه:
git add . && git reset --hard HEAD
حيث HEAD يشير إلى الالتزام الأخير في الفرع الحالي.
إنه رمز الشفرة نفسه الذي اقترحه boulder_Ruby ، لكنني أضفت git add .
قبل git reset --hard HEAD
لمحو جميع الملفات الجديدة التي تم إنشاؤها منذ الالتزام الأخير لأن هذا ما يتوقعه معظم الناس وأعتقد أنه عند الرجوع إلى أحدث التزام.
يمكنك القيام بذلك عن طريق الأمرين التاليين:
git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f
سيؤدي ذلك إلى إزالة التزام Git السابق.
إذا كنت تريد الاحتفاظ بالتغييرات التي أجريتها ، يمكنك أيضًا استخدام:
git reset --soft [previous Commit SHA id here]
ثم سيوفر التغييرات الخاصة بك.
حسنا ، العودة إلى الالتزام السابق في بوابة أمر سهل للغاية ...
العودة إلى الوراء دون حفظ التغييرات:
git reset --hard <commit>
العودة مع حفظ التغييرات:
git reset --soft <commit>
قم بشرح الآتي: باستخدام إعادة تعيين git ، يمكنك إعادة التعيين إلى ولاية معينة ، ومن الشائع استخدامه مع تجزئة الالتزام كما ترى أعلاه.
ولكن كما ترى ، فإن الفرق يستخدم العلامتين --soft
و --hard
، بشكل افتراضي git reset
باستخدام إشارة --soft
، لكنها ممارسة جيدة تستخدم العلم دائمًا ، أشرح كل علامة:
العلم الافتراضي كما هو موضح ، لا يحتاج إلى توفيره ، لا يغير شجرة العمل ولكنه يضيف جميع التغييرات إلى ملفات جاهزة للالتزام ، لذلك تعود إلى حالة الالتزام التي تتغير فيها الملفات.
كن حذرًا مع هذا العلم ، حيث يعيد تعيين الشجرة العاملة وجميع التغييرات إلى الملفات المتعقبة وسيتم إزالتها جميعًا!
لقد أنشأت أيضًا الصورة أدناه التي قد تحدث في الحياة الواقعية باستخدام git:
لا شيء هنا يعمل لي بصرف النظر عن هذه المجموعة بالضبط:
git reset --hard <commit_hash>
git Push Origin <branch_name> --force
المفتاح هنا هو إجبار Push ، لا توجد رسائل/التزام إضافي.
لنفترض أنه لديك الإرشادات التالية في ملف نصي باسم ~/commits-to-revert.txt
(اعتدت git log --pretty=oneline
للحصول عليها)
fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca
قم بإنشاء Bash Shell script للعودة إلى كل منها:
#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
git revert $i --no-commit
done
يؤدي هذا إلى إعادة كل شيء إلى الحالة السابقة ، بما في ذلك إنشاء الملفات والدليل ، وعمليات الحذف ، وارتكبها إلى فرعك وتحتفظ بالمحفوظات ، لكنك عادت إلى نفس بنية الملف. لماذا Git ليس لديه git revert --to <hash>
خارج عن ارادتي.
حلول Jefromi هي بالتأكيد أفضل الحلول ، ويجب عليك بالتأكيد استخدامها. ومع ذلك ، من أجل الاكتمال ، أردت أيضًا عرض هذه الحلول البديلة الأخرى التي يمكن استخدامها أيضًا لعكس الالتزام (بمعنى أنك تنشئ التزامًا جديدًا يلغي التغييرات في الالتزام السابق ، فقط مثل ما git revert
يفعل).
لتوضيح الأمر ، فإن هذه البدائلليست أفضل طريقة للعودة إلى الإلتزامات، حلول Jefromi هي ، لكنني أريد فقط الإشارة إلى أنه يمكنك أيضًا استخدام هذه الطرق الأخرى لتحقيق نفس الشيء مثل git revert
.
هذه نسخة معدلة قليلاً من حل Charles Bailey لـ الرجوع إلى التزام من قبل SHA تجزئة في Git؟ :
# Reset the index to the desired commit
git reset --hard <commit>
# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}
# Commit the changes
git commit -m "Revert to <commit>"
يعمل هذا بشكل أساسي من خلال استخدام حقيقة أن إعادة التعيينات السهلة ستترك حالة الالتزام السابق على مراحل في منطقة الفهرس/التدريج ، والتي يمكنك الالتزام بها.
يأتي هذا الحل من حل svick إلى Checkout old الالتزام وجعله التزامًا جديدًا :
git rm -r .
git checkout <commit> .
git commit
على غرار البديل رقم 1 ، فإن هذا يعيد إنتاج حالة <commit>
في نسخة العمل الحالية. من الضروري القيام بـ git rm
أولاً لأن git checkout
لن يزيل الملفات التي تمت إضافتها منذ <commit>
.
على افتراض أنك تتحدث عن ماجستير وعلى ذلك الفرع (على سبيل المثال ، قد يكون هذا هو أي فرع عمل تهتم به):
# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
# Reset remote master branch to November 3rd commit ID
git Push -f Origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master
لقد وجدت الإجابة من منشور مدونة (لم يعد موجودًا الآن)
لاحظ أن هذا هو "إعادة تعيين وفرض التغيير" على جهاز التحكم عن بُعد ، بحيث إذا كان الآخرون في فريقك قد سحبوا بالفعل ، فستتسبب في حدوث مشكلات لهم. إنك تدمر تاريخ التغيير ، وهذا هو سبب مهم لاستخدام الناس بوابة في المقام الأول.
من الأفضل استخدام الرجوع (انظر الإجابات الأخرى) من إعادة التعيين. إذا كنت فريقًا واحدًا ، فربما لا يهم.
إليك طريقة أبسط بكثير للعودة إلى الالتزام السابق (والحصول عليها في حالة غير ملتزم بها ، لتفعله بكل ما تريد):
git reset HEAD~1
لذلك ، لا حاجة لارتكاب معرفات وهلم جرا :)
بعد كل التغييرات ، عندما تضغط على كل هذه الأوامر ، قد تضطر إلى استخدام:
git Push -f ...
وليس فقط git Push
.
هناك أمر (ليس جزءًا من Git الأساسية ، ولكنه موجود في git-extras package) خصيصًا للعودة إلى العمليات القديمة وتنفيذها:
git back
لكل صفحة man ، يمكن استخدامه أيضًا على هذا النحو:
# Remove the latest three commits
git back 3
يمكنك إكمال كل هذه الخطوات الأولية بنفسك والعودة إلى بوابة الريبو.
اسحب أحدث إصدار من مستودعك من Bitbucket باستخدام الأمر git pull --all
.
قم بتشغيل الأمر git log باستخدام -n 4 من الجهاز الطرفي. يحدد الرقم بعد - n عدد مرات التعيين في السجل بدءًا من الالتزام الأخير في السجل المحلي.
$ git log -n 4
أعد تعيين رأس سجل المستودع الخاص بك باستخدام git reset --hard HEAD~N
حيث N هو عدد مرات التعيينات التي تريد استعادتها. في المثال التالي ، سيتم إعادة تعيين التزام واحد ، إلى آخر التزام في سجل المستودع:
ادفع التغيير إلى git repo باستخدام git Push --force
لفرض دفع التغيير.
إذا كنت تريد مستودع بوابة إلى التزام سابق
git pull --all
git reset --hard HEAD~1
git Push --force
الرجوع إلى الأحدث الالتزام وتجاهل جميع التغييرات المحلية:
git reset --hard HEAD
حدد الالتزام المطلوب ، وتحقق منه
git show HEAD
git show HEAD~1
git show HEAD~2
حتى تحصل على الالتزام المطلوب. لجعل HEAD أشر إلى ذلك ، افعل
git reset --hard HEAD~1
أو git reset --hard HEAD~2
أو أيا كان.
git stash
git stash clear
يمسح مباشرةً جميع التغييرات التي أجريتها منذ الالتزام الأخير.
PS: لديه مشكلة صغيرة. كما يحذف كل ما قمت مؤخرا بتخزين خبأ التغييرات. الذي أعتقد في معظم الحالات يجب أن لا يهم.
للاحتفاظ بالتغييرات من الالتزام السابق بـ HEAD والانتقال إلى الالتزام السابق ، قم بما يلي:
git reset <SHA>
إذا كانت التغييرات غير مطلوبة من الالتزام السابق بـ HEAD وتجاهل كل التغييرات ، فقم بما يلي:
git reset --hard <SHA>
لتنظيف دليل المبرمج بالكامل من بعض التغييرات العرضية ، استخدمنا:
git add -A .
git reset --hard HEAD
فقط git reset --hard HEAD
ستتخلص من التعديلات ، لكنها لن تتخلص من الملفات "الجديدة". في حالتهم ، قاموا عن طريق الخطأ بسحب مجلد مهم عشوائيًا في مكان ما ، وتم التعامل مع كل هذه الملفات كملف جديد بواسطة Git ، لذلك لم يتم إصلاحه في reset --hard
. عن طريق تشغيل الرمز git add -A .
مسبقًا ، فإنه يتعقبهم جميعًا بشكل صريح من خلال بوابة git ، ليتم محوها بواسطة إعادة التعيين.
أعتقد أن بعض الأشخاص قد يتوصلون إلى هذا السؤال ويريدون معرفة كيفية التراجع عن التغييرات التي أجراها على سيدهم - أي رمي كل شيء بعيدًا والعودة إلى Origin/master ، وفي هذه الحالة ، قم بذلك:
git reset --hard Origin/master
https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master
العودة هي أمر التراجع عن الإلتزامات.
git revert <commit1> <commit2>
عينة:
git revert 2h3h23233
إنه قادر على أخذ النطاق من HEAD كما هو موضح أدناه. هنا 1 يقول "العودة الالتزام الأخير".
git revert HEAD~1..HEAD
ثم git Push
التراجع عن الالتزام الأخير:
git reset --hard HEAD
HEAD
هو مجرد إشارة إلى الالتزام الحالي (الأحدث) في الفرع الحالي. لا يمكن أن يكون هناك سوى HEAD
في أي وقت معين.
الرجوع إلى التزام أقدم: إن أسرع طريقة لاستعادة إصدار قديم هي استخدام الأمر reset
:
# Resets index to former commit
git reset 56e05fced
# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}
# Updates working copy to reflect the new commit
git reset --hard
سيؤدي ذلك إلى إرجاع فرع HEAD إلى الإصدار المحدد. جميع الالتزامات التي جاءت بعد هذا الإصدار يتم التراجع عنها بشكل فعال ؛ مشروعك هو بالضبط كما كان في تلك المرحلة الزمنية.
يأتي الأمر reset مع اثنين من الخيارات ، أحدها الأكثر إثارة للاهتمام هو العلم --soft
. إذا كنت تستخدمه بدلاً من --hard
، فستحتفظ Git بجميع التغييرات في تلك "التراجع" عن التعديلات المحلية.
كما قيل ، فإن استخدام أمر إعادة التعيين في فرع HEAD
الخاص بك هو إجراء جذري للغاية: سيؤدي إلى إزالة أي تعهدات (في هذا الفرع) جاءت بعد المراجعة المحددة. إذا كنت متأكدًا من أن هذا هو ما تريد ، فكل شيء على ما يرام.
ومع ذلك ، هناك أيضًا طريقة {أكثر أمانًا في حال كنت تفضل ترك فرعك الحاليHEAD دون تغيير. نظرًا لأن "الفروع" رخيصة جدًا وسهلة في Git ، يمكننا بسهولة إنشاء فرع جديد يبدأ في هذا الإصدار القديم:
git checkout -b old-project-state 0ad5a7a6
عادة ، يتم استخدام الأمر checkout لتبديل الفروع فقط. ومع ذلك ، بتوفير المعلمة -b ، يمكنك أيضًا السماح لها بإنشاء فرع جديد (المسمى old-project-state في هذا المثال). إذا كنت لا تريد أن تبدأ في المراجعة الحالية HEAD ، فستحتاج أيضًا إلى توفير تجزئة التزام - مراجعة المشروع القديمة التي نريد استعادتها.
لديك الآن فرع جديد باسم old-project-state يعكس النسخة القديمة من مشروعك - دون لمس أو حتى إزالة أي تعهدات أو فروع أخرى.
إذا كان الموقف هو حالة عاجلة ، وتريد فقط أن تفعل ما طلبه السائل في سريعة وقذرة طريقة ، بافتراض أن مشروعك تحت الدليل "مشروعي":
انسخ الدليل بالكامل واسمه شيئًا آخر ، مثل "مشروعي - نسخة"
فعل:
git reset --hard [first-4-letters&numbers-of-commit's-SHA]
لديك بعد ذلك نسختان على نظامك ... يمكنك فحص أو نسخ أو تعديل الملفات المهمة ، أو أيا كان ، من الالتزام السابق. يمكنك تجاهل الملفات تمامًا ضمن "نسخة مشروعي - نسخة" ، إذا كنت قد قررت أن العمل الجديد لن يؤدي إلى أي مكان ...
الشيء الواضح إذا كنت ترغب في متابعة حالة المشروع دون التخلي فعليًا عن العمل نظرًا لأن هذا الالتزام المسترد هو إعادة تسمية الدليل مرة أخرى: حذف المشروع الذي يحتوي على الالتزام المسترد (أو إعطائه اسمًا مؤقتًا) وإعادة تسمية " مشروعي - نسخ "الدليل مرة أخرى إلى" مشروعي ". ثم ربما تفعل آخر ارتكاب قريبا إلى حد ما.
يعد Git إنشاءًا رائعًا ولكن لا يمكنك "التقاطه سريعًا": أيضًا الأشخاص الذين يحاولون شرحه كثيرًا جدًا / يفترضون معرفة مسبقة بـ VCS [أنظمة التحكم في الإصدار] الأخرى والتخلص من البيانات البعيدة عميقًا جدًا في وقت مبكر جدًا ، وارتكاب جرائم أخرى ، مثل استخدام مصطلحات قابلة للتبديل من أجل "السحب" - بطرق تظهر في بعض الأحيان تقريبًا محيرة لإرباك المبتدئين.
لكي تنقذ نفسك كثيرًا من الضغط عليك أن تقرأ كتابًا عن Git - أوصي "Control Version with Git" . وإذا كنت تستطيع الوثوق بي (أو بالأحرى الندوب الخاصة بي) عندما أقول "تضطر إلى" ، فذلك يعني أنك قد تفعل ذلكNOW. الكثير من تعقيد جيت يأتي من المتفرعة ومن ثم الظهور. ولكن من خلال سؤالك ، هناك لا يوجد سبب يدعو الناس إلى تعميكم بالعلم .
خاصةً إذا كان هذا وضعًا يائسًا على سبيل المثال وكنت مبتدئًا في Git!
ملاحظة: فكرة أخرى: من السهل جدًا الآن الاحتفاظ بمستودع Git ("repo") في دليل غير الدليل الذي يحتوي على ملفات العمل. هذا يعني أنك لن تضطر إلى نسخ مستودع Git بالكامل باستخدام الحل السريع والقذر أعلاه. راجع إجابة Fryer باستخدام - منفصلة - git-dir هنا . كن حذرًا ، على الرغم من: إذا كان لديك مستودع "دليل منفصل" لا تنسخه ، وقمت بإعادة تعيين ثابت ، فستفقد جميع الإصدارات اللاحقة لالتزام إعادة التعيين إلى الأبد ، ما لم يكن لديك ، كما ينبغي لك تمامًا ، احتفظ بنسخة احتياطية من مستودعك ، ويفضل أن يكون ذلك على السحابة (مثل Google Drive ) بين أماكن أخرى.
حاول إعادة تعيين الالتزام المطلوب -
git reset <COMMIT_ID>
(للتحقق من استخدام COMMIT_ID git log
)
سيؤدي ذلك إلى إعادة تعيين جميع الملفات التي تم تغييرها إلى حالة غير مضافة.
الآن يمكنك checkout
جميع الملفات غير المضافة بواسطة
git checkout .
تحقق من git log
للتحقق من تغييراتك.
تحديث
إذا كان لديك واحد وفقط ارتكاب في الريبو الخاص بك ، حاول
git update-ref -d HEAD
الحذر! هذا الأمر يمكن أن يسبب فقدان سجل الالتزام ، إذا قام المستخدم بوضع خطأ ارتكب خطأ. احرص دائمًا على الاحتفاظ بنسخة احتياطية إضافية من حسابك في أي مكان آخر في حالة ارتكاب أخطاء ، مما أنت عليه أكثر أمانًا. :)
لقد واجهت مشكلة مماثلة وأردت العودة إلى الالتزام السابق. في حالتي ، لم أكن مهتمًا بالاحتفاظ بأحدث التزام ، ومن ثم فقد استخدمت Hard
.
هذه هي الطريقة التي فعلت بها:
git reset --hard CommitId && git clean -f
سيعود هذا إلى المستودع المحلي ، هنا بعد استخدام git Push -f
سيتم تحديث المستودع عن بُعد.
git Push -f
نظرًا لأن التزاماتك يتم دفعها عن بُعد ، فأنت بحاجة إلى إزالتها. واسمحوا لي أن أفترض أن فرعك يتطور ويتم دفعه فوق الأصل.
تحتاج أولاً إلى إزالة التطوير من الأصل:
git Push Origin :develop (note the colon)
ثم تحتاج إلى تطوير إلى الحالة التي تريدها ، واسمحوا لي أن نفترض أن تجزئة الالتزام هي EFGHIJK:
git reset --hard EFGHIJK
أخيرًا ، اضغط تطوير مرة أخرى:
git Push Origin develop
على GitKraken يمكنك القيام بذلك:
Obs. : يجب أن تكون حريصًا لأن كل تاريخ الالتزام بعد إعادة التعيين الثابت قد ضاع وهذا الإجراء لا رجعة فيه. عليك أن تكون متأكدا مما تفعله.
إذا كنت ترغب في تصحيح بعض الأخطاء في الالتزام الأخير ، فسيتم استخدام بديل جيد git الالتزام - تعديل الأمر. إذا لم يتم الإشارة إلى الالتزام الأخير بأي مرجع ، فسيؤدي ذلك الحيلة ، حيث إنه ينشئ التزامًا مع نفس الوالد كما الالتزام الأخير. إذا لم تكن هناك إشارة إلى الالتزام الأخير ، فسيتم تجاهله ببساطة وسيكون هذا الالتزام هو الالتزام الأخير. هذه طريقة جيدة لتصحيح الإلتزامات دون الرجوع إلى الإلتزامات. ومع ذلك فقد القيود الخاصة به.
أولاً ، احصل على السلسلة التي تحدد الالتزام في تاريخ ما ، بما يلي:
git rev-list -n 1 --before="2009-07-27 13:37" Origin/master
يقوم بطباعة معرف الالتزام ، واتخاذ السلسلة (على سبيل المثال XXXX) والقيام بما يلي:
git checkout XXXX
للتراجع (أو للعودة):
- git revert - no-الالتزام "الالتزام بإزالة الرمز" HEAD (على سبيل المثال git revert - no-الالتزام d57a39d HEAD)
- بوابة ارتكاب
- بوابة دفع
جرب ما سبق خطوتين ، وإذا وجدت أن هذا هو ما تريد ، فعندئذ اضغط على Push.
إذا وجدت شيئًا خاطئًا ، فقم بما يلي:
بوابة العودة - قصيرة
ويمكن القيام به أسهل بكثير مع SourceTree . انقر بزر الماوس الأيمن على الالتزام الذي تبحث عنه واختر "Checkout" من القائمة.
حل آخر أبسط ؛ يجب عليك تغيير الفرع للقيام بذلك ، ولكن بعد ذلك يمكنك فقط تشغيل:
git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
لم أستطع الرجوع يدويًا لسبب ما ، لذلك كيف انتهى بي الأمر.
git reflog
اختر عدد HEAD (s) من إعادة التسجيل git ، حيث تريد العودة والقيام به (على سبيل المثال ، اخترت 12):
git reset [email protected]{12} --hard
تتمثل الطريقة الأقل تعقيدًا في تحويل فرع إلى أي التزام معين حيث لا يمكنك تغيير السجل الذي وجدته إلى:
مثل:
echo 'ref: refs/heads/example' > .git/HEAD
إذا قمت بعد ذلك بوضع git ، فيجب أن ترى كل التغييرات بين الفرع الذي تعمل فيه والشركة التي ترغب في الرجوع إليها.
إذا كان كل شيء يبدو جيدا يمكنك ارتكابها. يمكنك أيضًا استخدام git diff revert..example للتأكد من أنها متشابهة.
إذا كنت ترغب في التراجع مؤقتًا عن التغييرات بسبب
يمكنك البحث عن التزام العمل الأخير باستخدام سجل بوابة ثم تشغيل
git rebase --onto <commitId>
عندما يعمل الفرع البعيد مرة أخرى ، يمكنك ذلك
git pull --rebase
هذه الطريقة أفضل من الخروج من البوابة لإجراء تغييرات مؤقتة ، لأنك لست في حالة منفصلة.
إعادة تعيين التغييرات والالتزامات المرحلية
يتيح لك الأمر git reset
تغيير HEAD- وهو آخر نقطة تلتزم بها شجرة العمل الخاصة بك إلى مستودعك. إنه يعدل إما منطقة التدريج أو منطقة التدريج وشجرة العمل. تعني قدرة Git على صياغة ما تريده تمامًا أنك تحتاج أحيانًا إلى التراجع عن التغييرات التي أجريتها باستخدام git add. يمكنك القيام بذلك عن طريق الاتصال بـ git reset HEAD <file to change>
. لديك خياران للتخلص من التغييرات تمامًا. git checkout HEAD <file(s) or path(s)>
هي طريقة سريعة للتراجع عن التغييرات في منطقة التدريج وشجرة العمل. كن حذرا مع هذا الأمر ، لأنه يزيل جميع التغييرات على شجرة العمل الخاصة بك. لا يعلم Git عن تلك التغييرات لأنها لم تلتزم مطلقًا. لا توجد طريقة لاستعادة هذه التغييرات بمجرد تشغيل هذا الأمر. أمر آخر تحت تصرفك هو git reset --hard
. إنه مدمر بنفس القدر لشجرة العمل الخاصة بك - أي تغييرات غير ملتزم بها أو التغييرات المرحلية تضيع بعد تشغيلها. تشغيل git reset -hard
HEAD يقوم بنفس الشيء مثل git checkout HEAD. لا يتطلب الأمر فقط ملفًا أو مسارًا للعمل. يمكنك استخدام --soft
مع git reset.It reset repository to the الالتزام الذي تحدده ومراحل كل هذه التغييرات. لن تتأثر أي تغييرات قمت بتنظيمها بالفعل ، ولا تتأثر بالتغييرات في شجرة العمل الخاصة بك. أخيرًا ، يمكنك استخدام --mixed
لإعادة تعيين شجرة العمل دون إجراء أية تغييرات. هذا أيضًا يؤدي إلى إلغاء تثبيت أي تغييرات يتم تنظيمها.
العودة إلى الوراء
أحيانا نخطئ. يتم دفع الالتزام الذي لم يكن من المفترض مشاركته إلى مستودع عام ، أو أن هناك خطأ لا يمكن إصلاحه وتحتاج إلى التراجع عنه ، أو ربما لن تحتاج إلى هذا الرمز بعد الآن. هذه الحالات جميعها اتصل بـ git revert
. الأمر git revert
يفعل ما قد تتوقعه. يرجع إلى التزام واحد عن طريق تطبيق التزام عكسي بالتاريخ. في بعض الأحيان تحتاج إلى التراجع عن عدة التزامات للتراجع عن التغيير تمامًا. يمكنك استخدام -no-commit
، أو يمكنك استخدام -n
لإخبار Git بأداء الإرجاع ولكن لا ترقى إلى مستوى الالتزام بالتغيير. يتيح لك هذا الجمع بين كل عمليات العودة إلى التزام واحد ، وهو أمر مفيد إذا كنت بحاجة إلى العودة إلى ميزة تمتد عبر عدة التزامات. تأكد من أنك ترجع الإلتزامات بترتيب عكسي - أحدث التزام أولاً. خلاف ذلك ، قد تخلط بين Git ومحاولة العودة إلى رمز غير موجود حتى الآن.