গিট সংগ্রহস্থলে একটি মুছে ফেলা ফাইলটি সন্ধান এবং পুনরুদ্ধার করুন


2802

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

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

  1. প্রদত্ত ফাইলের নাম মুছে ফেললে সেই প্রতিশ্রুতি সন্ধান করার দ্রুততম উপায় কী হবে?
  2. সেই ফাইলটি আমার ওয়ার্কিং কপিতে ফিরে পাওয়ার সহজতম উপায় কী হবে?

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


39
দয়া করে মনে রাখবেন পূর্ববর্তী মন্তব্যে শিরোনামে প্রশ্নের উত্তর, শরীর নেই - যে দুঃশ্চিন্তা অন্তর্ভুক্ত যখন ফাইল মুছে ফেলা হয়েছে।
avdgaag

8
প্রতিশ্রুতিবদ্ধতা সন্ধান করতে একটি ফাইল এতে মুছে ফেলা হয়েছে:git log --diff-filter=D -- path/to/file
টাইটানিয়ামডেকয়



54
@hhh git checkout deletedFileবিলোপমুক্ত হবে deletedFileযদি এটি মুছে ফেলা হচ্ছে জুলুম কিন্তু যে মুছে ফেলার এখনো হয়েছে করেননি মঞ্চস্থ বা সংঘটিত । এখানে প্রশ্নটি যা জিজ্ঞাসা করছে তা নয়; এই প্রশ্নটি এমন কোনও ফাইলকে পুনরুদ্ধার করার বিষয়ে যাঁর মুছে ফেলার জন্য বহু প্রতিশ্রুতি আগে প্রতিশ্রুতি দেওয়া হয়েছিল।
মার্ক

উত্তর:


3149

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

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"

94
জটিল বিটটি হ'ল ^ প্রত্যয় ব্যবহার করে কমিটিকে আগে চেক আউট করা। ধন্যবাদ।
ক্রিশ্চিয়ান ওডার্ড

4
কিছু কারণে, এটি zsh এ কাজ করবে না। ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ আমি বাশ এ স্যুইচ করেছি এবং এটি দুর্দান্ত কাজ করেছে।
জোরাস

20
উইন্ডোজ কমান্ড লাইন থেকে আমি একটি ত্রুটি পেয়েছি। error: pathspec <filename> did not match any file(s) known to git.। সমাধানটি ছিল গিট ব্যাশ ব্যবহার করা।
স্বতঃস্ফূর্তভাবে

56
@ জোরাস জেডএস এর '^' এর নিজস্ব সম্প্রসারণ রয়েছে আমি বিশ্বাস করি তবে আপনি '~ 1' এর বিকল্প বাক্য গঠন ব্যবহার করতে পারেন: git checkout <deleting-commit>~1 -- <file-path> ~ এক্স আপনাকে নির্দিষ্ট কমিটের আগে এক্স কমিট নির্দিষ্ট করার অনুমতি দেয়, তাই ~ 1 কমিটের আগে, ~ 2 এর আগে দুটি কমিট, ইত্যাদি
নিলস লাক্সটন

22
উইন্ডোজ সিএমডি প্রম্পটে, ^চরিত্রটি হ'ল পালানো চরিত্র! অতএব, ^^সেন্টিমিডিতে আপনাকে সিএমডি বলতে টাইপ করতে হবে যে আপনি একটি একক আক্ষরিক চান want এবং এটির পরে আপনি অন্য কোনও কিছু থেকে পালাতে পারবেন না। অনেকের ক্ষেত্রে যা ঘটছে তা ^হ'ল স্থানটি অনুসরণ করে। তাই সেন্টিমিডি মনে করে আপনি স্থানটি থেকে পালাচ্ছেন - যা কেবল স্থানের অক্ষর দেয়। সুতরাং, সময় গিট ক্লায়েন্ট আর্গুমেন্ট পেতে, এটি দেখতে SHA1এবং না SHA1^ । এটা সত্যিই বিরক্তিকর. ~একটি পালানোর চরিত্র নয়, তাই সে কারণেই এখনও কাজ করে। (পিএস। আপনি যদি ভাবেন যে গুগলরা এই তথ্যটি চাইবেন, দয়া করে এই মন্তব্যটিকে উপস্থাপন করুন)
আলেকজান্ডার বার্ড

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

