git - একটি গিট রিপোজিটরিতে একটি মুছে ফেলা ফাইল খুঁজুন এবং পুনরুদ্ধার করুন




file-io git-checkout (14)

git undelete path/to/file.ext

  1. আপনার .bash_profile (অথবা অন্য কোনও প্রাসঙ্গিক ফাইল যা আপনি কমান্ড শেলটি খুললে লোড হয়) এ রাখুন:

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. তারপর ব্যবহার করুন:

    git undelete path/to/file.ext
    

এই উপনাম প্রথমে এই ফাইলটি বিদ্যমান যেখানে শেষ কমিটটি খুঁজে বের করতে পারে, তারপরে এই ফাইলটি বিদ্যমান যেখানে এই ফাইলের পাথের একটি গিট চেকআউট আছে। source

বলুন আমি একটি গিট রিপোজিটরি করছি। আমি একটি ফাইল মুছে দিন এবং যে পরিবর্তন কমিট। আমি কাজ চালিয়ে যেতে এবং আরো কিছু করতে। তারপর, আমি খুঁজে পেয়েছি যে ফাইলটি পুনরুদ্ধার করতে হবে।

আমি জানি git checkout HEAD^ foo.bar ব্যবহার করে একটি ফাইল চেকআউট করতে পারি git checkout HEAD^ foo.bar , কিন্তু আমি আসলেই জানি না যে ফাইলটি মুছে ফেলা হলে কীভাবে।

  1. একটি প্রদত্ত ফাইল নাম মুছে ফেলা যে কমিট খুঁজে দ্রুততম উপায় কি হবে?
  2. আমার কাজ অনুলিপি যে ফাইল ফিরে পেতে সবচেয়ে সহজ উপায় হবে?

আমি আশা করি আমার ম্যানুয়াল ব্রাউজগুলি ম্যানুয়ালি ব্রাউজ করতে হবে না, একটি প্রদত্ত SHA এর জন্য সমগ্র প্রকল্পটি চেক আউট করুন এবং তারপরে আমার মূল প্রকল্প চেকআউটে সেই ফাইলটিকে ম্যানুয়ালি অনুলিপি করুন।


  1. ফাইল মুছে ফেলা এবং ফাইল মুছে ফেলা হয়েছে যা সব commits পেতে git log --diff-filter=D --summary ব্যবহার করুন;
  2. মুছে ফেলা ফাইলটি পুনরুদ্ধার করতে git checkout $commit~1 filename ব্যবহার করুন।

কোথায় $commit আপনি ধাপ 1 এ পাওয়া e4cf499627 , যেমন e4cf499627


আপনি উন্মাদ হলে, git-bisect ব্যবহার করুন। এখানে কি করতে হবে:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

এখন এটি স্বয়ংক্রিয় পরীক্ষা চালানোর সময়। foo.bar বিদ্যমান থাকলে শেল কমান্ড '[ -e foo.bar ]' 0 প্রদান করবে, এবং অন্যথায় 1। git-bisect "রান" কমান্ড বাইনারি অনুসন্ধানটি স্বয়ংক্রিয়ভাবে প্রথম ব্যর্থতার পরীক্ষাটি ব্যবহার করবে যেখানে পরীক্ষাটি ব্যর্থ হয়। এটি দেওয়া পরিসীমা (ভাল থেকে খারাপ) দিয়ে অর্ধেক শুরু করে এবং নির্দিষ্ট পরীক্ষার ফলাফলের ভিত্তিতে এটি অর্ধেক করে কাটায়।

git bisect run '[ -e foo.bar ]'

এখন আপনি যে কমিটি এটিকে মুছে ফেলেছেন। এখানে থেকে, আপনি ভবিষ্যতে ফিরে যেতে পারেন এবং পরিবর্তন পূর্বাবস্থায় git-revert আনতে git-revert ব্যবহার করতে পারেন।

git bisect reset
git revert <the offending commit>

অথবা আপনি একটি কমিট ফিরে যান এবং নিজে ক্ষতি পরিদর্শন করতে পারে:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

আপনি যদি ফাইলটি মুছে <SHA1_deletion> এমন <SHA1_deletion> জানেন তবে এই কমান্ডটি চালান যেখানে <SHA1_deletion> যেটি ফাইলটি মুছে দিয়েছে:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

পাইপের পূর্বে অংশটি মুছে ফেলা সমস্ত ফাইল তালিকাবদ্ধ করে; তারা তাদের পুনরুদ্ধারের পূর্ববর্তী কমিটি থেকে সব চেকআউট হয়।


আমার নতুন প্রিয় bonyiii , bonyiii answer ( bonyiii ) উপর ভিত্তি করে, এবং আমার নিজের উত্তর " একটি গিট ওরফে কমান্ডে একটি যুক্তি পাস করুন " সম্পর্কে:

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

আমি একটি ফাইল হারিয়ে গেছে, কিছু ভুল আগে ভুল দ্বারা মুছে ফেলা?
কুইক:

git restore my_deleted_file

সংকট বিপরীত।

রবার্ট ডেইলি মন্তব্য নিম্নলিখিত উল্লিখিত প্রস্তাব:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

