আংশিকভাবে চেরি-গিটের সাথে অঙ্গীকারবদ্ধ


500

আমি 2 টি বিভিন্ন শাখায় কাজ করছি: মুক্তি এবং বিকাশ

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

সমস্যাটি হ'ল আমার সমস্ত প্রতিশ্রুতিবদ্ধতার দরকার নেই, কেবলমাত্র কিছু ফাইলে কিছু শিকারী, তাই সাধারণ

git cherry-pick bc66559

কৌতুক না।

আমি যখন একটি

git show bc66559

আমি পার্থক্যটি দেখতে পাচ্ছি তবে আমার বর্তমান কার্যক্ষম গাছটিতে আংশিকভাবে প্রয়োগ করার ভাল উপায়টি জানি না।

উত্তর:


791

আপনি এখানে যে মূল জিনিসটি পেতে চাইছেন তা হ'ল git add -p(এর -pপ্রতিশব্দ --patch)। এটি সামগ্রীতে চেক করার একটি ইন্টারেক্টিভ উপায় সরবরাহ করে, প্রতিটি কুঁচকে inোকা উচিত কিনা তা আপনাকে সিদ্ধান্ত দিতে দেয় এবং এমনকি প্রয়োজনে আপনাকে প্যাচটি ম্যানুয়ালি সম্পাদনা করতে দেয়।

চেরি-পিকের সাথে একত্রে এটি ব্যবহার করতে:

git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset                   # unstage the changes from the cherry-picked commit
git add -p                  # make all your choices (add the changes you do want)
git commit                  # make the commit!

(গিট-চেরি-পিক-এর একটি --no-কমিট বিকল্প রয়েছে বলে মনে করিয়ে দেওয়ার জন্য টিম হেনিগানকে ধন্যবাদ জানাই, এবং আপনাকে পুনরায় সেট করতে হবে তা নির্দেশ করার জন্য ফেলিক্স রাবেকে ধন্যবাদ! যদি আপনি কেবল কিছু জিনিস কমিট থেকে বাদ দিতে চান তবে , আপনি git reset <path>...কেবল সেই ফাইলগুলি আনস্টেজ করতে ব্যবহার করতে পারেন ))

আপনি অবশ্যই add -pপ্রয়োজন হলে নির্দিষ্ট পথ সরবরাহ করতে পারেন। আপনি যদি একটি প্যাচ দিয়ে শুরু করছি আপনি প্রতিস্থাপন করতে পারে cherry-pickসঙ্গে apply


আপনি যদি সত্যিই একটি চান git cherry-pick -p <commit>(সেই বিকল্পটির অস্তিত্ব নেই), আপনার ব্যবহার করতে পারেন

git checkout -p <commit>

এটি আপনার নির্দিষ্ট প্রতিশ্রুতির বিপরীতে বর্তমান প্রতিশ্রুতি থেকে পৃথক হবে এবং আপনাকে পৃথকভাবে সেই ভিন্ন থেকে কুকুর প্রয়োগ করতে দেবে। এই বিকল্পটি আরও কার্যকর হতে পারে যদি আপনি যে প্রতিশ্রুতিটি আকর্ষণ করছেন তাতে যদি আপনি আগ্রহী নন এমন প্রতিশ্রুতির অংশে সংঘাতগুলি মিশে যায় ((দ্রষ্টব্য, তবে এটির checkoutথেকে পৃথক রয়েছে cherry-pick: এর বিষয়বস্তু সম্পূর্ণরূপে checkoutপ্রয়োগ করার চেষ্টা করে <commit>, cherry-pickবিভিন্নটির প্রয়োগ করে) এর পিতামাতার কাছ থেকে নির্দিষ্ট প্রতিশ্রুতিবদ্ধ। এর অর্থ এটি checkoutকেবলমাত্র কমিটের চেয়ে বেশি প্রয়োগ করতে পারে যা আপনার চেয়ে বেশি হতে পারে))


প্রকৃতপক্ষে, আমি যদি গিট 1.7.5.4 দিয়ে পরামর্শটি অনুসরণ করি তবে 'গিট অ্যাড-পি' বলে 'কোনও পরিবর্তন নেই' কারণ এটি ইতিমধ্যে সমস্ত সূচকে রয়েছে। 'গিট অ্যাড' এর আগে আমাকে একটি 'গিট রিসেট হেড' করা দরকার - কোনও বিকল্প দিয়ে রিসেটটি এড়াতে কোনও উপায়?
ফেলিক্স রাবে

