আমি কীভাবে কোনও ফাইলকে একটি নির্দিষ্ট সংশোধনীতে পুনরায় সেট করতে বা ফিরিয়ে আনতে পারি?


4511

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

আমার যে সংশোধন প্রয়োজন তা সন্ধান করার জন্য আমি একটি git logপাশাপাশি কাজ করেছি git diff, তবে কীভাবে অতীতে ফাইলটি পূর্বের অবস্থায় ফিরে পাওয়া যায় তার কোনও ধারণা নেই।


11
প্রত্যাবর্তনের পরে, --cachedচেক করার সময় ভুলবেন না git diffলিঙ্ক
জেফ্রি হেল

5
আমি আপনার প্রশ্নটি খুঁজে পেয়েছি। তবে আমি সমাধানটি পড়ার পরে, আমি আমার লগটি পরীক্ষা করে জানতে পেরেছিলাম যে আমি স্ট্যান্ডলোন কমিট হিসাবে থোজে পরিবর্তন আনলাম, তাই আমি সেই প্রতিশ্রুতিটির জন্য গিটকে ফিরিয়ে দিয়েছি, এবং আমি যা চাইছিলাম ততই বাকি ছিল stayed কোনও সমাধান নয়, কখনও কখনও এটি করার অন্য একটি উপায়।
sudo97

উত্তর:


6129

আপনি যে প্রতিশ্রুতি চান তা হ্যাশ ধরে নেওয়া c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

Git চেকআউট man পৃষ্ঠা আরো তথ্য দেয়।

আপনি যদি পূর্বে প্রতিশ্রুতিতে ফিরে যেতে চান তবে c5f567সংযোজন ~1(যেখানে আপনি ফিরে যেতে চান এমন কমিটের সংখ্যা 1, এটি যে কোনও কিছু হতে পারে):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

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


12
@ শ্যাডোহাউন্ড: এটিকে বিপরীত করার কোনও উপায় আছে, তাই এটির ঠিক পরে সংস্করণটি রয়েছে?
aliteralmind

16
@ এলিটালালমাইন্ড: না, দুর্ভাগ্যক্রমে গিট ইতিহাসের শর্টকাট স্বরলিপি কেবল ইতিহাসের পিছনে চলে যায়।
গ্রেগ হিউগিল

45
আপনি যদি অ্যাবিডির জন্য একটি শাখার নাম ব্যবহার করতে যাচ্ছেন (উদাহরণস্বরূপ develop) আপনি চাইবেন git checkout develop -- file/to/restore(ডাবল ড্যাশ নোট করুন)
ওহাদ স্নাইডার

8
@ এলিটালালমাইন্ড: আসলে, হ্যাঁ, এটি করার একটি উপায় রয়েছে: "গিট লগ - রিভার্স -1 --্যানাস্ট্রি-পাথ আপনারজিট্রেভ..মাস্টার" এবং তারপরে কেবল গিটটি পুনরুদ্ধারের জন্য উপযুক্ত বিকল্পগুলি ব্যবহার করুন। --ancestry- পথটি দুটি কমিটের মধ্যে "একটি লাইন আঁকবে" এবং -1 আপনাকে কেবল একটি সংস্করণ দেখিয়ে দেবে, এবং - বিপরীতটি নিশ্চিত করবে যে প্রথম প্রবেশ করানোটি সবচেয়ে পুরনো is
ক্রিস কগডন

6
ব্যক্তিগতভাবে আমি হেড ~ 1 :) এর চেয়ে বেশি টাইপ করা সহজ বলে মনে করি
জজলিন

606

আপনি ডিফ কমান্ডটি ব্যবহার করে কোনও ফাইলের পরিবর্তনগুলি দ্রুত পর্যালোচনা করতে পারেন:

git diff <commit hash> <filename>

তারপরে একটি নির্দিষ্ট ফাইলটিকে সেই প্রতিশ্রুতিতে ফিরিয়ে আনতে রিসেট কমান্ডটি ব্যবহার করুন:

git reset <commit hash> <filename>

--hardআপনার যদি স্থানীয় পরিবর্তন থাকে তবে আপনাকে বিকল্পটি ব্যবহার করতে হবে ।

ওয়েপপয়েন্টগুলি পরিচালনা করার জন্য একটি ভাল ওয়ার্কফ্লো হ'ল আপনার টাইমলাইনে পরিষ্কারভাবে পয়েন্ট চিহ্নিত করতে ট্যাগ ব্যবহার করা। আমি আপনার শেষ বাক্যটি বেশ বুঝতে পারি না তবে আপনি যা চান তা হ'ল একটি পূর্ববর্তী বিন্দু থেকে সময়কে একটি শাখা ডাইভারেজ করা। এটি করতে, হ্যান্ডি চেকআউট কমান্ডটি ব্যবহার করুন:

git checkout <commit hash>
git checkout -b <new branch name>

আপনি যখন এই পরিবর্তনগুলিকে একীভূত করতে প্রস্তুত হন তখন আপনি এটি আপনার মূল লাইনের বিপরীতে পুনরায় শোধ করতে পারেন:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

7
'গিট চেকআউট << হ্যাশ>' কমান্ডটি আমাকে প্রকল্পের আমার পুরানো সংস্করণটি ঠিক এটির জন্য ফিরিয়ে দিয়েছে যার জন্য আমি ধন্যবাদ ক্রিসকে অনুসন্ধান করছি।
vidur punj

48
ফাইলটি git checkout <commit hash> <filename>git reset
ফেরাতে

3
আমি একটি একক ফাইলের প্রারম্ভিক সংস্করণ চেয়েছিলাম কারণ খারাপভাবে বাছাইকৃত অনুলিপি / পেস্ট দিয়ে আমি 150 লাইন ওভাররাইট করেছি। git checkout <commit hash> <filename>আমার জন্য কাজ। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, আইএমএইচও। git resetনা।
হার্পারভিল

24
git resetএকক ফাইল পুনরায় সেট করতে ব্যবহার করতে পারবেন না , আপনি একটি ত্রুটি পাবেনfatal: Cannot do hard reset with paths
'11

13
স্লেয়ার কী বলেছেন: আপনি পারবেন না git reset --hard <commit hash> <filename>। এটি fatal: Cannot do hard reset with paths.মট্টি স্ট্রোম যা বলেছে তার সাথে ত্রুটি ঘটবে : ব্যবহার করুনgit checkout <commit hash> <filename>
হককি পার্কার

366

আপনি SHA-1 সহ গিট কমিটের কোনও রেফারেন্স ব্যবহার করতে পারেন যদি এটি সবচেয়ে সুবিধাজনক হয়। মুল বক্তব্যটি হ'ল কমান্ডটি এরকম দেখাচ্ছে:

git checkout [commit-ref] -- [filename]


22
এই উত্তরটির মধ্যে পার্থক্য কী, যা আছে --এবং গ্রহণযোগ্য উত্তর নেই?
2rs2ts

80
গিটে, ফাইল তালিকার আগে একটি '-' গিটকে বলে যে পরবর্তী সমস্ত আর্গুমেন্টগুলি ফাইলের নাম হিসাবে ব্যাখ্যা করা উচিত, শাখা-নাম বা অন্য কিছু হিসাবে নয়। এটি কখনও কখনও একটি সহায়ক বিড়ম্বনা।
ফক্সস্ট্রোট

49
'-' কেবল গিট কনভেনশনই নয়, এমন কিছু যা আপনি * নিক্স কমান্ডলাইনে বিভিন্ন স্থানে খুঁজে পান। rm -- -f(নামের একটি ফাইল সরিয়ে ফেলুন -f) এটি ক্যানোনিকাল উদাহরণ হিসাবে মনে হয়। এখানে আরও বিশদ
হককি পার্কার

7
@ হক্কিপার্কার যা বলেছিলেন তার সাথে কেবল যুক্ত করুন, rmকমান্ড তার তর্কগুলি পার্স করার জন্য getopt (3) ব্যবহার করে। getoptকমান্ড আর্গুমেন্ট পার্স করার কমান্ড। gnu.org/software/libc/manual/html_node/Getopt.html
ডিভি

2
@ হানি হ্যাঁ, এটাই আমার অর্থ, এবং হ্যাঁ, সম্ভবত এটি মোটেই সাধারণ নয়। আমি উদাহরণটি বিভিন্ন স্থানে দেখেছি, সম্ভবত এটিকে স্মরণীয় করে রাখার জন্য: rm -f ভয়ঙ্কর / বিপজ্জনক হিসাবে সুপরিচিত। তবে মুল বক্তব্যটি হল, * নিক্সে একটি ফাইলের নাম '-' দিয়ে শুরু হতে পারে এবং এটি বিভিন্ন কমান্ডলাইন দোভাষীকে বিভ্রান্ত করবে যেগুলি যখন তারা '-' দেখবে, তখন একটি কমান্ড বিকল্প অনুসরণ করার প্রত্যাশা করবে। এটি '-' দিয়ে শুরু হওয়া কোনও ফাইল হতে পারে; উদাহরণস্বরূপ, "-মাইস্পেশিয়াল ফাইল"।
হক্কে পার্কার

287
git checkout -- foo

