it-swarm.asia

كيفية التراجع عن مستودع Git إلى التزام سابق

كيف يمكنني العودة من حالتي الحالية إلى لقطة تم تنفيذها على التزام معين؟

إذا قمت بـ 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؟

6795
Crazy Serb

هذا يعتمد كثيرا على ما تقصد ب "العودة".

التبديل مؤقتًا إلى التزام مختلف

إذا كنت ترغب في العودة إليها مؤقتًا ، والاستغفار ، ثم العودة إلى حيث أنت ، كل ما عليك فعله هو التحقق من الالتزام المطلوب:

# 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 العودة إلى موقع سابق؟ (رأس منفصل)

8690
Cascabel

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

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

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؟.

1451
boulder_ruby

الكثير من الإجابات المعقدة والخطيرة هنا ، لكنها في الواقع سهلة:

git revert --no-commit 0766c053..HEAD
git commit

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

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

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

1433
Yarin

الخيار الأفضل بالنسبة لي وربما الآخرين هو خيار Git reset:

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

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


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

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

git clean -i

182
Pogrindis

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

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

git reflog
git checkout [email protected]{...}

هذا سوف يعيدك إلى الالتزام الذي تريده

 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

143
CodeWizard

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

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

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

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

124
Stephen Ostermiller

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

git add . && git checkout master -f

وصف قصير:

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

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

git add . && git reset --hard HEAD

حيث HEAD يشير إلى الالتزام الأخير في الفرع الحالي.

إنه رمز الشفرة نفسه الذي اقترحه boulder_Ruby ، ​​لكنني أضفت git add . قبل git reset --hard HEAD لمحو جميع الملفات الجديدة التي تم إنشاؤها منذ الالتزام الأخير لأن هذا ما يتوقعه معظم الناس وأعتقد أنه عند الرجوع إلى أحدث التزام.

105
Roman Minenok

يمكنك القيام بذلك عن طريق الأمرين التاليين:

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

سيؤدي ذلك إلى إزالة التزام Git السابق.

إذا كنت تريد الاحتفاظ بالتغييرات التي أجريتها ، يمكنك أيضًا استخدام:

git reset --soft [previous Commit SHA id here]

ثم سيوفر التغييرات الخاصة بك.

94
kiran boghra

حسنا ، العودة إلى الالتزام السابق في بوابة أمر سهل للغاية ...

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

git reset --hard <commit>

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

git reset --soft <commit>

قم بشرح الآتي: باستخدام إعادة تعيين git ، يمكنك إعادة التعيين إلى ولاية معينة ، ومن الشائع استخدامه مع تجزئة الالتزام كما ترى أعلاه.

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


--ناعم

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


--الصعب

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


لقد أنشأت أيضًا الصورة أدناه التي قد تحدث في الحياة الواقعية باستخدام git:

 git reset to a commit

63
Alireza

لا شيء هنا يعمل لي بصرف النظر عن هذه المجموعة بالضبط:

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

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

59
serdarsenay

لنفترض أنه لديك الإرشادات التالية في ملف نصي باسم ~/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> خارج عن ارادتي.

57
Lance Caraccioli

بدائل إضافية لحلول Jefromi

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

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

البديل 1: إعادة تعيين الثابت واللين

هذه نسخة معدلة قليلاً من حل 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>"

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

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

يأتي هذا الحل من حل svick إلى Checkout old الالتزام وجعله التزامًا جديدًا :

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

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

56
user456814

على افتراض أنك تتحدث عن ماجستير وعلى ذلك الفرع (على سبيل المثال ، قد يكون هذا هو أي فرع عمل تهتم به):

# 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

لقد وجدت الإجابة من منشور مدونة (لم يعد موجودًا الآن)

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

من الأفضل استخدام الرجوع (انظر الإجابات الأخرى) من إعادة التعيين. إذا كنت فريقًا واحدًا ، فربما لا يهم.

55
markreyes

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

git reset HEAD~1

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

51
Paul Walczewski

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

git Push -f ...

وليس فقط git Push.

34
sivi

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

git back

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

# Remove the latest three commits
git back 3
33
Shadow Man

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

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

  2. قم بتشغيل الأمر git log باستخدام -n 4 من الجهاز الطرفي. يحدد الرقم بعد - n عدد مرات التعيين في السجل بدءًا من الالتزام الأخير في السجل المحلي.

    $ git log -n 4

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

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

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

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

الرجوع إلى الأحدث الالتزام وتجاهل جميع التغييرات المحلية:

git reset --hard HEAD
27
Mohammed Irfan Tirupattur

حدد الالتزام المطلوب ، وتحقق منه

git show HEAD
git show HEAD~1
git show HEAD~2 

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

git reset --hard HEAD~1

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

26
tonythomas01

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

git stash
git stash clear

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

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

20
Point Networks

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

git reset <SHA>

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

git reset --hard <SHA>
20
Vishnu Atrai

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

git add -A .
git reset --hard HEAD

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

20
Chris Moschini

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

git reset --hard Origin/master

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

19
nevster

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

git revert <commit1> <commit2> 

عينة:

git revert 2h3h23233