$commitপ্রথম ধাপে আপনি যে প্রতিশ্রুতি পেয়েছেন তার মূল্য কোথায় Wheree4cf499627


10
কৌতূহলী, ~ 1 কী বোঝায়?
টমি ছেং

7
@ টমি - টিলডে স্পেক আপনাকে নামকৃত কমিটের নবম নাতি দেবে। আরও তথ্যের জন্য book.git-scm.com/4_git_treeishes.html দেখুন ।
রবার্ট মুন্তানু

5
এটি এখন পর্যন্ত সবচেয়ে সহজ এবং স্বজ্ঞাত পদ্ধতির। git log -- *PartOfMyFileName*$commit~1
13

3
git checkout $commit~1 filenameসিনট্যাক্স পৃথক ফাইলে নিখুঁত কাজ করে, এবং এছাড়াও পুরো ডিরেক্টরি জন্য কাজ করে। যেমন: sha 12345 থেকে সমস্ত চিত্র মুছে ফেলা হয়েছে git checkout 12345~1 images। এই উত্তরের জন্য ধন্যবাদ!
নুনপুট

34
@ অ্যালেক্সার $commit~1মানে আপনার কমিটের নাম যুক্ত করা উচিত। কিছু 1d0c9ef6eb4e39488490543570c31c2ff594426cযেখানে $commitআছে।
ইউজিন

319

কোনও ফোল্ডারে মুছে ফেলা সমস্ত ফাইল পুনরুদ্ধার করতে, নিম্নলিখিত কমান্ডটি প্রবেশ করুন।

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

1
ফাইলগুলি কোথায় পাইপ করা হবে? আমি কোন পরিবর্তন দেখতে পাচ্ছি।
উইলিয়াম গ্র্যান্ড

21
এটি সম্ভবত সবচেয়ে সহজ পদ্ধতি। এটি বিকৃত কীভাবে gitএমনকি সহজতম কাজটিকেও কঠিন করে তুলেছে।
jww

গিট চেকআউট - [ফাইল] [ফাইল] এর পরিবর্তনগুলি ফিরিয়ে দেবে। পাইপ মুছে ফেলা ফাইলগুলির নামের সাথে [ফাইল] প্রতিস্থাপন করবে।
মনু

6
ls-filesসাব-কমান্ড কুশলী, কিন্তু যে সঙ্গে মুছে হয়েছে ফাইলের জন্য কাজ বলে মনে হচ্ছে না git rmঅর্থাত মঞ্চস্থ, ঘাঁটান প্রতিশ্রুতিবদ্ধ, যা কি ওপি জিজ্ঞাসা।
মার্কহু

এটি মুছে ফেলা ফাইলগুলি পুনরুদ্ধার করার জন্য কাজ করেছিল, তবে যে ফাইলগুলি পরিবর্তিত হয়েছিল এবং M myChangedFileপরে দেখা যাবে সেগুলি আমি কীভাবে আপডেট করব git checkout?
16:58

124

আমি এই প্রশ্নে এসেছি কেবলমাত্র মুছে ফেলা একটি ফাইল পুনরুদ্ধার করতে চাইছি তবে আমি এখনও এই পরিবর্তনটি প্রতিশ্রুতিবদ্ধ হই নি। আপনি যদি এই পরিস্থিতিতে নিজেকে খুঁজে পান তবে আপনাকে যা করতে হবে তা হ'ল:

git checkout HEAD -- path/to/file.ext


93

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

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

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

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

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

git bisect reset
git revert <the offending commit>

অথবা আপনি কোনও প্রতিশ্রুতি ফিরে যেতে পারেন এবং ম্যানুয়ালি ক্ষতির ক্ষতি করতে পারেন:

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

2
আপনি বিস্তারিত বলতে পারেন git bisect run '[ -e foo.bar ]'?
avdgaag

আপনি নিজেও ভাল এবং খারাপ ব্যবহার করতে পারেন, যদি এটি এমন কিছু হয় যা স্বয়ংক্রিয়ভাবে চেক করা যায় না। দ্বিখণ্ডিত ম্যান পৃষ্ঠাটি দেখুন।
জোশ লি