যা fooহেডে পুনরায় সেট হবে । আপনি এটিও করতে পারেন:

git checkout HEAD^ foo

একটি রিভিশন ফিরে ইত্যাদি


12
আমি বিশেষ কিছু (ডিরেক্টরি বা ডিরেক্টরি হিসাবে চিহ্নিত ফাইল ) এর git checkout -- fooকোনও ভুল এড়াতে সিনট্যাক্স ব্যবহার করার পরামর্শ দেব । গিট সহ, যদি আপনি অনিশ্চিত হন তবে সর্বদা বিশেষ যুক্তি দিয়ে সমস্ত ফাইল এবং ডিরেক্টরি উপসর্গ করুন । foo-f--
মিক্কো রেন্টালাইনেন

8
মিক্কোর মন্তব্যে একটি অতিরিক্ত নোট: --গিট কমান্ড নয় এবং গিটের জন্য বিশেষ নয়। কমান্ড বিকল্পগুলির সমাপ্তি বোঝাতে এটি অন্তর্নির্মিত। আপনি এটি অন্যান্য অনেক ব্যাশ কমান্ডের সাহায্যেও ব্যবহার করতে পারেন।
ম্যাথিউয়াস

14
@ ম্যাটথিউস এটি বাশ বা শেল বৈশিষ্ট্যও নির্দিষ্ট নয়। এটি একটি কনভেনশন যা বিভিন্ন বিভিন্ন কমান্ডে প্রয়োগ করা হয় (এবং getopt দ্বারা সমর্থিত)।
গ্রেগ হিউগিল

2
না, --হয় না ব্যাশ একটি builtin বিশেষ শব্দ। তবে এটি একটি কমন কনভেনশন যা অনেক কমান্ডলাইন পার্সার দ্বারা সমর্থিত এবং গিট সহ অনেকগুলি সিএলআই দ্বারা ব্যবহৃত হয়।
এমিল লুন্ডবার্গ

123

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

git checkout HEAD file/to/restore

2
এই (গিট চেকআউট হেড ফাইল / থেকে / পুনরুদ্ধার) এবং গিট রিসেট --হार्ड ফাইল / টু / রিস্টোরের মধ্যে পার্থক্য কী ???
মোটি শ্নের

2
1) আরও সাধারণ উপায়ে মনে রাখা সহজ 2) ফাইলের নাম
রোমান সুসি

105

আমার এখনই একই সমস্যা ছিল এবং আমি এই উত্তরটি বুঝতে সহজতর পেয়েছি (আপনি commit-refযে লগটিতে ফিরে যেতে চান তার পরিবর্তনের এসএইচএ মান):

git checkout [commit-ref] [filename]

এটি আপনার কার্যকারী ডিরেক্টরিতে সেই পুরানো সংস্করণটি রাখবে এবং সেখান থেকে আপনি চাইলে এটি প্রতিশ্রুতিবদ্ধ করতে পারেন।


91

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

git checkout master~5 image.png

এটি ধরে নেওয়া হয় যে আপনি masterশাখায় রয়েছেন এবং আপনি যে সংস্করণটি চান তা 5 টি ফিরে আসে।


80

আমি মনে করি আমি এটি পেয়েছি .... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html থেকে

কখনও কখনও আপনি কেবল ফিরে যেতে চান এবং প্রতিটি পরিবর্তনকে একটি নির্দিষ্ট পয়েন্টের আগে ভুলে যেতে চান কারণ তারা সব ভুল।

শুরু করা:

$ git log

যা আপনাকে সাম্প্রতিক কমিটগুলির একটি তালিকা এবং তাদের SHA1 হ্যাশগুলি দেখায়।

পরবর্তী, টাইপ করুন:

$ git reset --hard SHA1_HASH

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


24
গিট কখনই কোনও কিছু সরিয়ে দেয় না। আপনার পুরানো প্রতিশ্রুতিগুলি এখনও আছে কিন্তু যদি সেখানে কোনও শাখার টিপ না দেখানো হয় তবে সেগুলি আর পৌঁছানো যায় না। আপনি গিট-জিসি দিয়ে আপনার সংগ্রহস্থলটি পরিষ্কার না করা পর্যন্ত গিট রিফ্লোগগুলি সেগুলি প্রদর্শিত হবে।
বোম্বে

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

4
সম্ভবত একটি দ্বারা অনুসরণgit push --force
bshirley

4
যদি আপনার
বিনা অনুমতিতে

5
@ বোম্বে - "গিট কখনই কোনও কিছুই সরিয়ে দেয় না Your - তবে এটির মতো কমিটগুলি কিছু নির্দিষ্ট সময়ের পরে ছাঁটাই করা হয়, সুতরাং "গিট কখনই কিছুই সরিয়ে দেয় না" অসত্য।
বুলওয়ার্সেটর