إنه قادر على أخذ النطاق من HEAD كما هو موضح أدناه. هنا 1 يقول "العودة الالتزام الأخير".

git revert HEAD~1..HEAD

ثم git Push

16
Sireesh Yarlagadda

التراجع عن الالتزام الأخير:

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 يعكس النسخة القديمة من مشروعك - دون لمس أو حتى إزالة أي تعهدات أو فروع أخرى.

16
Lyes CHIOUKH

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

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

  2. فعل:

    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 ) بين أماكن أخرى.

13
mike rodent

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

git reset <COMMIT_ID>

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

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

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

git checkout .

تحقق من git log للتحقق من تغييراتك.

تحديث

إذا كان لديك واحد وفقط ارتكاب في الريبو الخاص بك ، حاول

git update-ref -d HEAD

13
optimistanoop

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

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

هذه هي الطريقة التي فعلت بها:

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

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

git Push -f
11
maytham-ɯɐɥʇʎɐɯ

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

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

git Push Origin :develop (note the colon)

ثم تحتاج إلى تطوير إلى الحالة التي تريدها ، واسمحوا لي أن نفترض أن تجزئة الالتزام هي EFGHIJK:

git reset --hard EFGHIJK

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

git Push Origin develop
11
George Ninan

على GitKraken يمكنك القيام بذلك:

  1. انقر بزر الماوس الأيمن على الالتزام الذي تريد إعادة تعيينه ، واختر: إعادة التعيين إلى هذا الالتزام/الثابت:

 enter image description here

  1. انقر بزر الماوس الأيمن على الالتزام مرة أخرى ، واختر: اسم الفرع الحالي/ادفع:

 enter image description here

  1. انقر على Force Push:

 enter image description here

Obs. : يجب أن تكون حريصًا لأن كل تاريخ الالتزام بعد إعادة التعيين الثابت قد ضاع وهذا الإجراء لا رجعة فيه. عليك أن تكون متأكدا مما تفعله.

10
Ângelo Polotto

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

10
Upul Doluweera

أولاً ، احصل على السلسلة التي تحدد الالتزام في تاريخ ما ، بما يلي:

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

يقوم بطباعة معرف الالتزام ، واتخاذ السلسلة (على سبيل المثال XXXX) والقيام بما يلي:

git checkout XXXX
9
Luca C.

للتراجع (أو للعودة):

  1. git revert - no-الالتزام "الالتزام بإزالة الرمز" HEAD (على سبيل المثال git revert - no-الالتزام d57a39d HEAD)
  2. بوابة ارتكاب
  3. بوابة دفع

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

إذا وجدت شيئًا خاطئًا ، فقم بما يلي:

بوابة العودة - قصيرة

9
Jagraj Singh

ويمكن القيام به أسهل بكثير مع SourceTree . انقر بزر الماوس الأيمن على الالتزام الذي تبحث عنه واختر "Checkout" من القائمة.

 enter image description here

8
Marcin Szymczak

حل آخر أبسط ؛ يجب عليك تغيير الفرع للقيام بذلك ، ولكن بعد ذلك يمكنك فقط تشغيل:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

لم أستطع الرجوع يدويًا لسبب ما ، لذلك كيف انتهى بي الأمر.

  1. سحب الفرع الذي أردت أن يكون ، نسخه.
  2. سحب من أحدث فرع.
  3. نسخ المحتويات من الفرع الذي أردت أن يقوم الدليل الأخير للفروع باستبدال التغييرات والالتزام به.
7
Demodave
git reflog

اختر عدد HEAD (s) من إعادة التسجيل git ، حيث تريد العودة والقيام به (على سبيل المثال ، اخترت 12):

git reset [email protected]{12} --hard
7
Sérgio

تتمثل الطريقة الأقل تعقيدًا في تحويل فرع إلى أي التزام معين حيث لا يمكنك تغيير السجل الذي وجدته إلى:

  1. تحقق من الالتزام أو الفرع رغبتك في العودة من.
  2. حرر .git/HEAD وقم بتغيير المرجع إلى الفرع الذي يمكنك الرجوع إليه.

مثل:

echo 'ref: refs/heads/example' > .git/HEAD

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

إذا كان كل شيء يبدو جيدا يمكنك ارتكابها. يمكنك أيضًا استخدام git diff revert..example للتأكد من أنها متشابهة.

6
jgmjgm

إذا كنت ترغب في التراجع مؤقتًا عن التغييرات بسبب

  • قام شخص ما بالالتزام بتعليمات تفيد بانهيار البنية أو كسر الوظيفة التي تعمل عليها

يمكنك البحث عن التزام العمل الأخير باستخدام سجل بوابة ثم تشغيل

git rebase --onto <commitId>

عندما يعمل الفرع البعيد مرة أخرى ، يمكنك ذلك

git pull --rebase

هذه الطريقة أفضل من الخروج من البوابة لإجراء تغييرات مؤقتة ، لأنك لست في حالة منفصلة.

5
joseph

إعادة تعيين التغييرات والالتزامات المرحلية

يتيح لك الأمر 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 ومحاولة العودة إلى رمز غير موجود حتى الآن.

2
SAIguru011