প্রকল্পের প্রতিশ্রুতি ইতিহাসে মুছে ফেলা ফাইলটি কীভাবে সন্ধান করবেন?


1274

একসময় আমার প্রকল্পে একটি ফাইল ছিল যা আমি এখন পেতে সক্ষম হতে চাই।

সমস্যাটি হ'ল: আমি কখন এটি মুছলাম এবং কোন পথে ছিল তা সম্পর্কে আমার কোনও ধারণা নেই।

এই ফাইলটি বিদ্যমান থাকলে আমি কীভাবে তা জানতে পারি?


এখানে একই প্রশ্ন: stackoverflow.com/questions/7093602/...
eckes


13
এখানে উত্তর উত্তর চেয়ে আমাকে পক্ষে সর্বাধিক উপযোগী সদৃশ
ফিলিপ আলভারেজ

5
সম্মত ... অনুলিপি নির্বিশেষে ... তারা গুগল অনুসন্ধানে আসে নি .... এইটি করেছে ... আমি আশা করি আমরা নকলের পিছনে তাড়া করতে সময় নষ্ট করা বন্ধ করব ... কেবলমাত্র সময় এবং গুগলের অ্যালগরিদম হবে কোন প্রশ্নটি সেরা তা বলুন।
টিম বোল্যান্ড

উত্তর:


1598

আপনি যদি সঠিক পথটি ব্যবহার করতে পারেন তা না জানেন

git log --all --full-history -- "**/thefile.*"

ফাইলটি যে পথে ছিল তা আপনি যদি জানেন তবে আপনি এটি করতে পারেন:

git log --all --full-history -- <path-to-file>

এটি সেই সমস্ত শাখায় কমিটের একটি তালিকা প্রদর্শন করবে যা সেই ফাইলটিকে স্পর্শ করেছে। তারপরে, আপনি যে ফাইলটি চান তার সংস্করণটি খুঁজে পেতে এবং এর সাথে এটি প্রদর্শন করতে পারেন ...

git show <SHA> -- <path-to-file>

বা এটির সাথে আপনার ওয়ার্কিং কপির সাথে এটি পুনরুদ্ধার করুন:

git checkout <SHA>^ -- <path-to-file>

ক্যারেট সিম্বল ( ^) নোট করুন , যা চিহ্নিত শুরুর পূর্বে চেকআউট পায় , কারণ <SHA>প্রতিশ্রুতি দেওয়ার মুহুর্তে ফাইলটি মুছে ফেলা হয়েছে, মুছে ফেলা ফাইলের বিষয়বস্তুগুলি পেতে আমাদের পূর্ববর্তী প্রতিশ্রুতি দেখতে হবে


2
পরমাত্মার পরিবর্তে কোনও আপেক্ষিক পাথ ব্যবহার করার চেষ্টা করুন (যদি আপনি ইতিমধ্যে না থাকেন)।
অ্যাম্বার

63
আপনি যদি সঠিক পথটি না জানেন? আপনারা সকলেই জানেন ফাইলের নাম?
পুরোহিত

17
git log -- <path>আপনি যখন কোনও শাখায় থাকবেন না যেখানে পেডমোর্টেরোলোর কোনও আউটপুট থাকবে না যেখানে ফাইলটি কখনও অস্তিত্বহীন ছিল। আপনার git log --all -- <path>অন্যান্য শাখায় ঘটে যাওয়া পরিবর্তনগুলি মিস করবেন না তা নিশ্চিত করার জন্য আপনার সর্বদা ব্যবহার করা উচিত । কমান্ডটি git log -- <path>খুব বিপজ্জনক হতে পারে যদি আপনার একাধিক শাখা থাকে এবং পাথ এবং শাখাগুলি ভুলে যাওয়ার প্রবণতা হয় (আমার মতো) এবং আপনি অন্যান্য বিকাশকারীদের সাথে কাজ করেন তবে এটি বিপজ্জনকও হতে পারে।
hobs

4
অ্যাম্বার, আপনার উত্তরে --all(ধন্যবাদ ফিলিপকে ) যুক্ত করার কথা বিবেচনা করুন git log, যাতে লোকেরা অন্য শাখায় পরিবর্তন এবং ফাইল মিস না করে। এটি আমার মতো ভুলে যাওয়া লোককে অনেক শোক রক্ষা করতে পারে।
hobs

3
নীচের উত্তরে বলা হয়েছে, ফাইলটি পুনরুদ্ধার করা উচিত git checkout <SHA>^ -- <path-to-file>(^ প্রতীকটি দ্রষ্টব্য), কারণ <Sha> প্রতিশ্রুতি দেওয়ার মুহুর্তে ফাইলটি মুছে ফেলা হচ্ছে, মুছে ফেলা ফাইলের বিষয়বস্তুগুলি পাওয়ার জন্য আমাদের পূর্ববর্তী প্রতিশ্রুতিটি দেখতে হবে
কিপলোভেটস