61

এটি আমার পক্ষে কাজ করেছে:

git checkout <commit hash> file

তারপরে পরিবর্তনটি সম্পাদন করুন:

git commit -a

54

"রোলব্যাক" বলার সময় আপনাকে সতর্কতা অবলম্বন করতে হবে। আপনি যদি কমিট $ এ ফাইলের একটি সংস্করণ ব্যবহার করে থাকেন এবং পরে দুটি পৃথক কমিটিকে changes বি এবং $ সিতে দুটি পরিবর্তন করেছেন (সুতরাং আপনি যা দেখছেন তা ফাইলের তৃতীয় পুনরাবৃত্তি), এবং যদি আপনি বলেন " আমি প্রথমটিতে ফিরে যেতে চাই ", আপনি কি সত্যই এটি বোঝাতে চাইছেন?

আপনি যদি দ্বিতীয় এবং তৃতীয় পুনরাবৃত্তি উভয়ই পরিবর্তনগুলি থেকে মুক্তি পেতে চান তবে এটি খুব সহজ:

$ git checkout $A file

এবং তারপরে আপনি ফলাফলটি প্রতিশ্রুতিবদ্ধ হন। কমান্ডটি জিজ্ঞাসা করে "আমি অঙ্গীকার $ এ দ্বারা রেকর্ড করা রাষ্ট্র থেকে ফাইলটি পরীক্ষা করতে চাই"।

অন্যদিকে, আপনি যা বোঝাতে চেয়েছিলেন তা হল দ্বিতীয় পুনরাবৃত্তির (যেমন প্রতিশ্রুতি $ বি) আনা পরিবর্তন থেকে মুক্তি পাওয়া, যখন ফাইলটি প্রতিশ্রুতিবদ্ধ $ C কী করেছিল, আপনি $ বিটিকে ফিরিয়ে আনতে চান

$ git revert $B

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


আমি এটি করেছি, কিন্তু তারপরে একটি "গিট লগ ফাইল" বলবে যে আমি আসল প্রতিশ্রুতিতে ছিলাম, হেড। দেখে মনে হয়েছিল "গিট চেকআউট" ব্যর্থ হচ্ছে। তবে, গিটের স্থিতি প্রদর্শন করে যে ফাইলটি আসলে পরিবর্তিত হয়েছিল এবং একটি "গিট ডিফ - স্টেজড ফাইল" প্রকৃত পরিবর্তনগুলি প্রদর্শন করবে। এছাড়াও, "গিট স্ট্যাটাস" ফাইলটিও বদলেছে changed সুতরাং কোন ফাইল পরিবর্তন হয়েছে তা ট্র্যাক করতে এখানে "গিট লগ" ব্যবহার করবেন না।
ফ্রেডেরিক ওলিঞ্জার

37

মজাদারভাবে, git checkout fooযদি ওয়ার্কিং কপি নামের একটি ডিরেক্টরিতে থাকে তবে কাজ করবে না foo; তবে git checkout HEAD fooএবং উভয়ই git checkout ./foo:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

26
বাgit checkout -- foo
নিটল

32

এখানে কীভাবে rebaseকাজ করে:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

ধরুন আপনার আছে

---o----o----o----o  master
    \---A----B       <my branch>

প্রথম দুটি কমান্ড ... গিট চেকআউট গিট রিবেস মাস্টার প্রতিশ্রুতিবদ্ধ

... আপনি যে masterশাখায় প্রয়োগ করতে চান সেগুলির শাখাটি পরীক্ষা করে দেখুন । rebaseহুকুম থেকে করে নেয় <my branch>(যে পাওয়া যায় না masterপ্রধান) এবং তাদের reapplies master। অন্য কথায়, প্রথম প্রতিশ্রুতিবদ্ধতার পিতামাতা <my branch>এখন আর masterইতিহাসের পূর্বের প্রতিশ্রুতি নয়, তবে বর্তমান প্রধান master। দুটি কমান্ড একই:

git rebase master <my branch>

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

। চূড়ান্ত ইতিহাসের ফলাফল:

---o----o----o----o   master
                   \----A'----B'  <my branch>

চূড়ান্ত দুটি কমান্ড ...

git checkout master
git merge <my branch>

... সমস্ত <my branch>পরিবর্তন প্রয়োগ করার জন্য একটি দ্রুত-ফরোয়ার্ড মার্জ করুন master। এই পদক্ষেপ ব্যতীত, রিবেস প্রতিশ্রুতি যুক্ত হয় না master। চূড়ান্ত ফলাফল:

---o----o----o----o----A'----B'  master, <my branch>

masterএবং <my branch>উভয় রেফারেন্স B'। এছাড়াও, এই স্থানটি থেকে এটি <my branch>উল্লেখ মুছে ফেলা নিরাপদ ।

git branch -d <my branch>

25

গিট ভি ২.২.৩.০ হিসাবে একটি নতুন গিট পুনরুদ্ধার পদ্ধতি রয়েছে যা এর জন্য git checkoutকিছুটা দায়ী বলে ধারণা করা হয় (এমনকি স্বীকৃত উত্তরে উল্লেখ করা হয়েছে যেটি git checkoutবেশ বিভ্রান্তিকর)। গিথব ব্লগে পরিবর্তনের হাইলাইটগুলি দেখুন ।

এই আদেশের ডিফল্ট আচরণ হ'ল sourceপ্যারামিটার থেকে আসা সামগ্রী (যা আপনার ক্ষেত্রে প্রতিশ্রুতিবদ্ধ হ্যাশ হবে) সহ একটি কার্যক্ষম গাছের অবস্থা পুনরুদ্ধার করা ।

সুতরাং গ্রেগ হিউগিলের উত্তরের উপর ভিত্তি করে (কমিট হ্যাশটি ধরে নেওয়া c5f567) কমান্ডটি এরকম দেখাচ্ছে:

git restore --source=c5f567 file1/to/restore file2/to/restore

অথবা আপনি যদি c5f567 এর আগে একটি প্রতিশ্রুতিবদ্ধ সামগ্রীটি পুনরুদ্ধার করতে চান:

git restore --source=c5f567~1 file1/to/restore file2/to/restore

24

টার্গেট ফাইলের জন্য প্রথম রিসেট হেড

git reset HEAD path_to_file

দ্বিতীয় ফাইল চেকআউট

git checkout -- path_to_file

