আমি কি জিআইটিতে আংশিক প্রত্যাবর্তন করতে পারি?


156

মাল্টি ফাইল কমিটের ক্ষেত্রে কেবল একটি একক ফাইল বা কোনও ফাইলের কিছু পরিবর্তন করা কি সম্ভব?

পুরো গল্প আমি একগুচ্ছ ফাইল প্রতিশ্রুতিবদ্ধ। পরে বেশ কয়েকজন প্রতিশ্রুতি দেয় যে নামহীন থাকবে (জ্যাক !!!) তার সংগ্রহস্থলটিতে একটি ফাইল অনুলিপি করেছিল এবং বেশ কয়েকটি ফাইল প্রতিশ্রুতিবদ্ধ হয়েছিল, আমি কিছু পরিবর্তনগুলি ওভাররাইট করে। আমি যে ফাইলটি আঁটসাঁট করা বা আরও ভাল হয়ে উঠেছে সেটিকে আবার ফিরিয়ে দিতে চাই, ভিতরে গিয়ে সেই ফাইলটিতে দুটি পরিবর্তন ফিরিয়ে আনতে চাই। এটি টানা এবং ধাক্কা দেওয়ার পরে এটি একটি পৃথক রিভার্ট কমিট হতে হবে।


ব্রায়ান আমাকে ডান ট্র্যাকের উপর পেয়ে গেলেন। আমি গিট অ্যাড - প্যাচ ব্যবহার করে প্যাচটির মধ্যে সম্পাদনা ফাংশনটি ব্যবহার করে যা চাইছিলাম তা ব্যবহার করে শেষ করেছি।
ক্লাচ

2
আমি গেমটি থেকে বেশ দেরি করেছি, তবে আমি মনে করি আমি "সঠিক" উত্তরটি পেয়েছি ।
এনটিসি 2

@ এনটিসি 2 অদ্ভুতভাবে, গ্রহণযোগ্য উত্তরটি আপনার জন্য যেটির সাথে যুক্ত হয়েছে তার চেয়ে অনেক বেশি ভাল কাজ করেছে - এটি কেবল প্যাচগুলি প্রয়োগ করতে ব্যর্থ না হয়ে সমাধানের জন্য আমার জন্য সংহত বিবাদ তৈরি করেছিল created
ইরিডইন

@ লিরিডেন আপনি কি আমার পুরো উত্তরটি পড়েছেন? "বৈচিত্রগুলি" বিভাগে আমি দাবি করি যে --3wayপ্যাচ প্রয়োগে ব্যর্থতার পরিবর্তে মার্জ কোন্দলে ফলাফল যুক্ত করা ।
এনটিসি 2

উত্তর:


204

আপনি '--no-কমিট' বিকল্পটি যুক্ত করে একটি নতুন তৈরি না করেই প্রতিশ্রুতিটি প্রত্যাহার করতে পারেন। এটি মঞ্চ অঞ্চলে সমস্ত উল্টানো ফাইল ছেড়ে দেয়। সেখান থেকে, আমি একটি সফট রিসেট সম্পাদন করব এবং আমি যে পরিবর্তনগুলি চাইছিলাম তা যুক্ত করব। উদাহরণস্বরূপ ওয়ার্কফ্লো:

git revert <sha-of-bad-commit> --no-commit
git reset   // This gets them out of the staging area
<edit bad file to look like it should, if necessary>
git add <bad-file>
git checkout . // This wipes all the undesired reverts still hanging around in the working copy
git commit

42
নরম পুনরায় সেট করার পরে, আপনি git add -pএকটি ইন্টারেক্টিভ সেশন শুরু করতেও পারেন যা আপনাকে পুরো ফাইলের পরিবর্তে বেছে বেছে ফাইলের অংশ যোগ করতে দেয়। ( git reset -pচূড়ান্তভাবে স্টেস্টেজ স্টেজেস্টের পরিবর্তনগুলিও রয়েছে know এটি জেনে রাখা ভাল, তবে আপনি সম্ভবত এই পরিস্থিতিতে কী চান না not)
স্টাফান কোচেন

1
এটি হ'ল আমি যা খুঁজছিলাম: কাজের অনুলিপিতে ফিরে আসুন, ইন্টারেক্টিভভাবে কুনি নির্বাচন করুন, প্রতিশ্রুতিবদ্ধ। আপনি তার জন্য একটি বড়, নোনতা মানব-
স্মুচ প্রাপ্য

আরেকটি সমাধান এই এক দ্বারা অনুপ্রাণিত করা হবে revert, reset, stash -p, (লুকোবার জায়গা "বাতিল যে আমি actualy করতে চাই না") addবিশ্রাম,commit
সিরিল CHAPON

82

checkoutকমান্ডটি ব্যবহার করে আপনি ইন্টারেক্টিভ করে কোনও ফাইলের পুরানো সংস্করণ প্রয়োগ করতে পারেন ।

উদাহরণস্বরূপ, যদি আপনি কীভাবে COMMITআবার যুক্ত করার কোডটি সরিয়ে ফেলা হয় তা জানেন তবে আপনি নিম্নলিখিত কমান্ডটি চালাতে পারেন:

git checkout -p COMMIT^ -- FILE_TO_REVERT

গিট আপনাকে ফাইলের বর্তমান সংস্করণটি থেকে হারিয়ে যাওয়া কুকুরটিকে আবার যুক্ত করতে অনুরোধ করবে। আপনি eপরিবর্তনটি আবার প্রয়োগ করার আগে একটি প্যাচ তৈরি করতে ব্যবহার করতে পারেন ।


খুব দরকারী যদি আপনি কেবল ফাইলের অংশটি ফিরিয়ে দিতে চান! মূলত, মাথা থেকে খন্ডে পেতে,git checkout -p path/to/file
ফলস্টাফ

40

আপনি যে ফাইলগুলি ব্যবহার করে ফিরে যেতে চান তার পুরানো, ভাল সামগ্রীগুলি ম্যানুয়ালি পরীক্ষা করতে পারেন git checkout। উদাহরণস্বরূপ, আপনি যদি my-important-fileসংস্করণটিতে যে সংস্করণটি দিয়েছিলেন সেটিতে ফিরে যেতে চান abc123, আপনি এটি করতে পারেন

git checkout abc123 -- my-important-file

এখন আপনার my-important-fileপিছনে পুরানো বিষয়বস্তু রয়েছে এবং আপনি যদি মনে করেন তবে এগুলি সম্পাদনা করতেও পারেন এবং প্রতিশ্রুতিবদ্ধ হওয়ার জন্য প্রতিশ্রুতিবদ্ধ যা তার করা পরিবর্তনগুলি ফিরিয়ে দেবে। যদি আপনি প্রতিশ্রুতিবদ্ধ করতে চান তার প্রতিশ্রুতিবদ্ধতার কিছু অংশ যদি থাকে তবে git add -pআপনি যে প্যাচটি করছেন তা থেকে কেবল কয়েকটি কুকুরটিকে বেছে নিন।


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

2
টোটার, আমার উত্তর দেখুন। পরিবর্তনগুলি সংরক্ষণ করতে আপনি '-p' ব্যবহার করতে পারেন। উত্তরটি আসলে এটির খুব কাছাকাছি।
সেমিচিনজি 21

1
অথবা আপনি এটি একত্রিত করতে পারেন git checkout -p
লায়ো লাম

31

গিট মেলিং তালিকায় এটি করার একটি উপায় আমি পেয়েছি:

git show <commit> -- <path> | git apply --reverse

সূত্র: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406

প্রকারভেদ

প্যাচটি পরিষ্কারভাবে প্রয়োগ না হলে সেই আদেশটি ব্যর্থ হয়েছে (কোনও পরিবর্তন ঘটবে না), তবে --3wayপরিবর্তে আপনার সাথে দ্বন্দ্বগুলি আসবে যা আপনি নিজে নিজেই সমাধান করতে পারবেন ( এক্ষেত্রে কেসির উত্তর আরও ব্যবহারিক হতে পারে):

git show <commit> -- <path> | git apply --reverse --3way

আপনি আংশিক একাধিক কমিটগুলি প্রত্যাবর্তনের জন্য এটি ব্যবহার করতে পারেন, যেমন:

git log -S<string> --patch | git apply --reverse

<string>কোনও কমিটের সাথে পরিবর্তনগুলির সাথে ফাইলগুলি ফিরতে vert আমার ব্যবহারের ক্ষেত্রে আমার ঠিক এটিই দরকার ছিল (কয়েকটি পৃথক পৃথক পৃথক পৃথক পৃথক ফাইলের সাথে একই রকমের পরিবর্তনগুলি প্রবর্তন করার সাথে সাথে আমি সম্পর্কহীন ভাবে অন্য ফাইলগুলিকেও পরিবর্তন করতে চাইছিলাম যা আমি প্রত্যাহার করতে চাইনি)।

আপনি যদি এটিতে diff.noprefix=trueসেট করে থাকেন ~/.gitconfigতবে আপনাকে কমান্ডটি যুক্ত -p0করতে হবে git apply, যেমন

git show <commit> -- <path> | git apply -p0 --reverse

এই উত্তর গৃহীত উত্তরটির চেয়ে অনেক ভাল: "আরও ভাল, ভিতরে প্রবেশ করুন এবং সেই ফাইলটিতে দুটি পরিবর্তন ফিরিয়ে দিন"।
লিখেছিলেন

আমি কোনও প্রতিশ্রুতির কেবলমাত্র অংশটিই ফিরিয়ে নিতে চেয়েছিলাম, তাই আমি এটি করেছি: (1) git show ... > foo.txt (2) সম্পাদিত foo.txtআমি যে ডিফারগুলি সরিয়েছি তা সরানোর জন্য আমি (3) পুনরায় ফিরিয়ে আনতে চাইনি (3)git apply --reverse foo.txt এখনও তালিকাভুক্ত ডিফগুলি ফিরিয়ে আনতে চাই না foo.txt
cxw

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