এবং jegan মন্তব্য যোগ করে :

কমান্ড লাইন থেকে উপনাম সেটিং করার জন্য, আমি এই কমান্ডটি ব্যবহার করেছি:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

আমি এই সমাধান পেয়েছেন।

  1. নীচের উপায়ে এক ব্যবহার করে ফাইলটি মুছে ফেলা হয়েছে যেখানে কমিটির আইডি পান।

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # যদি আপনি কদাচিৎ কিছু মনে করেন তবে তা প্রস্তাবিত
  2. আপনি ভালো কিছু পেতে হবে:

bfe68bd117e1091c96d2976c99b3bcc8310bebe7 লেখক: আলেকজান্ডার অরলভ তারিখ: থু মে 12 23:44:27 ২011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

কমিটি 3ea4e3af253ac6fd1691ff6bb89c964f54802302 লেখক: আলেকজান্ডার Orlov তারিখ: ঠ মে 12 22:10:22 2011 +0200

3 । এখন commit id ব্যবহার করে bfe68bd117e1091c96d2976c99b3bcc8310bebe7 করুন:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

কমিটি আইডিটি যেখানে ফাইলটি ইতিমধ্যে মুছে ফেলা হয়েছিল সেখানে রেফারেন্স হিসাবে উল্লেখ করে আপনাকে bfe68b ঠিক করার আগে কমিটির উল্লেখ করতে হবে যা আপনি ^1 যোগ করে করতে পারেন। এর মানে হল: আমাকে bfe68b ঠিক আগে কমিট দিতে।


আমিও একই প্রশ্ন করেছিলাম. এটা জানার পর, আমি একটি dangling কমিটি তৈরি করেছে।

তালিকা dangling তালিকা

git fsck --lost-found

প্রতিটি dangling কমিটি পরিদর্শন

git reset --hard <commit id>

আমি dangling কমিটিতে সরানো যখন আমার ফাইল পুনরায় আবির্ভূত।

কারণ জন্য git status :

“HEAD detached from <commit id where it detached>”


একটি ফোল্ডারে যে সমস্ত মুছে ফেলা ফাইল পুনরুদ্ধার করতে নিম্নলিখিত কমান্ডটি লিখুন।

git ls-files -d | xargs git checkout --

দেওয়া পাথ প্রভাবিত যে শেষ কমিটি খুঁজুন। ফাইল হেড কমিটিতে নেই, তাই এই কমিটিটি মুছে ফেলতে হবে।

git rev-list -n 1 HEAD -- <file_path>

তারপরে ক্যারেট ( ^ ) প্রতীকটি ব্যবহার করে আগে কমিটির সংস্করণ চেকআউট করুন:

git checkout <deleting_commit>^ -- <file_path>

অথবা এক কমান্ডে, $file যদি ফাইলটিতে প্রশ্ন থাকে।

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

যদি আপনি zsh ব্যবহার করেন এবং EXTENDED_GLOB বিকল্প সক্ষম করেন তবে ক্যারেট চিহ্নটি কাজ করবে না। আপনি পরিবর্তে ~1 ব্যবহার করতে পারেন।

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

যদি আপনি কেবলমাত্র পরিবর্তনগুলি তৈরি করেন এবং একটি ফাইল মুছেন তবে তা করেন না, এবং এখন আপনি আপনার পরিবর্তনগুলি ভেঙ্গে ফেলেন

git checkout -- .

কিন্তু আপনার মুছে ফেলা ফাইল ফিরে না, আপনি কেবল নিম্নলিখিত কমান্ডটি করবেন:

git checkout <file_path>

এবং presto, আপনার ফাইল ফিরে।


সহজ এবং সুনির্দিষ্ট-

সর্বোপরি, আপনার দ্বারা যে ফাইলটিতে একটি সর্বশেষ স্থিতিশীল কমিটি পাবেন -

git log 

বলুন আপনি $ 1234567 ... তারপর, প্রতিশ্রুতি খুঁজে পেতে

git checkout <$commitid> $fileName

এই যে প্রতিশ্রুতি ছিল ফাইল সংস্করণ পুনরুদ্ধার করা হবে।


সুতরাং আমি একটি নির্দিষ্ট কমিটি থেকে মুছে ফেলা ফাইল একটি গুচ্ছ পুনরুদ্ধার করতে হবে এবং আমি দুটি কমান্ড দিয়ে এটি পরিচালিত:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(প্রতিটি কমান্ডের শেষে থাকা স্থানটি লক্ষ্য করুন।)

ফাইলগুলিকে। জিটিগনোর ফাইলটিতে যুক্ত করা হয়েছে এবং তারপরে জিটি রম দিয়ে সাফ করা হয়েছে, আমাকে ফাইলগুলি পুনরুদ্ধার করতে হবে তবে তারপরে সেগুলি অস্থির করুন। আমার কয়েকটি ফাইল পুনঃস্থাপন করার জন্য, প্রতিটি ফাইলের জন্য ম্যানুয়ালি টাইপ করা, যেমন অন্যান্য উদাহরণগুলি খুব ধীরে ধীরে চলছে।


git checkout /path/to/deleted.file





git-checkout