4
+1, যদিও হেড পুনরায় সেট করার উদ্দেশ্য সম্পর্কে নিশ্চিত না। এটি প্রয়োজন বা নাও হতে পারে। আমার পরিস্থিতিতে আমি কেবলমাত্র একটি নির্দিষ্ট ফাইলটি সংগ্রহস্থলের সংস্করণে ফিরে যেতে চেয়েছিলাম (যা স্থানীয় পরিবর্তনগুলি অক্ষত রাখে above উপরের দ্বিতীয় ধাপটি চালানো আমার পক্ষে যথেষ্ট ছিল
fkl

হ্যাঁ আমার কেবল দ্বিতীয় কমান্ড চালানো দরকার। লাইক -> শেলহ্যাকস.com
revert-

22

গিট-এলিয়াস, অ্যাডক এবং শেল-ফাংশনগুলি উদ্ধার করার জন্য!

git prevision <N> <filename>

<N>ফাইলের রোলব্যাক করতে ফাইলের পুনর্বিবেচনার সংখ্যাটি কোথায় <filename>
উদাহরণস্বরূপ, একক ফাইলের তাত্ক্ষণিক পূর্ববর্তী সংশোধনটি পরীক্ষা করতে x/y/z.c, চালান

git prevision -1 x/y/z.c

গিট অগ্রাধিকার কিভাবে কাজ করে?

নিম্নলিখিতটি আপনারটিতে যুক্ত করুন gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

মূলত কমান্ড

  • git logনির্দিষ্ট ফাইল এবং উপর একটি সঞ্চালন
  • ফাইলের ইতিহাসে উপযুক্ত কমিট-আইডিটি তুলে ধরে এবং
  • git checkoutনির্দিষ্ট ফাইলটির জন্য কমিট- আইডিতে একটি কার্যকর করে।

মূলত, এই পরিস্থিতিটিতে ম্যানুয়ালি যা কিছু করা হয়, তা
একটি সুন্দর, দক্ষ গিট-উরফে জড়িত - গিট-প্রেজিড


20

আমাকে এখানে ইজিজিট প্লাগ করতে হবে, যা পাকা ব্যবহারকারীদের বিভ্রান্ত না করে গিটারটিকে নভিসিদের কাছে আরও অ্যাক্সেসযোগ্য করার জন্য একটি মোড়ক। এটির মধ্যে একটি জিনিস আরও অর্থ দেয়git revert । এই ক্ষেত্রে, আপনি সহজভাবে বলতে হবে:

eg revert foo/bar foo/baz


1
এটা হওয়া উচিত eg revert --in REVISON -- FILENAME--inগুরুত্বপূর্ণ। উইন্ডোজ ব্যবহারকারীদের জন্য: গিট ব্যাশ খুলুন। সম্পাদন echo %PATH। প্রথম পাথটি আপনার ব্যবহারকারী ডিরেক্টরিতে শেষ হওয়া উচিত bin। সেই পথটি তৈরি করুন। স্টোর যেমন সেখানে। এর নাম দিন eg। না eg.txt
কোপ্পোর

20

আপনি যে কোনও ফাইলকে পূর্বের প্রতিশ্রুতিতে ফিরিয়ে দিতে চান (এবং যে ফাইলটি আপনি ইতিমধ্যে প্রতিশ্রুতিতে ফিরে যেতে চান) আপনি ব্যবহার করতে পারেন

git checkout HEAD^1 path/to/file

অথবা

git checkout HEAD~1 path/to/file

তারপরে কেবল "নতুন" সংস্করণটি মঞ্চ করুন এবং প্রতিশ্রুতিবদ্ধ করুন।

একীভূত হওয়ার ক্ষেত্রে কমিটের দু'জন পিতা-মাতার থাকতে পারে এমন জ্ঞান নিয়ে সজ্জিত, আপনার জানা উচিত যে হেড ^ 1 প্রথম পিতা-মাতা এবং হেড ~ 1 দ্বিতীয় পিতা-মাতা।

হয় গাছের একমাত্র পিতা বা মাতা থাকলে কাজ করবে।


19

এখানে অনেক পরামর্শ, সবচেয়ে লাইন বরাবর git checkout $revision -- $file। অস্পষ্ট বিকল্পগুলির একটি দম্পতি:

git show $revision:$file > $file

এবং এছাড়াও, আমি সাময়িকভাবে একটি নির্দিষ্ট সংস্করণ দেখতে এটি প্রচুর ব্যবহার করি:

git show $revision:$file

অথবা

git show $revision:$file | vim -R -

(ওবিএস: এটির জন্য আপেক্ষিক পথ হলে $fileপ্রিফিক্স করা দরকার./git show $revision:$file কাজ করার )

এবং আরও উদ্ভট:

git archive $revision $file | tar -x0 > $file

1
এটি একটি দুর্দান্ত বিকল্প যদি আপনি নিশ্চিত না হন যে কোন প্রতিশ্রুতিবদ্ধ সংস্করণটি আপনি চান এবং আপনার কার্যনির্বাহী ডিরেক্টরিটি ওভাররাইট না করেই "উঁকি দেওয়ার" প্রয়োজন।
উইসবাকি

18

মনে রাখবেন, তবে, যে git checkout ./fooএবং git checkout HEAD ./foo হয় না ঠিক একই জিনিস; বিন্দু ক্ষেত্রে:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(দ্বিতীয় addপর্যায়ে সূচীতে ফাইল রয়েছে, তবে এটি প্রতিশ্রুতিবদ্ধ হয় না ))

Git checkout ./fooএর অর্থ সূচক./foo থেকে ফেরত পাথ ; যোগ গীত নির্দেশ করে তার থেকে সূচক সেই পথ রূপে ফিরিয়ে নিয়ে যেতে ফলে পূর্বে সংশোধনের।HEADHEAD


14

আমার জন্য উত্তরটির কোনওটিই সত্যিই পরিষ্কার মনে হয়নি এবং অতএব আমি খনিটি যুক্ত করতে চাই যা খুব সহজ বলে মনে হচ্ছে।

আমার একটি প্রতিশ্রুতিবদ্ধ abc1এবং এর পরে আমি একটি ফাইলে বেশ কয়েকটি (বা একটি পরিবর্তন) করেছিfile.txt

এখন বলুন যে আমি ফাইলটিতে কিছু গণ্ডগোল পেয়েছি file.txtএবং আমি পূর্বের প্রতিশ্রুতিতে ফিরে যেতে চাইabc1

1।git checkout file.txt .: আপনার যদি প্রয়োজন না হয় তবে এটি স্থানীয় পরিবর্তনগুলি সরিয়ে ফেলবে

git checkout abc1 file.txt: এটি আপনার ফাইলটিকে আপনার পছন্দসই সংস্করণে নিয়ে আসবে

git commit -m "Restored file.txt to version abc1":: এটি আপনার বিপরীতকরণ করবে।

  1. git push : এটি দূরবর্তী সংগ্রহস্থলের উপর সবকিছু ঠেলা দেবে

2 এবং 3 পদক্ষেপের মধ্যে অবশ্যই আপনি git statusকী বুঝতে পারছেন তা বুঝতে পারেন । সাধারণত আপনার file.txtইতিমধ্যে যুক্ত হওয়া উচিত এবং এজন্য কোনও প্রয়োজন নেই git add


