كيف يمكنني التراجع عن بوابة إعادة تعيين-من الصعب الرأس~1?

StackOverflow https://stackoverflow.com/questions/5473

  •  08-06-2019
  •  | 
  •  

سؤال

هل من الممكن التراجع عن التغييرات الناجمة عن الأمر التالي?إذا كان الأمر كذلك ، كيف ؟

git reset --hard HEAD~1
هل كانت مفيدة؟

المحلول

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

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

يمكنك أن ترى في المثال أن file2 تمت إزالته نتيجة إعادة تعيين الثابت ، ولكن تم وضع مرة أخرى في المكان عندما كنت إعادة تعيين عن طريق reflog.

نصائح أخرى

ما تريد القيام به هو تحديد sha1 من ارتكاب تريد استعادة.يمكنك الحصول على sha1 من خلال دراسة reflog (git reflog) ومن ثم القيام

git reset --hard <sha1 of desired commit>

ولكن لا تنتظر طويلا...بعد أسابيع قليلة من بوابة سوف نرى في نهاية المطاف أن ارتكاب مثل unreferenced وحذف كل النقط.

الجواب هو مخفي في الجواب التفصيلي أعلاه, يمكنك أن تفعل ببساطة:

$> git reset --hard HEAD@{1}

(انظر الناتج من بوابة reflog تظهر)

فمن الممكن لاسترداد لو جيت لم القمامة التي تم جمعها حتى الآن.

الحصول على لمحة عامة عن التعلق يرتكب مع fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

استرداد التعلق ارتكاب مع ريبس:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

إذا كنت محظوظا حقا مثل كنت يمكن أن تذهب مرة أخرى إلى محرر النص الخاص بك وضرب 'التراجع'.

وأنا أعلم أن هذا ليس حقا الجواب الصحيح ، ولكن أنقذني نصف يوم من العمل لذلك نأمل أنها سوف تفعل الشيء نفسه بالنسبة لشخص آخر!

مثال IRL الحالة:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.

بقدر ما أعرف ، --hard سوف يتجاهل غير ملتزم التغييرات.وبما أن هذه ليست تتبعها بوابة.ولكن يمكنك التراجع عن discarded commit.

$ git reflog

سوف القوائم:

b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....

حيث 4bac331 هو discarded commit.

الآن فقط تحريك الرأس إلى أن ارتكاب::

$ git reset --hard 4bac331

في معظم الحالات, نعم.

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

فيما يلي سرد مجموعة من مختلف السيناريوهات المحتملة ، وكيف يمكن الشفاء منها.

كل التغييرات التي ارتكبت ، ولكن الآن يرتكب ولت!

هذه الحالة تحدث عادة عند تشغيل git reset مع حجة ، كما في git reset --hard HEAD~.لا تقلق, هذا هو السهل التعافي من!

إذا كنت مجرد ركض git reset و لم تفعل أي شيء آخر منذ ذلك الحين ، يمكنك الحصول على العودة إلى حيث كنت مع هذا واحد من بطانة:

git reset --hard @{1}

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

ولكن ، إذا كنت لديك إجراء تعديلات أخرى إلى فرع منذ تعيين واحد-بطانة أعلاه لا تعمل.بدلا من ذلك يجب تشغيل git reflog <branchname> لمشاهدة قائمة جميع التغييرات الأخيرة جعلت الفرع الخاص بك (بما في ذلك إعادة تعيين).أن القائمة سوف ننظر بشيء من هذا القبيل:

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

تجد العملية في هذه القائمة التي تريد "التراجع".في المثال أعلاه, سيكون السطر الأول ، الذي يقول "إعادة تعيين:الانتقال إلى الرأس~".ثم نسخ تمثيل ارتكاب قبل (أدناه) أن عملية.في حالتنا سيكون master@{1} (أو 3ae5027, كلاهما يمثل نفسه لارتكاب), وتشغيل git reset --hard <commit> لإعادة تعيين كلمة فرع الحالية إلى أن يرتكبها.

لقد نظمت بلادي التغييرات مع git add, ولكن لم ترتكب.الآن بلدي التغييرات ذهب!

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