1
@ অভডগাগ দি গিটকে git bisect run'রান' শব্দটি নিম্নলিখিত কমান্ডটি চালিয়ে বাইসেকশন স্বয়ংক্রিয় করতে বলেছে যেখানে কমান্ডটি 0কোনও goodসংস্করণের জন্য ফিরে আসতে হবে ( git help bisectবিশদ বিবরণ দেখুন)। '[ -e foo.bar ]'পরীক্ষা যদি ফাইলের জন্য একটি মান অভিব্যক্তি foo.barবিদ্যমান (বাস্তবায়ন ফাইলে সাধারণত করে /usr/bin/[যা সাধারণত করার hardlinked হয় /usr/bin/test) এবং একক quation চিহ্ন একটি একক কমান্ড লাইন আর্গুমেন্ট হিসাবে যে সব লাগাতে ব্যবহার করা হয়।
মিক্কো রেন্টালাইনেন

ভালো বুদ্ধি. আমি এই পদ্ধতির চেষ্টা করেছি এবং এটি মুছে ফেলার আগে একটি প্রতিশ্রুতি চিহ্নিত করেছিল, কিন্তু প্রতিশ্রুতি দেয় না যা ফাইলটি মুছে ফেলেছে। এবং অন্য পরীক্ষায় এটি মুছে ফেলার আগে 2 টি কমিট সনাক্ত করেছে।
মাইকেল ওসোফস্কি

উন্মাদ? হতে পারে. তবে দ্বিখণ্ডিত হ'ল একটি ত্রুটি কোথায় প্রবর্তিত হয়েছিল তা সন্ধানের জন্য দুর্দান্ত উপায় এবং তাই যাইহোক এটি শেখার একটি মূল্যবান দক্ষতা। সুতরাং যদিও এখানে 'সঠিক' বা সর্বাধিক 'সঠিক' উপায় নয় তবে এটি এখনও একটি ভাল ধারণা এবং অবশ্যই একটি +1 মূল্যবান!
প্রাইফটান

77

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

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

সঙ্কট এড়ানো গেল।

সতর্কবাণী, গীত 2.23 (চতুর্থাংশ 3 2019) দিয়ে আসে পরীক্ষামূলক কমান্ড নামে git restore(!)।
সুতরাং এই উপনামটির নাম পরিবর্তন করুন (নীচে দেখানো হয়েছে)।


রবার্ট ডেইলি মন্তব্যগুলিতে নীচের উপন্যাসটির প্রস্তাব দিয়েছেন :

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\"" 

7
এটি কেবল অনুরোধ করা ফাইলটিই নয়, পুরো প্রতিশ্রুতি পুনরুদ্ধার করে।
ড্যানিয়েল ব্যাং

5
এখানে আমার ওরফে, আশ্চর্যজনকভাবে কাজ করে:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer

1
@ রবার্টডাইলি দেখতে দুর্দান্ত লাগছে! আরও দৃশ্যমানতার জন্য উত্তরে আমি আপনার উপনামকে অন্তর্ভুক্ত করেছি।
ভোনসি

1
কমান্ড লাইন থেকে git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
উপন্যাসটি

2
Expansion of alias 'restore' failed; '!git' is not a git command
কার্ল মরিসন

54

যদি আপনি ফাইলের নামটি জানেন, তবে এটি প্রাথমিক আদেশগুলি সহ একটি সহজ উপায়:

এই ফাইলটির জন্য সমস্ত কমিটগুলি তালিকাবদ্ধ করুন।

git log -- path/to/file

শেষ প্রতিশ্রুতি (শীর্ষস্থানীয়) হ'ল ফাইলটি মুছে ফেলা। সুতরাং আপনাকে শেষ থেকে দ্বিতীয় প্রতিশ্রুতি পুনরুদ্ধার করতে হবে।

git checkout {second to last commit} -- path/to/file

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

পরবর্তী-থেকে-শেষের প্রতিশ্রুতি (মুছে ফেলার আগের প্রতিশ্রুতি) মুছে ফেলা ফাইলটির সর্বশেষ সংস্করণটি ধারণ করবে না? সেকেন্ড-টু-লাস্ট (মুছে ফেলার পূর্বের প্রতিশ্রুতি দেওয়ার আগে প্রতিশ্রুতি) হতাশ হয়ে পুরানো হতে পারে।
সানকাট 2000

1
এটি আমি প্রথম সমাধান যা দেখেছি এটি যথেষ্ট সহজ যে পরের বার এটি খুঁজে পেতে আমাকে এখানে ফিরে আসতে হবে না। হতে পারে.
ইলফ

@ সানক্যাট 2000 "দ্বিতীয় থেকে শেষ" এর অর্থ "মুছে ফেলার আগের প্রতিশ্রুতি", "শেষের পরের" এর মতো। en.wiktionary.org/wiki/penultimate#Synonyms
wisbucky

এই জবাবের জন্য এক মিলিয়নবার ধন্যবাদ !!!!!
রাকেশ বিকে

29

একটি মুছে ফেলা এবং চালিত ফাইলটি পুনরুদ্ধার করতে:

git reset HEAD some/path
git checkout -- some/path

এটি গিট সংস্করণ 1.7.5.4 এ পরীক্ষা করা হয়েছিল।


1
এটি আমার পক্ষে কাজ করেনি। চেকআউট করার পরে, আমি error: pathspec 'foo' did not match any file(s) known to git.ফাইলের নামটি সঠিক কিনা তা নিশ্চিত করেছিলাম। গিট সংস্করণ ২.7.০
উইসবাকী ২ '

-1; এটা ভুল. এই কমান্ডগুলি এমন একটি মোছাটিকে পূর্বাবস্থায় ফিরিয়ে আনবে যা এখনও প্রতিশ্রুতিবদ্ধ হয়নি (প্রথমটি মুছে ফেলার বিষয়টি যদি মঞ্চস্থ হয়, এবং দ্বিতীয়টি ফাইলটিতে অনির্ধারিত পরিবর্তনগুলি বাতিল করে) তবে আপনি এখানে দাবি করছেন যে তারা কোনও প্রতিশ্রুতি পুনরুদ্ধার করবেন ফাইলটি মুছে ফেলা, যা সহজভাবে সত্য নয় এবং উপরের মত @ উইশবাকির মন্তব্যে এমন একটি ত্রুটি সহ ব্যর্থ হবে।
মার্ক

@ মারক্যামেরি প্রকৃতপক্ষে, আমি মনে করি এই আদেশটি সেই বিকাশকারীদের পক্ষে ভাল কাজ করেছে, যারা মুছে ফেলা ফাইলগুলির প্রতিশ্রুতিবদ্ধ করার জন্য স্পষ্টভাবে মঞ্চায়ন করেনি git add -A, তবে পুনরুদ্ধার করা ফাইলটি এখনও অবিশ্রদ্ধ পর্যায়ে ছিল।
ফেদির RYKHTIK

25

আপনি যদি কেবল পরিবর্তন করেন এবং কোনও ফাইল মুছে ফেলে থাকেন তবে তা প্রতিশ্রুতি না দিয়ে থাকেন এবং এখন আপনি নিজের পরিবর্তনগুলি ভেঙে ফেলেছেন

git checkout -- .

তবে আপনার মোছা ফাইলগুলি আর ফিরে আসেনি, আপনি কেবল নীচের আদেশটিটি করেন:

git checkout <file_path>

এবং প্রেস্টো, আপনার ফাইল ফিরে এসেছে।


24

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

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

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

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

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

প্রতিশ্রুতিবদ্ধ 3ea4e3af253ac6fd1691ff6bb89c964f54802302 লেখক: আলেকজান্ডার অরলভ তারিখ: থু মে 12 22:10:22 2011 +0200

। এখন কমিট আইডি ব্যবহার করুন bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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


এটি স্বীকৃত উত্তরের মতো একই পদ্ধতি, তবে মোছার প্রতিশ্রুতি সন্ধান করার আরও কয়েকটি উপায়ের সাথে। আমি এখনও গ্রহণযোগ্য উত্তরে গৃহীত পদ্ধতির পছন্দ করি তবে এগুলি ভাল বিকল্প। ধন্যবাদ!
avdgaag

আমি ধরে নিই যে প্রথমে মুছে ফেলা ফাইলটি পরীক্ষা করে নেওয়া এবং তারপরে (এটি পরিবর্তন না করে) কমিট করে ফাইলের অনুলিপি তৈরি করা হয় না । রাইট? (ছবিগুলির সাথে আমার এটি করা দরকার, এবং একটি অনুলিপিগুলি
ভান্ডারটিকে আরও


12

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
    

এই عرفটি এই ফাইলটি যেখানে বিদ্যমান ছিল সেখানে সর্বশেষ প্রতিশ্রুতি সন্ধান করার জন্য পরীক্ষা করে এবং তারপরে এই ফাইলটি যেখানে উপস্থিত ছিল সেখানে commit ফাইলের পাথের একটি গিট চেকআউট করে commit উত্স


11

অনেক ক্ষেত্রে গিটের সাথে মিলিয়ে কোরিউটিলস (গ্রেপ, সেড ইত্যাদি) ব্যবহার করা কার্যকর হতে পারে । আমি ইতিমধ্যে এই সরঞ্জামগুলি বেশ ভালভাবে জানি, তবে গিট কম less যদি আমি মুছে ফেলা ফাইলটির জন্য অনুসন্ধান করতে চাই, তবে আমি নিম্নলিখিতগুলি করতাম:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

আমি যখন সংশোধনটি পাই / প্রতিশ্রুতিবদ্ধ:

git checkout <rev>^ -- path/to/refound/deleted_file.c

অন্যরা যেমন আমার আগে বলেছে।

ফাইলটি এখন অপসারণের পূর্বে যে অবস্থায় ছিল তা পুনরুদ্ধার করা হবে। আপনি যদি এটি চারপাশে রাখতে চান তবে এটি কার্যক্ষম গাছটিতে পুনরায় প্রতিশ্রুতিবদ্ধ মনে রাখবেন।


7

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

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 

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

ফাইলগুলি .gitignore ফাইলটিতে যুক্ত করা হয়েছিল এবং তারপরে এটি সাফ করা হয়েছিল git rm। আমার ফাইলগুলি পুনরুদ্ধার করার দরকার ছিল, তবে তারপরে সেগুলি আনস্টেজ করুন। আমার কাছে পুনরুদ্ধার করার জন্য শত শত ফাইল ছিল এবং অন্যান্য ফাইলগুলির মতো প্রতিটি ফাইলের জন্য ম্যানুয়ালি জিনিস টাইপ করা খুব ধীর হতে চলেছিল।


7

আসলে, এই প্রশ্নের সরাসরি গীত সম্পর্কে, কিন্তু আমার মত কারো মত গুই সরঞ্জামগুলির সাথে কাজ করে WebStorm VCS গীত CLI কমান্ড সম্পর্কে জেনে ছাড়া অন্য।

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

এখানে চিত্র বিবরণ লিখুন

ভিসিএস সরঞ্জামগুলি সমস্ত সংশোধনী ট্রেন দেখায় এবং আমি তাদের প্রত্যেকের কমিট এবং পরিবর্তনগুলি দেখতে পারি।

এখানে চিত্র বিবরণ লিখুন

তারপরে আমি সেই কমিটগুলি নির্বাচন করি যা আমার বন্ধু PostAd.jsফাইলটি মুছে দেয় । এখন নীচে দেখুন:

এখানে চিত্র বিবরণ লিখুন

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

এখানে চিত্র বিবরণ লিখুন

আমি জানি আমার উত্তরটি গিট আদেশ নয়, তবে এটি দ্রুত, নির্ভরযোগ্য এবং প্রাথমিক এবং পেশাদার বিকাশকারীদের পক্ষে সহজ। ওয়েবস্টোরম ভিসিএস সরঞ্জামগুলি গিটের সাথে কাজ করার জন্য দুর্দান্ত এবং নিখুঁত এবং এর জন্য অন্য কোনও প্লাগইন বা সরঞ্জামের প্রয়োজন নেই।


1
এটা সত্যিই দারুন! ধন্যবাদ. যারা জেটব্রেইনসের আইডিই ব্যবহার করেন তাদের পক্ষে অবশ্যই একটি সহজ সমাধান।
ফাবিয়ানো আরুদা

ফাইলটি যদি এটির চিত্র হয় তবে আমরা কীভাবে পুনরুদ্ধার করব?
নদিরাবেগিমক্সোনয়িম

প্রিয় @ ফ্যাবিওআররুদা, জেটব্রেইনস আইডিইগুলি উন্নয়নের শক্তিশালী সরঞ্জাম। আপনার সুন্দর মন্তব্য জন্য ধন্যবাদ।
আমেরেলিকাএ

সংস্করণটির জন্য আপনাকে প্রিয় @ পিটারমোরটেনসেনকে ধন্যবাদ।
আমেরেলিকাএ

6

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

তালিকা ঝুঁকির কমিট করে

git fsck --lost-found

প্রতিটি ঝুঁকিপূর্ণ প্রতিশ্রুতি পরিদর্শন করুন

git reset --hard <commit id>

আমি যখন ঝুঁকির প্রতিশ্রুতিতে চলে এসেছি তখন আমার ফাইলগুলি আবার উপস্থিত হয়েছিল।

git status কারণে:

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


2
আপনাকে অনেক ধন্যবাদ. আপনি আমাকে কয়েক হাজার লাইন কোড পুনরুদ্ধার করতে সহায়তা করেছিলেন।
রূবেণ

5
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

মুছে ফেলা ফাইলটি পুনরুদ্ধার করুন:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex

2
মুছে ফেলা এবং পরিবর্তনটি প্রতিশ্রুতিবদ্ধ হওয়ার পরে ফাইলটি পুনরুদ্ধার সম্পর্কে প্রশ্ন ছিল। এই উত্তরটি এমন একটি ফাইল পুনরুদ্ধার করার বিষয়ে যা কেবলমাত্র ওয়ার্কিং ডিরেক্টরিতে সরানো হয়েছিল।
আকাইহোলা

এটি সত্য, এবং এটিই আমি খুঁজছিলাম।
হোলা সোয় এদু ফেলিজ নাভিদাদ

4

আপনি যদি সেই প্রতিশ্রুতিটি জানেন যা ফাইল (গুলি) মুছে ফেলেছে তবে এই আদেশটি চালান যেখানে <SHA1_deletion>প্রতিশ্রুতিবদ্ধ ফাইলটি মুছে ফেলা হয়েছে:

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

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


4

আপনার ফাইলটি মোছার প্রতিশ্রুতি সন্ধান করুন:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

নমুনা আউটপুট:

4711174

গিট ২.২৩ পর্যন্ত আসলে একটি restoreকমান্ড রয়েছে। এটি এখনও পরীক্ষামূলক তবে কোনও প্রতিশ্রুতি দ্বারা সরানো কোনও কিছু পুনরুদ্ধার করার জন্য (এই ক্ষেত্রে 4711174) আপনি টাইপ করতে পারেন:

git restore --source=4711174^ path/to/file

উল্লেখ্য ^ আইডি কমিট পর আমরা কমিট কাছ থেকে কিছু পুনরুদ্ধার করতে চান আগে এক যে ফাইল মোছা হয়েছে।

--sourceযুক্তি বলে restoreকমান্ড যেখানে ফাইল (গুলি) পুনঃস্থাপন জন্য চেহারা এবং এটি কোনো কমিট এবং এমনকি সূচক হতে পারে।

দেখুন: গিট 2.23.0 এর জন্য গিট-রিস্টোর ডক


4

আমাদের ক্ষেত্রে আমরা দুর্ঘটনাক্রমে একটি প্রতিশ্রুতিবদ্ধভাবে ফাইলগুলি মুছে ফেলেছিলাম এবং কিছু পরে কমিট করে আমরা আমাদের ভুল বুঝতে পারি এবং মুছে ফেলা সমস্ত ফাইলগুলি ফিরে পেতে চাইতাম, তবে পরিবর্তিত ফাইলগুলি নয়।

চার্লস বেলির দুর্দান্ত উত্তরের ভিত্তিতে, এখানে আমার ওয়ান-লাইনার:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

2

সহজ এবং নির্ভুল-

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

git log 

বলুন যে আপনি 1234567 ... এর পরে $ প্রতিশ্রুতিবদ্ধ সন্ধান করেছেন

git checkout <$commitid> $fileName

এটি সেই প্রতিবেদনে থাকা ফাইল সংস্করণটি পুনরুদ্ধার করবে।


1

এটি করার সর্বোত্তম উপায়ে চেষ্টা করুন।


প্রথমে আপনার ফাইলটি মোছার প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ আইডি সন্ধান করুন। এটি আপনাকে কমিটগুলির একটি সারাংশ দেবে যা ফাইলগুলি মুছে ফেলে।

গিট লগ - ডিফ-ফিল্টার = ডি - সুমোরি

গিট চেকআউট 84sdhfddbdddf ~ 1

বিঃদ্রঃ: 84sdhfddbddd আপনারcommit id

এর মাধ্যমে আপনি সহজেই মুছে ফেলা সমস্ত ফাইল পুনরুদ্ধার করতে পারবেন।


1

আপনি সর্বদা git revertআপনার প্রতিশ্রুতিবদ্ধ করতে পারেন যা ফাইলটি মুছে ফেলে। ( এটি ধরে নেয় যে মুছে ফেলা দায়বদ্ধতার একমাত্র পরিবর্তন ছিল ))

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

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

> git revert 2994bd

এখন git logদেখায়:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

এবং readme.mdপুনরায় সংগ্রহস্থলে পুনরুদ্ধার করা হয়েছে।


যেহেতু প্রশ্নটি অনুমান করে যে ফাইলটি মুছে ফেলার পরে বেশ কয়েকটি কমিটি করা হয়েছিল এবং যেহেতু পরবর্তী কমিটিগুলি অযাচিত হয় তার কোনও ইঙ্গিত নেই, সুতরাং বর্ণিত পরিস্থিতিতে এটি ওপিকে সাহায্য করবে বলে মনে হয় না।
জোনাথন লেফলার

1
হাঁ! আপনি পরবর্তী কমিটগুলি করতে পারেন, এবং এখনও মুছে ফেলা প্রতিশ্রুতি ফিরে করতে পারেন vert সুতরাং যদি প্রতিশ্রুতিবদ্ধ 111 ফাইলটি মুছে ফেলে এবং 222, 333, 444 প্রতিশ্রুতিবদ্ধ করে, জিনিসগুলি যুক্ত করে / সংশোধন করে তবে আপনি মুছে
ফেলাটি

0

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

git checkout <file path with name>

নীচের উদাহরণটি আমার পক্ষে কাজ করছে:

git checkout resources/views/usaSchools.blade.php


দয়া করে সমস্যাটি উল্লেখ করুন
আকবর

মোছা ইতিমধ্যে প্রতিশ্রুতিবদ্ধ ছিল। এই ক্ষেত্রে থেকে পুনরুদ্ধার করতে আপনাকে প্রতিশ্রুতি নির্দিষ্ট করতে হবে।
এসবিএ


-1

যদি মোছাটি প্রতিশ্রুতিবদ্ধ না হয় তবে নীচের কমান্ডটি কার্যকারী গাছের মধ্যে মুছে ফেলা ফাইলটি পুনরুদ্ধার করবে।

$ git checkout -- <file>

নীচের কমান্ডটি ব্যবহার করে আপনি কার্যক্ষম গাছের সমস্ত মুছে ফেলা ফাইলের একটি তালিকা পেতে পারেন।

$ git ls-files --deleted

যদি মোছাটি প্রতিশ্রুতিবদ্ধ হয় তবে প্রতিশ্রুতিটি যেখানে ঘটেছিল তা সন্ধান করুন, তবে এই প্রতিশ্রুতি থেকে ফাইলটি পুনরুদ্ধার করুন।

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

আপনি যদি ফাইলটি পুনরুদ্ধার করার জন্য সন্ধান করছেন তবে নীচের কমান্ডটি সমস্ত মুছে ফেলা ফাইলের সংক্ষিপ্তসার প্রদর্শন করবে।

$ git log --diff-filter=D --summary

-1

গিটের সাথে মুছে ফেলা সমস্ত ফাইল পুনরুদ্ধার করার জন্য, আপনি এটিও করতে পারেন:

git checkout $(git ls-files --deleted)

যেখানে git ls-files --deletedসমস্ত মুছে ফেলা ফাইলগুলি তালিকাভুক্ত করে এবং git checkout $(git command)প্যারামিটারে ফাইলগুলির তালিকা পুনরুদ্ধার করে।

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