2
ঠিক আছে তাই আমি অনুমান করি 1. এবং 2 টি পারস্পরিক একচেটিয়া: যদি abc1 আপনার শেষ প্রতিশ্রুতি থাকে তবে 2 এর দরকার নেই এবং যদি আপনি abc1 এর পরে অন্য কমিটগুলি করেন তবে আপনি সরাসরি করতে পারেন 2
জিন পল

13
  1. গিটটি একটি নির্দিষ্ট প্রতিশ্রুতিতে ফাইল রিভার্ট করুন
git checkout Last_Stable_commit_Number -- fileName

২.গিটকে একটি নির্দিষ্ট শাখায় ফিরিয়ে দিন

git checkout branchName_Which_Has_stable_Commit fileName

11

ফাইলটির আগের কমিট সংস্করণে যেতে, কমিট নম্বরটি পান, তবে eb917a1 বলুন

git checkout eb917a1 YourFileName

আপনার যদি কেবল সর্বশেষ প্রত্যাবর্তিত সংস্করণে ফিরে যেতে হয়

git reset HEAD YourFileName
git checkout YourFileName

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



10

এখানে অনেক উত্তর ব্যবহারের দাবি করে git reset ... <file>বা git checkout ... <file>তবে এটি করে আপনি যে <file>প্রতিশ্রুতি প্রত্যাহার করতে চান তার পরে প্রতিশ্রুতিবদ্ধদের পরিবর্তন করে ফেলবেন।

যদি আপনি কেবল একটি একক ফাইলের জন্য একটি কমিট থেকে পরিবর্তনগুলি ফিরিয়ে নিতে চান git revertতবে কেবল একটি ফাইলের জন্য (বা কমিট ফাইলগুলির একটি উপসেট বলুন), আমি উভয় git diffএবং এটির git applyমতো ( <sha>হ্যাশের সাথে = হ্যাশ সহ ) ব্যবহার করার পরামর্শ দিচ্ছি আপনি ফিরে যেতে চান প্রতিশ্রুতিবদ্ধ):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

মূলত, এটি প্রথমে আপনি যে পরিবর্তনগুলি ফিরিয়ে নিতে চান তা সম্পর্কিত প্যাচ তৈরি করবে এবং তারপরে এই পরিবর্তনগুলি ফেলে দেওয়ার জন্য প্যাচটি রিভার্স-প্রয়োগ করুন।

অবশ্যই, যদি বিপরীত রেখাগুলি <sha1>এবং HEAD(বিরোধ) মধ্যে কোনও প্রতিশ্রুতি দ্বারা সংশোধন করা হত তবে এটি কাজ করবে না ।


এটি অনুমোদিত উত্তর হওয়া উচিত। আমি কিছুটা সরলীকৃত সংস্করণটির পরামর্শ দিতে পারি:git show -p <sha> path/to/file.ext|git apply -R
Amaury D

আপনি <sha>^!পরিবর্তে ব্যবহার করতে পারেন<sha>^ <sha>
cambunctious

8

ব্যবহারের git logনির্দিষ্ট সংস্করণটিতে এবং তারপর ব্যবহারের জন্য হ্যাশ কী সংগ্রহ করতেgit checkout <hashkey>

দ্রষ্টব্য: শেষটির আগে হ্যাশটি টাইপ করতে ভুলবেন না। সর্বশেষ হ্যাশ আপনার বর্তমান অবস্থান (HEAD) নির্দেশ করে এবং কিছুই পরিবর্তন করে না।


7

স্পষ্টতই কাউকে গিটের উপর একটি বোধগম্য বই লিখতে হবে, বা ডকুমেন্টেশনে গিটকে আরও ভালভাবে ব্যাখ্যা করা দরকার। এই একই সমস্যার মুখোমুখি আমি অনুমান করেছি

cd <working copy>
git revert master

শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরে আসবে যা মনে হচ্ছে।

ইয়ান


7

আপনি এটি 4 টি পদক্ষেপে করতে পারেন:

  1. আপনি যে ফাইলটি বিশেষভাবে ফিরিয়ে আনতে চান তা দিয়ে সম্পূর্ণ কমিটকে ফিরিয়ে দিন - এটি আপনার শাখায় একটি নতুন অঙ্গীকার তৈরি করবে
  2. সফট রিসেট যা প্রতিশ্রুতিবদ্ধ - প্রতিশ্রুতি সরিয়ে দেয় এবং পরিবর্তনগুলি কার্যকরী জায়গায় নিয়ে যায়
  3. ফিরিয়ে আনতে ও প্রতিশ্রুতিবদ্ধ করতে ফাইলগুলি হ্যান্ডপিক করুন
  4. আপনার কর্মক্ষেত্রে অন্যান্য সমস্ত ফাইল ফেলে দিন