393

মুছে ফেলা ফাইলগুলির একটি তালিকা পান এবং মোছা ফাইলটির পুরো পথটি অনুলিপি করুন

git log --diff-filter=D --summary | grep delete

সেই কমিটের প্রতিশ্রুতিবদ্ধ আইডি সন্ধানের জন্য পরবর্তী আদেশটি কার্যকর করুন এবং প্রতিশ্রুতি আইডিটি অনুলিপি করুন

git log --all -- FILEPATH

মুছে ফেলা ফাইলের আলাদা দেখান

git show COMMIT_ID -- FILE_PATH

মনে রাখবেন, আপনি >লাইক ব্যবহার করে কোনও ফাইলে আউটপুট লিখতে পারেন

git show COMMIT_ID -- FILE_PATH > deleted.diff

1
যদিও আমি প্রথম পদক্ষেপ সাহায্যে পথ পাওয়া যায় নি, দ্বিতীয় ধাপ এই ত্রুটি ছোঁড়া: unknown revision or path not in the working tree
jvannistelrooy

6
মুছে ফেলা পাশাপাশি প্রতিশ্রুতিবদ্ধ হ্যাশগুলি দেখতে, আপনি করতে পারেনgit log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
ক্রিস মিডলটন

1
পদক্ষেপ 2 কিছুই দেয় না। কেন এমন হতে পারে তার কোনও ধারণা? আমার ফাইলের নামটি সঠিক।
ডেনিস নাইজিয়াভ

2
তিনটিকে এক ফাংশনে একত্রিত করতে এটি আপনার .bashrc বা .zshrc এ যুক্ত করুন: git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }এবং এখন আপনি কেবল এটি করতে পারেন:git-grep-latest some_text
এলোমেলো

1
@ টাইলার জোনস আপনি পাইপস - গুগল ব্যবহার করে লিনাক্সের সাথে যে কোনও কিছুতে খাওয়াতে পারবেন you'll আপনি এটি linux pipesপছন্দ করবেন।
জন হান্ট

37

গৃহীত প্রতিক্রিয়াটি এটিকে এখানে উত্তর হিসাবে যুক্ত করে সম্পাদনা করতে পারেনি,

গিটে ফাইলটি পুনরুদ্ধার করতে, নিম্নলিখিতটি ব্যবহার করুন (এসএইচএর ঠিক পরে 'sign' চিহ্নটি নোট করুন)

git checkout <SHA>^ -- /path/to/file

আমি কেন বুঝতে চাইছি না ^। ফাইলটি এই SHA এর সাথে প্রতিশ্রুতিবদ্ধ ... আপনি কেন সেখান থেকে অন্য প্রতিশ্রুতি ফিরে যেতে চান?
টনি কে।

19
এটি সেই শা এর সাথে "মুছে ফেলা" হিসাবে প্রতিশ্রুতিবদ্ধ যার অর্থ এটি এখনও বিদ্যমান নেই। বাস্তবে এটি ফিরে পেতে আপনাকে আগে প্রতিশ্রুতিতে যেতে হবে।
tandrewnichols

6
@ স্ট্যান্ড্রুনিচলস যার অর্থ হ'ল আপনি ভুল কমিট এসএইএ ব্যবহার করছেন - আপনি যে ফাইলটি চান তার সংস্করণের জন্য কমিট চান ... যা সম্ভবত ফাইলটি মুছে ফেলা সংস্করণ নয়।
আম্বর

6
@ অ্যাম্বার এবং আপনি যে প্রতিশ্রুতিটি চান সেটি মুছে ফেলার আগে সম্ভবত সবচেয়ে সাম্প্রতিকতম, তাই এই উত্তর।
স্যাম হোল্ডার

1
@ অ্যালেক্সআর: <SHA>~1এটিকে উদ্ধৃতি চিহ্নের সাথে মোড়ানো ছাড়া একই কাজ করা উচিত।
CodeManX

37

ধরা যাক আপনি ডেকে আনা একটি ফাইল পুনরুদ্ধার করতে চান MyFileতবে তার পথ সম্পর্কে (বা তার প্রসারিত বিষয়টি সম্পর্কে) অনিশ্চিত:

প্রিলিম: গিট রুটে পা রেখে বিভ্রান্তি এড়ান

একটি অনিয়ন্ত্রিত প্রকল্পে অনুরূপ বা অভিন্ন নাম সহ একাধিক ডিরেক্টরি থাকতে পারে।

