سؤال

كيف يمكنني الرجوع من الحالة الراهنة إلى لقطة على بعض يرتكبها ؟

إذا كنت تفعل git log, ثم أحصل على الناتج التالي:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
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.

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

التراجع عن نشر يرتكب جديدة تلزم

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

# 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 --no-commit 0766c053..HEAD
git commit

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

(ال --no-commit يتيح Flag لـ Git إعادة جميع الاهتمامات في وقت واحد- وإلا فإنك تتم مطالبتك برسالة لكل التزام في النطاق ، مما يتناثر على تاريخك مع ارتباطات جديدة غير ضرورية.)

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

المبرمج المارقة؟

العمل بمفردك وتريد فقط أن تعمل؟ اتبع هذه التعليمات أدناه ، لقد عملوا بشكل موثوق بالنسبة لي والعديد من الآخرين لسنوات.

العمل مع الآخرين؟ Git معقدة. اقرأ التعليقات أدناه هذه الإجابة قبل أن تفعل شيئًا طفحًا.

عودة نسخة العمل إلى أحدث الالتزام

للعودة إلى التزام سابق ، متجاهلة أي تغييرات:

git reset --hard HEAD

حيث يكون الرأس الالتزام الأخير في فرعك الحالي

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

للعودة إلى الالتزام الأقدم من الالتزام الأحدث:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

اعتمادات تذهب إلى سؤال فائض مكدس مماثل ، العودة إلى الالتزام من قبل تجزئة SHA في git؟.

الخيار الأفضل بالنسبة لي وربما الآخرين هو خيار إعادة تعيين GIT:

git reset --hard <commidId> && git clean -f

لقد كان هذا هو الخيار الأفضل بالنسبة لي! انها بسيطة وسريعة وفعالة!


ملحوظة : كما ذكر في التعليقات ، لا تفعل ذلك إذا كنت تشارك فرعك مع أشخاص آخرين لديهم نسخ من الالتزامات القديمة

أيضًا من التعليقات ، إذا كنت تريد طريقة أقل "ballzy" يمكنك استخدامها

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.

Enter image description here

على سطر الأوامر ، سيبدو هكذا - SHA -1 بدلاً من اسم الفرع منذ HEAD لا يشير إلى طرف الفرع الحالي:

Enter image description here


بعض الخيارات حول كيفية التعافي من رأس منفصل:


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 والتحقق من إدخال reflog المطلوب سيقوم بتعيين ملف HEAD العودة إلى هذا الالتزام.

في كل مرة يتم تعديل الرأس ، سيكون هناك إدخال جديد في reflog

git reflog
git checkout HEAD@{...}

سيعود هذا إلى الالتزام المطلوب

Enter image description here


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 2.7) يمكنك أيضا استخدام git rebase --no-autostash كذلك.

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

Enter image description here

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

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

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

مصدر: http://nakkaya.com/2009/09/24/git-delete-last-commit/

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

git add . && git checkout master -f

وصف قصير:

  • وسوف يتم إنشاء أي يرتكب كما git revert لا.
  • لن افصل راسك مثل git checkout <commithashcode> لا.
  • فإنه سيتم تجاوز كل التغيرات المحلية و حذف جميع الملفات المضافة منذ آخر يرتكب في الفرع.
  • أنها لا تعمل إلا مع فروع الأسماء ، حتى تتمكن من العودة فقط إلى أحدث الالتزام في فرع بهذه الطريقة.

وجدت أكثر من ذلك بكثير مريحة وبسيطة طريقة لتحقيق النتائج أعلاه:

git add . && git reset --hard 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 أمر سهل للغاية ...

العودة دون الحفاظ التغييرات:

git reset --hard <commit>

العودة مع الحفاظ التغييرات:

git reset --soft <commit>

يشرح: باستخدام GIT Reset ، يمكنك إعادة التعيين إلى حالة معينة ، فمن الشائع استخدامها مع تجزئة الالتزام كما تراه أعلاه.

ولكن كما ترى الفرق هو استخدام العلمتين --soft و --hard, ، بشكل افتراضي git reset استخدام --soft العلم ، لكنها ممارسة جيدة دائمًا باستخدام العلم ، أشرح كل علامة:


--لين

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


--الصعب

كن حذرًا في هذا العلم ، فإنه يعيد ضبط شجرة العمل وجميع التغييرات على الملفات التي تم تتبعها وسيختفي الجميع!


قمت أيضًا بإنشاء الصورة أدناه التي قد تحدث في حياة حقيقية تعمل مع GIT:

git reset to a 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 --hard <commit_hash>
git push origin <branch_name> --force

المفتاح هنا هو إجبار الدفع ، ولا توجد رسائل إضافية/ارتكاب.

قل أن لديك ما يلي ~/commits-to-revert.txt (إستعملت git log --pretty=oneline كى تحصل عليهم)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

إنشاء سحق نص Shell لعودة كل واحد منهم:

#!/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

