চেরি কীভাবে কেবলমাত্র একটি ফাইলের জন্য পরিবর্তিত হয়, সম্পূর্ণ প্রতিশ্রুতি নয়


108

আমাকে একটি শাখায় প্রবর্তিত পরিবর্তনগুলি অন্য শাখায় প্রয়োগ করতে হবে। আমি এটি করতে চেরি পিক ব্যবহার করতে পারি। তবে, আমার ক্ষেত্রে আমি এমন পরিবর্তনগুলি প্রয়োগ করতে চাই যা কেবলমাত্র একটি ফাইলের জন্য প্রাসঙ্গিক, আমার পুরো প্রতিশ্রুতি নিতে চেরি লাগবে না। কিভাবে যে কি?


উত্তর:


137

আপনি কী অর্জন করতে চান তার উপর ভিত্তি করে আপনার বিভিন্ন বিকল্প রয়েছে:

আপনি যদি চান যে ফাইলের বিষয়বস্তু লক্ষ্য শাখার মতো হবে তবে আপনি ব্যবহার করতে পারেন git checkout <branch> -- <filename>। এটি তবে একক প্রতিশ্রুতিতে ঘটে যাওয়া পরিবর্তনগুলি "চেরি-বাছাই" করবে না, তবে কেবলমাত্র ফাইলটির ফলাফল হিসাবে নেওয়া হবে। সুতরাং যদি আপনি কোন প্রতিশ্রুতিতে একটি লাইন যুক্ত করেন তবে পূর্ববর্তী অঙ্গীকারগুলি আরও বেশি পরিবর্তিত হয় এবং আপনি কেবল এই লাইনটি অন্যান্য পরিবর্তনগুলি ছাড়াই যুক্ত করতে চান, তবে একটি চেকআউট আপনি চান তা নয়।

অন্যথায় আপনি যদি কেবল একটি একক ফাইলে প্রতিশ্রুতিবদ্ধ প্যাচটি প্রয়োগ করতে চান তবে আপনার একাধিক বিকল্প রয়েছে। আপনি দৌড়াতে পারেন git cherry-pick -n, অর্থাত্ এটি প্রতিশ্রুতি না দিয়ে, অঙ্গীকার সম্পাদনা করুন (উদাহরণস্বরূপ সমস্ত ফাইল পুনরায় সেট করে রিসেট git reset -- .করুন এবং কেবলমাত্র আপনি যে ফাইলটি ব্যবহার করে পরিবর্তন করতে চান তা কেবল যুক্ত করুন git add <filename>)। অথবা আপনি ফাইলটির জন্য ভিন্নতা তৈরি করতে পারেন এবং তারপরে ভিন্নতা প্রয়োগ করতে পারেন:

git diff <branch>^..<branch> -- <filename> | git apply

22

একটি তৈরি করুন patch fileএবং এটি প্রয়োগ করুন।

git diff branchname -- filename > patchfile
git apply patchfile

সম্পাদনা করুন:

যেহেতু আপনাকে কোনও কমিট থেকে পরিবর্তনগুলি নেওয়া দরকার তাই প্যাচটি এইভাবে তৈরি করুন:

git show sha1 -- filename > patchfile

1
git diff sha1(বা git diff branch- শাখাটি একই হ্যাশকে দেখায় তবে এটি একই) কেবলমাত্র সেই হ্যাশের সাথে সম্পর্কিত চলতি ডিরেক্টরিটিই কেবল ভিন্নতরূপে উত্পাদন করতে পারে, তবে তার নিজের দ্বারা প্রবর্তিত প্রতিশ্রুতিতে কী পরিবর্তন হয় তা নয়।
অকর্মা

সঠিক। উত্তরটি সম্পাদনা করেছেন। ধন্যবাদ।
সাইলেশ

1
git checkoutফাইলের নাম সহ -1 হ'ল এই পেরেকের জন্য সঠিক হাতুড়ি। এই দুটি বিকল্প অপ্রয়োজনীয়ভাবে জটিল।
রেন হেনরিচস

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

11

আর একটি সহজ কাজ হ'ল প্যাচটি স্থানীয়ভাবে পাওয়া এবং তারপরে ব্যবহার করুন:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

যদিও এটি চেরি বাছাই নয়।


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

7

গিটের জন্য সবকিছু প্রস্তুত রয়েছে :)

শুধু ব্যবহার git checkout <sha> <path-to-file>


4
এটি চেরি বাছাই নয় - যা ফাইলটি পুরোপুরি পরীক্ষা করে। লক্ষ্যটি একটি প্রতিশ্রুতিবদ্ধতা থেকে একটি নির্দিষ্ট পরিবর্তন করা। প্রায়শই এগুলি একই জিনিস হয় তবে কখনও কখনও তা হয় না।
অ্যান্ড্রুএফ

6
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

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


1
সাবধানতা অবলম্বন করুন, অন্য শাখার সংস্করণে নেই এমন ফাইলের পরিবর্তনগুলি হারাবে।
প্যাট্রিক Schlüter

এর সাথে একমত আপনার যদি কেবলমাত্র ফাইলটির একটি অনুলিপি প্রয়োজন হয় এবং আপনি এটি বর্তমান শাখায় পরিবর্তন করতে চান
ইসমাইল ইকবাল

1
কেউ গ্লোব ব্যবহার করতে পারে (পথ / *) এবং একাধিক পাথ / ফাইল নির্দিষ্ট করতে পারে
টড


1

আমি যা করতে চাই তা ব্যবহার করা git ls-tree

শুধু কর:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'

এটি আপনার গ্রেপের সাথে মেলে সমস্ত ফাইলের নাম মুদ্রণ করবে এবং প্রতিশ্রুতিবদ্ধ ফাইলগুলির SHA1 কী দেয়।

গিট শো আপনার শাখার বাইরের ফাইলগুলিতেও ব্যবহার করা যেতে পারে। ব্যবহার >একটি ফাইলে আউটপুট নল আপনার শেল থেকে ফলাফলের আপনি খুঁজছেন দেয়।


0

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

git show COMMIT_ID -- path/to/specific-file | git apply

উদাহরণ স্বরূপ:

git show 3feaf20 -- app/views/home/index.html | git apply

-9
git reset HEAD~1

ফাইলগুলি প্রাক কমিট পর্যায়ে নিয়ে যায়

git stash

স্মৃতি থেকে সরিয়ে দেয়

এখন আপনার শাখাটি বেশ পরিষ্কার (পূর্বের প্রতিশ্রুতিতে প্রত্যাবর্তিত)

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