@FelixRabe: আমি আসলে বিস্মিত যে কিছু সময়ে cherry-pick -nদৃশ্যত করা হয়নি পরিবর্তনগুলি ছেড়ে মঞ্চস্থ - কনভেনশন স্পষ্টভাবে যে --no-commitঅপশন বন্ধ ডান সমস্ত পরিবর্তন মঞ্চস্থ সঙ্গে আগে কমিট, অর্থাত্। আমি উত্তরে পুনরায় সেট করব।
ক্যাসাবেল

1
@Blixt যে, যদি করে যে অন্যান্য ডালে না কিন্তু আপনার বর্তমান শাখা ABCDEF হয়, git checkout -p <F>নেই না শুধু আপনার ফাঃ থেকে পরিবর্তনগুলি পেতে, আপনার ABCDEF সব একসাথে ভর্তা পায় এবং আপনি করতে দেয় সাজানোর কি অংশ যে আপনি চান আউট । এটিকে এফ থেকে কিছু পরিবর্তন করতে পারলে ব্যথা হয়। অন্যদিকে git cherry-pick -n <F>, আপনি কেবল এফ থেকে পরিবর্তনগুলি পান - এবং যদি এই পরিবর্তনগুলির মধ্যে কিছুগুলির বিরোধ হয় তবে এটি আপনাকে সহায়তা করে যাতে আপনাকে কীভাবে সঠিকভাবে মার্জ করতে হয় তা নির্ধারণ করতে পারেন।
ক্যাস্যাবেল

পরিবর্তনটি ফাইল সংযোজন করার সময় আমার এই সমস্যা ছিল। git resetএটি মঞ্চযুক্ত ফাইলগুলি সরিয়ে ফেলবে এবং কেবল add -p'যোগ করার জন্য কিছুই নয়' বলবে।
ইয়ান গ্রেঞ্জার

72

আমি জানি আমি একটি পুরানো প্রশ্নের উত্তর দিচ্ছি, তবে মনে হচ্ছে ইন্টারেক্টিভভাবে পরীক্ষা করে এটি করার নতুন উপায় আছে:

git checkout -p bc66559

ক্রেডিট আমি কি ইন্টারেক্টিভভাবে অন্য গিট কমিট থেকে কুকুরটিকে বেছে নিতে পারি?


36

আপনি যে পরিবর্তনগুলি চান তা ব্রাঞ্চের শীর্ষে রয়েছে তা ধরে নিয়ে আপনি গিট চেকআউটটি ব্যবহার করুন

একটি একক ফাইলের জন্য:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

একাধিক ফাইলের জন্য কেবল ডেইজি চেইন:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb

5
এটি পুরো ফাইলটি অনুলিপি করে: কেবল পরিবর্তনগুলিই নয়।
জেরেমি তালিকা

1
এই উত্তর, ঠিক এখন পর্যন্ত এখানে অন্য কোনও উত্তর হিসাবে, একটি বড় অসুবিধা আছে: এটি পরিবর্তনের মূল লেখককে সংরক্ষণ করে না, পরিবর্তে আপনার নামে প্রতিশ্রুতিবদ্ধ। পরিবর্তনটি যদি ভাল হয় তবে আপনি কারও creditণ চুরি করছেন, যদি কোনও পরিবর্তন খারাপ হয়, আপনি নিজেকে আগুনের উপরে রাখছেন। দেখে মনে হচ্ছে গিট চেরি-পিক-পি পাওয়ার কোনও উপায় নেই এবং লজ্জা এখনও এটি নেই।
pfalcon

15

মাইক মনকিউইকজে জবাবের ভিত্তিতে বিল্ডিং আপনি সরবরাহ করা sha1 / শাখা থেকে চেকআউট করার জন্য একক বা একাধিক ফাইলও নির্দিষ্ট করতে পারবেন।

git checkout -p bc66559 -- path/to/file.java 