حلول Jefromi هي بالتأكيد الأفضل ، ويجب عليك بالتأكيد استخدامها. ومع ذلك ، من أجل الاكتمال ، أردت أيضًا إظهار هذه الحلول البديلة الأخرى التي يمكن استخدامها أيضًا لإعادة الالتزام (بمعنى أنك أنت قم بإنشاء التزام جديد لا يتغير في الالتزام السابق, ، مثل ماذا git revert يفعل).

أن نكون واضحين ، هذه البدائل ليست أفضل طريقة للعودة, حلول Jefromi, ، لكنني أريد فقط أن أشير إلى أنه يمكنك أيضًا استخدام هذه الطرق الأخرى لتحقيق نفس الشيء مثل git revert.

البديل 1: إعادة ضبط صلبة وناعمة

هذه نسخة معدلة قليلاً من حل تشارلز بيلي العودة إلى الالتزام من قبل تجزئة 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 HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

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

البديل 2: حذف الشجرة الحالية واستبدلها بالشجرة الجديدة

يأتي هذا الحل من حل SVICK إلى تحقق من الالتزام القديم وجعله التزامًا جديدًا:

git rm -r .
git checkout <commit> .
git commit

على غرار البديل رقم 1 ، هذا يعيد إنتاج حالة <commit> في نسخة العمل الحالية. من الضروري القيام به git rm أولا بسبب git checkout لن يزيل الملفات التي تمت إضافتها منذ ذلك الحين <commit>.

هنا اكثر سهولة طريقة للعودة إلى التزام سابق (وجعلها في حالة غير مصطلحة ، للقيام به ما تريد):

git reset HEAD~1

لذلك ، لا حاجة لالتزام معرفات وهلم جرا :)

هناك أمر (وليس جزءًا من Core Git ، لكنه في git-extras حزمة) خصيصًا للعودة والتدريج القديم:

git back

لكل صفحة الرجل, ، يمكن أيضًا استخدامه على هذا النحو:

# Remove the latest three commits
git back 3

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

git push -f ...

وليس فقط git push.

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

  1. اسحب أحدث إصدار من مستودعك من Bitbucket باستخدامgit pull --all يأمر.

  2. قم بتشغيل الأمر GIT LOG مع -n 4 من المحطة الخاصة بك. يحدد الرقم بعد -N عدد الالتزامات في السجل بدءًا من الالتزام الأخير في تاريخك المحلي.

    $ git log -n 4

  3. أعد ضبط رأس تاريخ مستودعك باستخدام git reset --hard HEAD~N حيث N هو عدد الالتزامات التي تريد أن تستعيد رأسها. في المثال التالي ، سيتم ضبط الرأس على التزام واحد ، إلى آخر الالتزام في تاريخ المستودع:

  4. ادفع التغيير إلى repo git باستخدام git push --force لإجبار دفع التغيير.

إذا كنت تريد مستودع GIT لالتزام سابق

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 

حتى تحصل على الالتزام المطلوب. لجعل الرأس يشير إلى ذلك ، افعل

git reset --hard HEAD~1

أو git reset --hard HEAD~2 أو أيا كان.

للحفاظ على التغييرات من الالتزام السابق بالرأس والانتقال إلى الالتزام السابق ، قم:

git reset <SHA>

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

git reset --hard <SHA>

لتنظيف دليل المبرمج بالكامل من بعض التغييرات العرضية ، استخدمنا:

git add -A .
git reset --hard HEAD

فقط git reset --hard HEAD سوف يتخلص من التعديلات ، لكنه لن يتخلص من الملفات "الجديدة". في حالتهم ، قاموا بطريق الخطأ بسحب مجلد مهم في مكان ما عشوائيًا ، وتم التعامل مع جميع هذه الملفات على أنها جديدة من قبل GIT ، لذا أ reset --hard لم يصلحه. عن طريق تشغيل git add -A . مسبقًا ، تتبعها بشكل صريح جميعًا بالجيت ، ليتم القضاء عليها بواسطة إعادة تعيين.

هذه طريقة أخرى لإعادة التعيين مباشرة إلى التزام حديث

git stash
git stash clear

إنه يمسح بشكل مباشر جميع التغييرات التي أجريتها منذ الالتزام الأخير.

ملاحظة: لديها مشكلة صغيرة ؛ كما أنه يحذف كل التغييرات المخزنة مؤخرًا. الذي أعتقد أنه في معظم الحالات لا ينبغي أن يهم.

أعتقد أن بعض الأشخاص قد يتوصلون إلى هذا السؤال الذين يريدون معرفة كيفية التراجع عن التغييرات التي أجراها في سيدهم - أي رمي كل شيء بعيدًا والعودة إلى Origin/Master ، وفي هذه الحالة ، قم بذلك:

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

إذا كان الوضع هو عاجل, ، وتريد فقط أن تفعل ما طرحه السائل في أ سريع و قذر الطريق ، على افتراض أن مشروعك قيد "مشروعي":

  1. انسخ الدليل بأكمله واسمه شيئًا آخر ، مثل "مشروعي - نسخ"

  2. يفعل:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

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

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

