سؤال

قلت عن طريق الخطأ git rm -r .. كيف يمكنني التعافي من هذا؟

لم ارتكب.

أعتقد أن جميع الملفات تم تمييزها للحذف وتم إزالتها جسديًا من الخروج المحلي الخاص بي.

تعديل: يمكنني (إذا كنت أعرف الأمر) العودة إلى الالتزام الأخير. ولكن سيكون من الأفضل بكثير إذا كان بإمكاني التراجع عن git rm -r .. لأنني لست متأكدًا حقًا مما فعلته بعد الالتزام الأخير وقبل git rm -r ..

هل كانت مفيدة؟

المحلول

git reset HEAD

يجب القيام به. إذا لم يكن لديك أي تغييرات غير ملتزمة تهتم بها ، إذن

git reset --hard HEAD

يجب إعادة ضبط كل شيء بالقوة لالتزامك الأخير. إذا كان لديك تغييرات غير ملتزم بها ، لكن الأمر الأول لا يعمل ، ثم احفظ التغييرات غير الملتزم بها git stash:

git stash
git reset --hard HEAD
git stash pop

نصائح أخرى

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

git checkout HEAD path/to/file path/to/another_file

هذا يترك التغييرات غير الملتزمة الأخرى سليمة بدون حلول.

لاستعادة بعض الملفات أو المجلدات الفردية التي يمكن للمرء استخدامها ما يلي

git reset -- path/to/file
git checkout -- path/to/file

سيؤدي هذا أولاً إلى إعادة إنشاء إدخالات الفهرس path/to/file وإعادة إنشاء الملف كما كان في الالتزام الأخير ، أيHEAD.

تَلمِيح: يمكن للمرء أن يمرر تجزئة الالتزام إلى كلا الأوامر لإعادة إنشاء الملفات من الالتزام الأقدم. يرى git reset --help و git checkout --help للتفاصيل.

تحديث:

حيث git rm . يحذف جميع الملفات في هذه الدلائل والأدلة للأطفال في عملية الخروج من العمل وكذلك في الفهرس ، تحتاج إلى التراجع عن كل من هذه التغييرات:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

هذا يجب أن يفعل ما تريد. لا يؤثر على المجلدات الوالدين لرمز أو فهرس تم فحصه.


الجواب القديم لم يكن:

reset HEAD

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

بعد ذلك تحتاج إلى تكرار أي git add الأوامر التي قمت بها في قائمة الانتظار.

إذا انتهى الأمر بأي شيء من العمل أعلاه ، فقد تتمكن من استرداد البيانات باستخدام الاقتراح من هنا: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

إذا كنت قد ارتكبت ودفعت التغييرات ، فيمكنك القيام بذلك لاستعادة الملف

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

التراجع عن git rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

التراجع عن git rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

التراجع عن git rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changes يشمل not staged changes, staged changes but not committed.

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

git checkout <branch>@{"20 minutes ago"} <filename>

الحصول على الالتزام قائمة

git log  --oneline

على سبيل المثال ، الالتزام المستقر لديه التجزئة: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

كان لدي موقف متطابق. في حالتي كان الحل:

git checkout -- .

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

ومع ذلك ، فإن الأمر التالي

git checkout .

استعاد كل شيء ، وأنقذ حياتي.

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