মার্জ করা বা কমিট যোগ না করে শাখা বি থেকে ক এ পরিবর্তনগুলি প্রয়োগ করা


89

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

আমি যা চেষ্টা করেছি (যখন শাখাবিতে দাঁড়িয়ে):

git merge --no-commit branchA

কাজ করে না কারণ এটি আপনাকে মার্জ করার ভিতরে রাখে। এটি না হলে, এটি নিখুঁত হবে।

git checkout branchA -- .

কাজ করে না কারণ এটি ব্রাঞ্চএ..ব্রাচবি এবং পরিবর্তনের মাস্টার..ব্র্যাংএ-এর মধ্যে পরিবর্তনগুলি প্রয়োগ করে।

আর কিছু?

সম্পাদনা: হ্যাঁ, শাখা এ এর ​​পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ। এই উদাহরণে বিল্ড উন্নতিগুলির সাথে কেবল একটি শাখা রয়েছে তবে বৈশিষ্ট্য শাখায় কাজ করার সময় বিল্ডের উন্নতিগুলির সাথে এন শাখা থাকতে পারে যা আমি প্রয়োগ করতে চাই।


এ-তে পরিবর্তনগুলি কি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ?
থিওলডিস

উত্তর:


155

আমাকে ঠিক তেমন কিছু করতে হয়েছিল --squashএবং মার্জ কমান্ড যুক্ত করে এটি ঠিক করতে সক্ষম হয়েছি

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

4
এটির পাশাপাশি এটি কী করছে সে সম্পর্কেও একটি ব্যাখ্যামূলক নোট থাকা উচিত। এটি শাখা থেকে আপনার বর্তমান শাখায় পরিবর্তিত হওয়ার বিভিন্ন ধাপটি পর্যবেক্ষণ করে
করিমেলাশমাবি

আসুন আমি বলি যে আমি কেবল ব্রাঞ্চএ থেকে মাস্টারে কোডটি মার্জ করেছি তবে আমি কিছু ভুলে গিয়েছি এবং গিটারের ইতিহাসে আর একীভূত প্রতিশ্রুতি হিসাবে প্রদর্শিত না হয়ে এই মার্জ কমিটে আরও কয়েকটি কোড / পরিবর্তন যুক্ত করতে চাই। এই পদ্ধতি কাজ করবে?
সুস্মিত সাগর

@ সুস্মিত আমি মনে করি আপনি এটি করতে পারেন git commit —amendএবং এটি শেষ প্রতিশ্রুতিতে নতুন পরিবর্তন সংযোজন করবে, আমি পুরোপুরি নিশ্চিত নই যে এটি মার্জ
কমিটে

4
আমি মনে করি না - এখানে কোন প্রতিশ্রুতি দরকার? ডিফল্ট হওয়া উচিত।
পিটার

11

cherry-pick -n আপনার যা করা উচিত তা করা উচিত তবে আপনি কেন অনাস্থাবিহীন পরিবর্তন হিসাবে বিল্ড উন্নতি চান তা নিশ্চিত নই - যা বেশ কয়েকটি বিষয়কে আরও শক্ত করে তোলে (যেমন পরিবর্তিত ফাইলগুলিতে অন্য পরিবর্তনগুলি মার্জ করা, বা যে কোনও কিছু রিবেস করা)।

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

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

এর অর্থ আপনি নোংরা গাছের অনিচ্ছাকৃত পরিবর্তনগুলি জাগ্রাল করার পরিবর্তে শাখা সিতে গিটের সমস্ত বৈশিষ্ট্য ব্যবহার করতে পারেন।


ইউজকেস এর জন্য cherry-pick -n: আমি এলোমেলো জায়গায় প্রচুর স্টাফ যুক্ত করে আমার কোডের একটি ওয়ার্কিং কপি তৈরি করেছি। এই বৈশিষ্ট্যের শাখায় প্রতিশ্রুতিবদ্ধ হওয়ার আগে এখন আমি আমার কোডটি পরিষ্কার করতে চাই। সুতরাং আমি একটি অস্থায়ী শাখায় স্যুইচ করি, সমস্ত পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ। ফিচার শাখায় ফিরে আসুন, cherry-pickযে প্রতিশ্রুতিবদ্ধ। এটি করার আরও ভাল উপায় আছে?
তেজস কালে

6

আপনার কমিটগুলি চেরি-বাছাই করতে সক্ষম হওয়া উচিত (সাথে -nসাথে প্রতিশ্রুতি এড়াতে)।


-ন কাজ করেনি। এটি বলে যে চেরি-পিক কমিট দেওয়া নো-এম বিকল্পটি ব্যর্থ হয়েছে।
আলেজান্দ্রো সানজ

5

আমি 100% নিশ্চিত নই যে আমি এটি পরিষ্কারভাবে বুঝতে পেরেছি, তবে আমার ক্ষেত্রে আমি কেবল শাখাগুলির মধ্যে পৃথক প্যাচ তৈরি করেছি এবং তারপরে এই শাখাকে বি শাখায় প্রয়োগ করেছি।

শাখার ভিতরে:

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

আমি নিশ্চিত নই যে আমি আপনার প্রয়োজনীয়তাগুলি বুঝতে পেরেছি।

আপনি একটি মার্জ চালাতে পারেন, তারপরে কল করতে পারেন git reset HEAD~1


নিম্নলিখিত ক্রমটি এর উপরে masterএবং branchAউপরে প্রতিটি প্রতিশ্রুতি পুনরায় খেলতে হবে branchB। যে কমিটগুলি ইতিমধ্যে প্রয়োগ করা হয়েছিল branchBসেগুলি এড়ানো হবে।

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

এটি গিটের স্টেজিং এরিয়ায় ফাইল যুক্ত করে যা আমি চাই না। এছাড়াও, যখন কেবল সমস্ত শাখা মাস্টার শাখায় একই প্রতিশ্রুতিবদ্ধ থেকে ব্রাঞ্চ করা হয় তখন এটি কেবল ভাল কাজ করে। অন্যথায় রেঞ্জের মাস্টারে না পার্থক্য..ব্র্যাংএ চালু করা হয়েছে।
Björn Lindqvist

@ বিজার্ন লিন্ডকভিস্ট: --softআপনি যদি মঞ্চস্থ অঞ্চলে পরিবর্তন চান না তবে বিকল্পটি সরিয়ে ফেলুন । কীভাবে আপনার শাখাগুলি সেট আপ করা হয় তার একটি গ্রাফ আঁকতে পারেন?
লেজেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.