Git عبارة عن خلق رائع ، لكن لا يمكنك فقط "استلامه على الطيران": أيضًا الأشخاص الذين يحاولون شرح ذلك كثيرا جدا افترض معرفة مسبقة بـ VCs [أنظمة التحكم في الإصدار] والتعمق في وقت مبكر جدًا ، وارتكاب جرائم أخرى ، مثل استخدام مصطلحات قابلة للتبديل لـ "التحقق" - بطرق تبدو في بعض الأحيان محسوبة تقريبًا لتبشير المبتدئين.

لتوفير الكثير من الضغوط ، عليك أن تقرأ كتابًا عن git - أوصي "التحكم في الإصدار مع GIT". وإذا كنت تستطيع الوثوق بي (أو بالأحرى ندوبي) عندما أقول "يجب أن" حاليا. الكثير من تعقيد git يأتي من المتفرعة ثم إعادة التبرع. ولكن من سؤالك هناك لا يوجد سبب يجعل الناس يعمدونك بالعلم.

خاصة إذا ، على سبيل المثال ، هذا وضع يائس وأنت مبتدئ مع git!

ملاحظة: أحد الفكر الآخر: إنه (الآن) بسيط للغاية في الواقع للحفاظ على مستودع GIT ("repo") في دليل آخر غير الدليل الذي يحتوي على ملفات العمل. هذا يعني أنه لن تضطر إلى نسخ مستودع GIT بأكمله باستخدام الحل السريع والقذر أعلاه. شاهد الإجابة التي استخدمها Fryer-separate-git-dir هنا. كن حذرا, ، على الرغم من ذلك: إذا كان لديك مستودع "دليل منفصل" لا تنسخه ، وقمت بإعادة ضبط ثابت ، فستفقد جميع الإصدارات اللاحقة لالتزام إعادة التعيين إلى الأبد ، إلا إذا كان لديك ، كما يجب عليك ، على الإطلاق ، تدعمها بانتظام أعلى مستودعك ، ويفضل أن يكون على السحابة (على سبيل المثال محرك Google) من بين أماكن أخرى.

في هذا الموضوع من "النسخ الاحتياطي للسحابة" ، فإن الخطوة التالية هي فتح حساب (مجانًا بالطبع) مع Github أو (أفضل في رأيي) Gitlab. يمكنك بعد ذلك القيام بانتظام git push أمر لدعم ريبو السحابة "بشكل صحيح". لكن مرة أخرى ، قد يكون الحديث عن هذا قريبًا جدًا.

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

git revert <commit1> <commit2> 

عينة:

git revert 2h3h23233

إنه قادر على أخذ نطاق من الرأس كما هو موضح أدناه. هنا 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 HEAD@{1}

# Updates working copy to reflect the new commit
git reset --hard

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

يأتي أمر إعادة الضبط مع اثنين من الخيارات ، أحد أكثر الخيارات إثارة للاهتمام هو --soft علَم. إذا كنت تستخدمه بدلاً من --hard, ، ستحتفظ GIT بجميع التغييرات في "التراجع" كتعديلات محلية.

استعادة مراجعة في فرع محلي جديد

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

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

git checkout -b old-project-state 0ad5a7a6

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

لديك الآن فرع جديد اسمه الدولة القديمة تعكس الإصدار القديم من مشروعك - دون لمس أو حتى إزالة أي فروع أو فروع أخرى.

حاول إعادة ضبط الالتزام المطلوب -

git reset <COMMIT_ID>

(للتحقق من استخدام commun_id git log)

سيؤدي ذلك إلى إعادة تعيين جميع الملفات التي تم تغييرها إلى حالة غير مضافة.

الآن انت تستطيع checkout جميع الملفات غير المضافة بواسطة

git checkout .

يفحص git log للتحقق من التغييرات الخاصة بك.

تحديث

اذا كنت تمتلك واحدة فحسب ارتكب في ريبو الخاص بك ، حاول

git update-ref -d HEAD

كما يتم دفع ارتباطاتك عن بُعد ، تحتاج إلى إزالتها. اسمحوا لي أن أفترض أن فرعك يتطور ويتم دفعه على الأصل.

تحتاج أولاً إلى إزالة التطور من الأصل:

git push origin :develop (note the colon)

ثم تحتاج إلى الحصول على تطوير إلى الحالة التي تريدها ، دعني أفترض أن الالتزام هو efghijk:

git reset --hard EFGHIJK

أخيرًا ، اضغط على التطور مرة أخرى:

git push origin develop

حذر! يمكن أن يتسبب هذا الأمر في فقدان تاريخ الالتزام ، إذا وضع المستخدم التزامًا خاطئًا عن طريق الخطأ. دائمًا ما يكون لديك نسخة احتياطية إضافية من git الخاص بك في أي مكان آخر فقط في حالة وجود أخطاء ، مما كنت أكثر أمانًا. قون

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

هكذا فعلت ذلك:

git reset --hard CommitId && git clean -f

سيعود هذا إلى المستودع المحلي ، هنا بعد الاستخدام git push -f سيتم تحديث المستودع عن بُعد.

git push -f

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

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