للحصول على تفاصيل حول ذلك ، انظر التراجع عن بوابة --إعادة تعيين الثابت مع الملفات غير ملتزم في منطقة التدريج.

لقد كانت التغييرات على الملفات في دليل العمل الذي لم نظموا مع git add, و لم يرتكب.الآن بلدي التغييرات ذهب!

اه يا.أنا أكره أن أقول لك هذا ولكن ربما كنت من الحظ.بوابة لا تخزن أي تغييرات لا إضافة أو تلتزم به ، وفقا وثائق git reset:

- من الصعب

إعادة تعيين مؤشر شجرة العمل. أي تغييرات على تعقب الملفات في شجرة العمل منذ <commit> يتم التخلص منها.

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

إذا كان لديك لم يتم جمعها من القمامة المستودع الخاص بك (على سبيل المثالباستخدام git repack -d أو git gc, ولكن لاحظ أن جمع القمامة يمكن أن يحدث أيضا تلقائيا) ، ثم يرتكبون لا يزال هناك – انها فقط لم يعد يمكن الوصول إليها من خلال الرأس.

يمكنك محاولة للعثور على ارتكاب خلال النظر من خلال إخراج git fsck --lost-found.

إصدارات أحدث من بوابة لديهم ما يسمى "reflog" ، وهو تسجيل جميع التغييرات التي يتم إجراؤها على الحكام (بدلا من التغييرات التي يتم إجراؤها على محتويات مستودع).لذا, فعلى سبيل المثال, في كل مرة كنت التبديل رأسك (أيفي كل مرة كنت تفعل git checkout للتبديل الفروع) التي سيتم تسجيل.وبطبيعة الحال ، git reset أيضا التلاعب الرأس ، لذلك كان أيضا تسجيل.يمكنك الوصول إلى كبار السن الدول من الحكام بطريقة مماثلة أن يمكنك الوصول إلى كبار السن الدول من المستودع الخاص بك, باستخدام @ علامة بدلا من ~, مثل git reset HEAD@{1}.

استغرق الأمر مني بعض الوقت لفهم ما هو الفرق بين رئيس@{1} والرأس~1, حتى هنا هو القليل من الشرح:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

لذلك ، HEAD~1 يعني "اذهب إلى ارتكاب قبل ارتكاب هذا الرأس حاليا نقطة في" ، في حين HEAD@{1} يعني "اذهب إلى ارتكاب هذا الرأس أشار قبل ذلك أشار في مكانه الحالي النقاط".

من شأنها أن تسمح لك بسهولة العثور على المفقود ارتكاب استعادتها.

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

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

لذلك فمن الممكن لاستعادة الملفات حتى لو كانت غير ملتزمة ولكن قد أضيفت.

git init  
echo hello >> test.txt  
git add test.txt  

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

git reset --hard  
git fsck  

سوف تحصل على التعلق النقطة ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

سوف تعطيك محتوى الملف "مرحبا" مرة أخرى

العثور على unreferenced يرتكب وجدت معلومة في مكان ما مما يشير إلى هذا.

gitk --all $(git log -g --pretty=format:%h)  

لدي كأداة في بوابة واجهة المستخدم الرسومية و هو مفيد جدا.

قبل الإجابة يتيح إضافة بعض الخلفية ، شرح ما هو هذا 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.
  • ملاحظة:(منذ جيت 2.7)
    يمكنك أيضا استخدام git rebase --no-autostash وكذلك.


git revert <sha-1>

"التراجع عن" بالنظر إلى ارتكاب أو يرتكب مجموعة.
إعادة تعيين الأمر "تراجع" أي تغييرات في ارتكاب.
جديد ارتكاب مع التراجع عن التصحيح سوف تكون ارتكبت في حين الأصلي ارتكاب ستبقى في التاريخ أيضا.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

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

enter image description here

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

  1. الكسوف موضوع التعليمات على التاريخ المحلي
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F

ارتكبنا النصي لجعله أسهل قليلا للعثور على ارتكاب واحدة تبحث عن:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

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

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