আপনার টার্মিনালটিতে আপনাকে যা টাইপ করতে হবে :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> && git commit -m 'reverting file'
  4. git checkout .

শুভকামনা


সব পরিবর্তন ফিরে না?
arcee123

1
@ arcee123 হ্যাঁ, তবে পরবর্তী পুনরায় সেট করা সমস্ত পরিবর্তনগুলির প্রত্যাবর্তন পূর্বাবস্থায় ফিরে আসে। সমস্যাটি হ'ল কেবল git-revertপুরো রেপোতে কাজ করে, তাই ক্ষতিপূরণ দেওয়ার জন্য আমাদের অন্য সমস্ত কিছু পূর্বাবস্থায় ফিরিয়ে আনতে হবে।
টিমোথি

2
আমি ব্যবহারের পরামর্শ দিচ্ছি: ১. git revert --no-commit <commit_hash>git reset HEADএটি চারপাশে ভাসমান একটি অতিরিক্ত অঙ্গীকারকে বাঁচায় এবং কেবলমাত্র আপনার ওয়ার্কিং ডিরেক্টরিতে সমস্ত পরিবর্তন করে।
টিমোথি

@ গ্রেগ-হিউগিলের উত্তরটি আরও ভাল এবং স্পট রয়েছে। এটি একটি লম্পট এবং ব্যবহার করা উচিত নয়।
ড্যানিয়েল ট্র্যাঙ্কা

নির্দিষ্ট ফাইলগুলির প্রকৃত প্রত্যাবর্তনের জন্য ঠিক এটির প্রয়োজন। আমার পূর্ববর্তী প্রতিশ্রুতি থেকে কয়েকটি ফাইলে পরিবর্তনগুলি পূর্বাবস্থায় ফেলা দরকার ছিল যা ইতিমধ্যে দূরবর্তী সংগ্রহস্থলে পুশ হয়ে গিয়েছিল। আমি ফলাফলটি ফিরিয়ে দিয়েছি, পুনরায় সেট করেছি এবং প্রতিশ্রুতিবদ্ধ করেছি: git revert _oldcommit_ --no-commit git reset -- _unchanged1_ _unchanged2_ ... git commit -m "branch without changes to specific files"নতুন শাখার টিপটি উল্টানো ফাইলগুলি বাদে সমস্ত পরিবর্তন প্রতিফলিত করেছে।
সানকাট 2000

7

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

# git checkout <previous commit_id> <file_name>
# git commit --amend

এটি খুব সহজ। আমরা যদি কমিটের শীর্ষে কোনও পূর্বের কমিট আইডিতে কোনও ফাইল আনতে চাই তবে আমরা সহজেই তা করতে পারি।


5
git revert <hash>

প্রদত্ত প্রতিশ্রুতি ফিরিয়ে দেবে। দেখে মনে হচ্ছে আপনি git revertকেবল সাম্প্রতিক প্রতিশ্রুতিগুলিকেই প্রভাবিত করেন।

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


5

যদি আপনি আপনার শেষ প্রতিশ্রুতিগুলিতে কোনও ভুল ফাইল করেন তবে নির্দেশনাটি অনুসরণ করুন:

  1. ওপেন সোর্স ট্রি, এই প্রতিশ্রুতিতে পরিবর্তন করুন

ওপেন সোর্স ট্রি

  1. লাইনগুলি পরিবর্তন করুন এবং আপনার প্রতিশ্রুতিটি আবিষ্কার করুন যে ভুল ফাইল কমিট হিসাবে প্রেরণ করা হয়েছে

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

  1. আপনি এই প্রতিশ্রুতিতে আপনার পরিবর্তনগুলির তালিকা দেখতে পারেন উত্স গাছের ফাইলগুলির তালিকা
  2. এটি নির্বাচন করুন এবং তারপরে ... বোতামগুলি ডান হাতের ... ক্লিক করুন বিপরীত ফাইলটিতে ক্লিক করুন
  3. তারপরে আপনি এটিকে নীচে বাম দিকে ফাইল স্থিতি ট্যাবে দেখতে পাবেন এবং তারপরে স্টেস্ট ক্লিক করুন:

ফাইল স্থিতি ট্যাব

  1. আপনার ভিজ্যুয়াল স্টুডিও কোডটি খুলুন এবং আপনার সরানো ফাইলগুলি প্রতিশ্রুতি দিয়ে ফেরত দিন
  2. সর্বোপরি, আপনি উত্স ট্রিতে আপনার শেষ প্রতিশ্রুতিতে ফলাফল দেখতে পারেন

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

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