এটি আপনাকে আপনার ফাইলের বর্তমান সংস্করণে প্রয়োগ করতে চান এমন পরিবর্তনগুলি ইন্টারেক্টিভ করে বাছাই করতে দেবে।


5
ফাইলটির বর্তমান সংস্করণটি যদি সেই সংস্করণ থেকে উল্লেখযোগ্যভাবে পৃথক হয় তবে এটি সমস্যাযুক্ত। আপনাকে অসংখ্য অপ্রাসঙ্গিক পরিবর্তন (যা প্রতিশ্রুতিতে উপস্থিত হয় না) দিয়ে অনুরোধ করা হবে। এছাড়াও, আপনি যে পরিবর্তনগুলি সত্যিই চান তা বর্তমানের পার্থক্যের হিসাবে "ছদ্ম আকারে" উপস্থিত হতে পারে, মূল পার্থক্য নয়। এটি সম্ভব যে আসল পার্থক্যটি আপনি দ্বন্দ্ব চান, এবং সঠিকভাবে মার্জ করতে হবে; আপনার এখানে সেই সুযোগ হবে না।
কাজ

1

আপনি যদি কমান্ড লাইনে ফাইলগুলির একটি তালিকা নির্দিষ্ট করতে চান এবং পুরো জিনিসটি একক পরমাণু কমান্ডে করতে চান তবে চেষ্টা করুন:

git apply --3way <(git show -- list-of-files)

--3way: যদি কোনও প্যাচ পরিষ্কারভাবে প্রয়োগ না হয় তবে গিট একটি সংহত দ্বন্দ্ব তৈরি করবে যাতে আপনি চালাতে পারেন git mergetool। বাদ দেওয়া গিটকে --3wayএমন প্যাচগুলি ছেড়ে দিতে বাধ্য করবে যা পরিষ্কারভাবে প্রয়োগ হয় না।


0

যদি "আংশিকভাবে চেরি পিকিং" এর অর্থ "ফাইলগুলির মধ্যে রয়েছে, কিছু পরিবর্তন বেছে নেওয়া অন্যকে ত্যাগ করা", এটি এনে এটি করা যেতে পারে git stash:

  1. পুরো চেরি বাছাই করুন।
  2. git reset HEAD^ সম্পূর্ণ চেরি-বাছাই করা প্রতিশ্রুতিটিকে স্টেস্ট না করা কাজের পরিবর্তনে রূপান্তর করতে।
  3. এখন git stash save --patch: স্ট্যাশ করার জন্য ইন্টারেক্টিভভাবে অযাচিত উপাদান নির্বাচন করুন।
  4. গিট আপনার কার্যকরী অনুলিপি থেকে স্ট্যাশড পরিবর্তনগুলি ফিরিয়ে আনবে।
  5. git commit
  6. দূরে নিক্ষেপ অবাঞ্ছিত পরিবর্তনের লুকোবার জায়গা: git stash drop

টিপ: আপনি যদি অযাচিত পরিবর্তনগুলির স্ট্যাশকে কোনও নাম দেন: git stash save --patch junkতবে এখনই (6) করতে ভুলে গেলে, পরে আপনি সেই স্ট্যাশটি এটি কীসের জন্য তা চিনতে পারবেন।


যদি আপনি কেবল চেরি-বাছাই করেন, তবে পুনরায় সেট করুন ... আপনার কাছে স্ট্যাশ করার কিছু নেই। উপরে যেমন বলা হয়েছে, আপনাকে --no-কমিটের সাথে একটি চেরি-পিক করতে হবে, বা একটি রিসেট --হার্ড হেড ~ করতে হবে ~ মনে রাখবেন আপনি নেতিবাচকভাবে প্রক্রিয়া করছেন (আপনি যা চান না তা নির্বাচন করুন)। উপরোক্ত গৃহীত সমাধানটি ইতিবাচক বা নেতিবাচক পদ্ধতির অনুমতি দেয়।
পিয়েরে-অলিভিয়ার ভারেসে

0

আপনার git format-patchপ্রতিশ্রুতিবদ্ধ প্রতিশ্রুতির অংশটি টুকরো টুকরো করার জন্য এবং git amএটি অন্য কোনও শাখায় প্রয়োগ করতে ব্যবহার করুন

git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.