> cd <project-root>
  1. পুরো পথটি সন্ধান করুন

    গিট লগ - ডিফ-ফিল্টার = ডি - সুসমারি | grep মুছে ফেলুন | গ্রেপ মাইফাইল

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js আপনি যে পথ এবং ফাইলটি সন্ধান করছেন তা।

  1. সেই ফাইলটি প্রভাবিত করে এমন সমস্ত কমিট নির্ধারণ করুন

    গিট লগ --অনলাইন - ফলো - সম্পূর্ণ / পাথ / থেকে / মাইফিল.জেএস

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. ফাইলটি চেকআউট করুন

যদি আপনি প্রথম তালিকাভুক্ত প্রতিশ্রুতি (সর্বশেষ কালানুক্রমিকভাবে, এখানে বিডি 8374c) চয়ন করেন তবে ফাইলটি পাওয়া যাবে না, কারণ এটি সেই প্রতিশ্রুতিতে মোছা হয়েছিল।

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

কেবল পূর্ববর্তী (একটি ক্যারেট সংযোজন) প্রতিশ্রুতি নির্বাচন করুন:

> git checkout bd8374c^ -- full/path/to/MyFile.js

3
এটি গৃহীত উত্তরের চেয়ে অনেক বেশি স্পষ্ট
পুইয়ান খোদাখখশ

উইন্ডোজ কনসোল (সেন্টিমিটার) এর জন্য, পদক্ষেপ 2 তে git log --diff-filter=D --summary | find "delete" | find "MyFile"git checkout "bd8374c^" -- full/path/to/MyFile.js
গ্রেপের পরিবর্তে ফাইন্ড ব্যবহার করুন

30

@ আম্বর সঠিক উত্তর দিয়েছেন! আরও একটি সংযোজন, যদি আপনি ফাইলটির সঠিক পথটি না জানেন তবে আপনি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন! এটি আমার পক্ষে কাজ করেছে।

git log --all -- **/thefile.*

4
নিবন্ধন করুন আমি জানি না শীর্ষ ভোটের একটিতে বিদ্যমান উত্তরটি অনুলিপি করার বিষয়ে আমি কীভাবে অনুভব করছি: / এই উত্তরটি নিজেও কার্যকর ছিল; একটি upvote যথেষ্ট হতে পারে?
ক্লিমেট

1
প্রকল্পের মূলটিতে থাকলে (সাইগউইনে পরীক্ষিত) ফাইলটি এটি খুঁজে পাবে না।
25 এ ওয়ার্টওয়ার্ট

19

নীচে একটি সাধারণ কমান্ড দেওয়া হয়েছে, যেখানে কোনও দেব বা গিট ব্যবহারকারী একটি সংগ্রহযোগ্য ফাইলের নাম সংগ্রহস্থল রুট ডিরেক্টরি থেকে পাস করে ইতিহাসটি পেতে পারেন:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

যদি কেউ, কমান্ড উন্নত করতে পারেন, দয়া করে।


1
অান্তরিক ধন্যবাদ! দেখে মনে হচ্ছে আমার ফাইলটি কখনই অস্তিত্বহীন, তবে এটি একটি পৃথক এবং অনেক চুলচেরা বিষয়…

আপনার ফাইলটি 'অনুপস্থিত' বলে মনে হচ্ছে যদি আপনি এটি সংগ্রহস্থল মূল ডিরেক্টরি থেকে চালাচ্ছেন তা নিশ্চিত করুন
samaspin

ধন্যবাদ @ সামাস্পিন উত্তর আপডেট করেছেন।
জেসন

18

দর্শকদের মধ্যে একটি ব্যবহার করার চেষ্টা করুন, যেমন gitkআপনি সেই অর্ধেক মনে রাখা ফাইলটি খুঁজে পেতে ইতিহাসের চারপাশে ব্রাউজ করতে পারেন। ( gitk --allসমস্ত শাখার জন্য প্রয়োজন হলে ব্যবহার করুন )


4
যে --allবিকল্প উভয় আপনার উত্তর এবং গ্রহণযোগ্য উত্তরের জন্য গুরুত্বপূর্ণ।
hobs

3
ইতিহাসের চারপাশে ব্রাউজিং বেশিরভাগ প্রকল্পের জন্য একটি অসাধারণ পরিমাণ সময় নেবে।
মাইকম্যাকানা

5

সারসংক্ষেপ:

  1. ধাপ 1

আপনি মুছে ফেলা ফাইলগুলির ইতিহাসে আপনার ফাইলের পুরো পথটি অনুসন্ধান করেন git log --diff-filter=D --summary | grep filename

  1. ধাপ ২

আপনার ফাইলটি মোছার আগে কমিট থেকে পুনরুদ্ধার করুন

restore () {
  filepath="$@"
  last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
  echo "Restoring file from commit before $last_commit"
  git checkout $last_commit^ -- $filepath
}

restore my/file_path

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.