Git ওয়ার্কফ্লো এবং বিযুক্ত বনাম প্রশ্ন মার্জ




version-control git-merge (7)

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

আপনার অংশীদারের বা আপনার প্রস্তাবিত ওয়ার্কফ্লোগুলিতেও আপনি এমন দ্বন্দ্বের মুখোমুখি হতে পারছেন না যা বোঝা যায় নি। এমনকি যদি আপনি যদি প্রস্তাবিত ওয়ার্কফ্লোগুলি অনুসরণ করেন তবে রেজোলিউশনের পরে একটি 'বাধ্যতামূলক' ধাক্কা প্রয়োজন হবে না। এটি প্রস্তাব করে যে আপনি আসলে যে শাখাটিকে ধাক্কা দিয়েছিলেন সেটি আপনি একত্রিত করেননি, তবে দূরবর্তী টিপের বংশধর নয় এমন শাখাটি ধাক্কা দিতে হয়েছে।

আমি কি ঘটেছে সাবধানে তাকান প্রয়োজন মনে হয়। অন্য কেউ কি (ইচ্ছাকৃতভাবে বা না) স্থানীয় শাখার সৃষ্টি এবং সেই বিন্দুতে যেখানে আপনি এটি স্থানীয় শাখাতে আবার মার্জ করার চেষ্টা করেছেন সেটির মধ্যে রিমোট মাস্টার শাখাটি পুনঃস্থাপন করতে পারে?

অনেক অন্যান্য সংস্করণ নিয়ন্ত্রণ সিস্টেমের তুলনায় আমি দেখেছি যে গিট ব্যবহার করে সরঞ্জামটি কম যুদ্ধে জড়িত এবং আপনার উত্স স্ট্রিমগুলিতে মৌলিক সমস্যাগুলি নিয়ে কাজ করতে আপনাকে অনুমতি দেয়। জিট ম্যাজিক সম্পাদন করে না, তাই দ্বন্দ্বজনক পরিবর্তন দ্বন্দ্ব সৃষ্টি করে, তবে এটি লিখিত জিনিসটির ট্র্যাকিংয়ের দ্বারা লেখার কাজটিকে সহজ করে তুলতে হবে।

আমি অন্য একটি বিকাশকারীর সাথে একটি প্রকল্পে কয়েক মাস ধরে গিট ব্যবহার করছি। আমি SVN সাথে কয়েক বছরের অভিজ্ঞতা পেয়েছি, তাই আমার মনে হয় আমি সম্পর্কের জন্য প্রচুর পরিমাণে লাগেজ।

আমি শুনেছি যে গিট শাখা এবং মার্জিংয়ের জন্য চমৎকার, এবং এ পর্যন্ত, আমি এটি দেখতে পাচ্ছি না। নিশ্চিত, শাখাটি মৃত সহজ, কিন্তু যখন আমি একত্রিত হওয়ার চেষ্টা করি, সবকিছুই জাহান্নামে যায়। এখন, আমি এসভিএন থেকে এটি ব্যবহার করছি, কিন্তু মনে হচ্ছে আমি অন্যের জন্য একটি উপ-সমাবস্থা সংস্করণ বানিজ্য করেছি।

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

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature

মূলত, একটি বৈশিষ্ট্য শাখা তৈরি করুন, সর্বদা মাস্টার থেকে শাখা থেকে রিবেস, এবং শাখা থেকে মাস্টার ফিরে মার্জ। নোট গুরুত্বপূর্ণ যে শাখা সর্বদা স্থানীয় থাকে।

এখানে আমি যে ওয়ার্কফ্লো দিয়ে শুরু করেছি

clone remote repository
create my_new_feature branch on remote repository
git checkout -b --track my_new_feature origin/my_new_feature
..work, commit, push to origin/my_new_feature
git merge master (to get some changes that my partner added)
..work, commit, push to origin/my_new_feature
git merge master
..finish my_new_feature, push to origin/my_new_feature
git checkout master
git merge my_new_feature
delete remote branch
delete local branch

দুটি অপরিহার্য পার্থক্য রয়েছে (আমি মনে করি): আমি রিবাজ করার পরিবর্তে মার্জ ব্যবহার করি এবং রিমোট রিপোজিটরিতে আমার বৈশিষ্ট্য শাখাটি (এবং আমার বৈশিষ্ট্য শাখাটি সম্পাদন করে) ধাক্কা দেয়।

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

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

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

এই মত কিছু জন্য "সঠিক" ওয়ার্কফ্লো কি? Git branching এবং সুপার সহজ মার্জ করা অনুমিত হয়, এবং আমি এটা দেখতে না।

আপডেট 2011-04-15

এটি একটি খুব জনপ্রিয় প্রশ্ন বলে মনে হচ্ছে, তাই আমি প্রথমে জিজ্ঞেস করলাম যে আমি আমার দুই বছরের অভিজ্ঞতার সাথে আপডেট করব।

এটি সক্রিয় করে যে মূল কার্যপ্রবাহটি আমাদের ক্ষেত্রে কমপক্ষে সঠিক। অন্য কথায়, আমরা এটা করি এবং এটি কাজ করে:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge my_new_feature

আসলে, আমাদের ওয়ার্কফ্লোটি একটু ভিন্ন, আমরা কাঁচা ম্লগের পরিবর্তে স্কোয়াশ মার্জ করতে ঝোঁক। ( দ্রষ্টব্য: এটি বিতর্কিত, নীচে দেখুন। ) এটি আমাদের সমগ্র বৈশিষ্ট্য শাখাকে মাস্টারের একক কমিটিতে পরিণত করতে দেয়। তারপর আমরা আমাদের বৈশিষ্ট্য শাখা মুছে দিন। এই আমাদের শাখার উপর একটি সামান্য নোংরা এমনকি যদি, তারা যুক্তিযুক্তভাবে মাস্টার উপর আমাদের commits গঠন করতে পারবেন। সুতরাং, আমরা যা করি তা হল:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge --squash my_new_feature
git commit -m "added my_new_feature"
git branch -D my_new_feature

স্কোয়াশ মার্জ বিতর্ক - অনেক মন্তব্যকারীর হিসাবে উল্লেখ করা হয়েছে, স্কোয়াশ মার্জ আপনার বৈশিষ্ট্য শাখায় সমস্ত ইতিহাস ফেলে দেবে। নাম হিসাবে বোঝা যায়, এটি একক এক মধ্যে সব commits নিচে squashes। ছোট বৈশিষ্ট্যগুলির জন্য, এটি একটি একক প্যাকেজে এটি সংকুচিত হিসাবে এটি ইন্দ্রিয় তোলে। বড় বৈশিষ্ট্যগুলির জন্য, এটি সম্ভবত একটি দুর্দান্ত ধারণা নয়, বিশেষ করে যদি আপনার ব্যক্তি ইতিমধ্যেই পারমাণবিক হয়। এটা সত্যিই ব্যক্তিগত পছন্দ নিচে আসে।

Github এবং Bitbucket (অন্যদের?) অনুরোধগুলি টেনে আনুন - যদি আপনি বিস্মিত হোন যে কীভাবে মার্জ / রিবেসগুলি সম্পূর্ণ অনুরোধগুলির সাথে সম্পর্কিত হয় তবে আমি আপনাকে উপরের মাস্টারের সাথে মেশানোর জন্য প্রস্তুত না হওয়া পর্যন্ত উপরের সমস্ত পদক্ষেপগুলি অনুসরণ করার সুপারিশ করছি। পরিবর্তে গিট সঙ্গে মার্জ করার পরিবর্তে, আপনি শুধু পিআর গ্রহণ। মনে রাখবেন যে এটি স্কোয়াশ মার্জ করবে না (অন্তত ডিফল্টভাবে নয়), তবে নন-স্কোয়াশ, নন-ফাস্ট-ফরোয়ার্ড পুল অনুরোধ সম্প্রদায় (যতদূর আমি জানি) তে গৃহীত ম্যালেজ কনভেনশন। বিশেষত, এটি ভালো কাজ করে:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git push # May need to force push
...submit PR, wait for a review, make any changes requested for the PR
git rebase master
git push # Will probably need to force push (-f), due to previous rebases from master
...accept the PR, most likely also deleting the feature branch in the process
git checkout master
git branch -d my_new_feature
git remote prune origin

আমি গিটকে ভালবাসতে এসেছি এবং কখনো এসভিএন যেতে চাই না। আপনি যদি সংগ্রাম করছেন, তবে এটির সাথে থাকুন এবং অবশেষে আপনি সুড়ঙ্গের শেষে আলোটি দেখতে পাবেন।


টি এল; ডিআর

একটি গিট রিবেস ওয়ার্কফ্লো আপনাকে দ্বন্দ্বের সমাধান বা যারা SVN ওয়ার্কফ্লোে ব্যবহার করা হয় তাদের থেকে সুরক্ষা দেয় না, যেমন গিট দুর্যোগ এড়িয়ে যাওয়াতে প্রস্তাবিত : A Gory Story । এটি শুধুমাত্র তাদের জন্য দ্বন্দ্ব রেজল্যুশন আরো ক্লান্তিকর করে তোলে এবং খারাপ দ্বন্দ্ব রেজল্যুশন থেকে পুনরুদ্ধার করা কঠিন করে তোলে। পরিবর্তে, diff3 ব্যবহার করুন যাতে এটি প্রথম স্থানে এত কঠিন না।

বিবাদ রেজল্যুশন জন্য ভাল কার্যপ্রবাহ ভাল নয়!

আমি ইতিহাস পরিষ্কার করার জন্য খুব প্রো-রিবেস। যাইহোক, যদি আমি কখনও কোনো দ্বন্দ্ব আঘাত করি তবে আমি অবিলম্বে রিবেসটি বন্ধ করে দেই এবং পরিবর্তে একটি মার্জ করি! এটা সত্যিই আমাকে হত্যা করে যে মানুষ একটি রিবেস ওয়ার্কফ্লোকে দ্বন্দ্বের রেজোলিউশনের জন্য একটি মার্জ ওয়ার্কফ্লোের একটি ভাল বিকল্প হিসাবে প্রস্তাব করছে (যা এই প্রশ্নটি ঠিক কি ছিল)।

এটি একটি মার্জ সময় "সব জাহান্নাম" যায়, এটি একটি রিবেস সময় "সব জাহান্নাম" যেতে হবে, এবং সম্ভবত আরো অনেক নরক! কারণটা এখানে:

কারণ # 1: প্রতিটি কমিটির পরিবর্তে একবার একবার সংঘর্ষ সমাধান করুন

যখন আপনি একত্রিত হওয়ার পরিবর্তে রিবেস করবেন, তখন একই দ্বন্দ্বের জন্য আপনাকে পুনরায় বিবাদ করার জন্য যতবার আপনি বিরোধিতা করেছেন ততক্ষন বিরোধ সংঘটিত করতে হবে!

বাস্তব দৃশ্যকল্প

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

মাস্টারের সাথে আমার শাখাটি আবার মার্জ করার সময় আমার দুটি বিকল্প রয়েছে:

জিট মার্জ: আমি একটি দ্বন্দ্ব পেতে। আমি মাস্টারের জন্য যে পরিবর্তনটি করেছি তা দেখেছি এবং আমার শাখার (ফাইনাল প্রোডাক্ট) সঙ্গে এটি একত্রিত করেছি। সম্পন্ন.

জিট রিবেস: আমি আমার প্রথম কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার দ্বিতীয় কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার তৃতীয় কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার চতুর্থ কমিটির সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার পঞ্চম প্রতিশ্রুতি সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার ষষ্ঠ প্রতিশ্রুতি সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার সপ্তম কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার আটটি কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার নবম কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার দশম কমিট সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার eleventh কমিটির সাথে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার দ্বাদশ প্রতিশ্রুতি সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার তেরো প্রতিশ্রুতি সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার চতুর্দশ কমিটির সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত। আমি আমার পনেরো প্রতিশ্রুতি সঙ্গে একটি দ্বন্দ্ব পেতে। আমি দ্বন্দ্ব সমাধান এবং রিবেস অবিরত।

এই আপনার পছন্দসই কর্মপ্রবাহ যদি আপনি আমাকে মজা করা হয়েছে। এটি যা লাগে তা হ'ল হোয়াইটস্পেস ফিক্স যা মাস্টারকে করা একটি পরিবর্তনের সাথে দ্বন্দ্ব করে এবং প্রতিটি কমিটি দ্বন্দ্ব করবে এবং সমাধান করা আবশ্যক। এবং এটি শুধুমাত্র একটি হোয়াইটস্পেস দ্বন্দ্ব সঙ্গে একটি সহজ দৃশ্যকল্প। স্বর্গে আপনি ফাইল জুড়ে প্রধান কোড পরিবর্তন জড়িত একটি বাস্তব দ্বন্দ্ব আছে এবং একাধিক বার সমাধান করতে হবে না নিষিদ্ধ।

সমস্ত অতিরিক্ত দ্বন্দ্বের রেজোলিউশনটি আপনাকে করতে হবে, এটি কেবলমাত্র সম্ভাবনাটিকে বাড়িয়ে তুলবে যে আপনি ভুল করবেন । কিন্তু ভুল আপনি ভুল করতে পারেন, কারণ গিট সূক্ষ্ম হয়, অধিকার? অবশ্যই বাদে ...

কারণ # 2: রিবেস সঙ্গে, কোন পূর্বাবস্থায় ফেরার নেই!

আমি মনে করি আমরা সবাই একমত হতে পারি যে দ্বন্দ্বের সমাধান কঠিন হতে পারে, এবং কিছু লোক এতে খুব খারাপ। এটি ভুলের জন্য খুব প্রবণ হতে পারে, এটি এত বড় কেন যে গিটটি পূর্বাবস্থায় ফেরানো সহজ করে তোলে!

যখন আপনি কোনও শাখা মার্জ করেন , গিট একটি মার্জ কমিট তৈরি করে যা দ্বন্দ্ব সমাধানটি খারাপ হয়ে গেলে বাতিল বা সংশোধন করা যেতে পারে। এমনকি আপনি যদি জনসাধারণ / আধিকারিক রেপোতে খারাপ মার্জ কমিটটি ইতিমধ্যে ধাক্কা দিলেও, আপনি মার্জ দ্বারা উপস্থাপিত পরিবর্তন পূর্বাবস্থায় git revert আনতে এবং নতুন মার্জ কমিটিতে সঠিকভাবে মার্জ পুনরায় করতে ব্যবহার করতে পারেন।

যখন আপনি কোনও শাখাটি পুনঃবিবেচনা করেন , সংঘাতের সমাধানটি ভুল হওয়ার সম্ভাব্য ইভেন্টে, আপনি মাতাল হন। প্রতিটি কমিটিতে এখন খারাপ মার্জ রয়েছে এবং আপনি কেবল রিবেজটি পুনরায় করতে পারবেন না *। সেরা, আপনাকে ফিরে যেতে হবে এবং প্রভাবিত প্রতিটি প্রতিটি সংশোধন করতে হবে। মজা না.

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

* যদি আপনি গিটের অভ্যন্তরীণ লগগুলি থেকে পুরানো রেফারেন্সগুলি খনন করতে পারেন, বা আপনি তৃতীয় তৃতীয় শাখা তৈরি করেন যা রিবাজ করার আগে শেষ কমিটির দিকে নির্দেশ করে তবে এটি পুনঃবিবেচনা করা সম্ভব।

দ্বন্দ্ব রেজল্যুশন আউট জাহান্নাম নিন: diff3 ব্যবহার করুন

উদাহরণস্বরূপ এই দ্বন্দ্ব নিন:

<<<<<<< HEAD
TextMessage.send(:include_timestamp => true)
=======
EmailMessage.send(:include_timestamp => false)
>>>>>>> feature-branch

দ্বন্দ্বের দিকে তাকিয়ে, প্রতিটি শাখার পরিবর্তন বা তার উদ্দেশ্য কী ছিল তা জানা অসম্ভব। আমার মতামতের সবচেয়ে বড় কারণ হলো দ্বন্দ্বের সমাধান বিভ্রান্তিকর এবং কঠিন।

রেসকিউ থেকে diff3!

git config --global merge.conflictstyle diff3

আপনি diff3 ব্যবহার করার সময়, প্রতিটি নতুন দ্বন্দ্ব একটি তৃতীয় অধ্যায় থাকবে, একত্রিত সাধারণ পূর্বপুরুষ।

<<<<<<< HEAD
TextMessage.send(:include_timestamp => true)
||||||| merged common ancestor
EmailMessage.send(:include_timestamp => true)
=======
EmailMessage.send(:include_timestamp => false)
>>>>>>> feature-branch

প্রথম বিনিময় সাধারণ পূর্বপুরুষ পরীক্ষা। তারপর প্রতিটি শাখা এর উদ্দেশ্য নির্ধারণ প্রতিটি পার্শ্ব তুলনা করুন। আপনি HEAD ইমেলমেসেজকে টেক্সটমেসেজে পরিবর্তন করতে পারেন তা দেখতে পারেন। একই প্যারামিটারগুলি পাস করে টেক্সট মেসেজে ব্যবহৃত ক্লাসটি পরিবর্তন করার উদ্দেশ্য। আপনি দেখতে পারেন যে বৈশিষ্ট্য-শাখাটির উদ্দেশ্যটি সত্যের পরিবর্তে মিথ্যাটি পাস করা: include_timestamp বিকল্পের জন্য। এই পরিবর্তনগুলি একত্রিত করতে, উভয়ের উদ্দেশ্যকে একত্রিত করুন:

TextMessage.send(:include_timestamp => false)

সাধারণভাবে:

  1. প্রতিটি শাখা সঙ্গে সাধারণ পূর্বপুরুষ তুলনা করুন, এবং কোন শাখা সহজতম পরিবর্তন আছে তা নির্ধারণ করুন
  2. কোডটির অন্যান্য শাখার সংস্করণে যে সাধারণ পরিবর্তনটি প্রয়োগ করুন, যাতে এতে সহজতর এবং আরও জটিল পরিবর্তন উভয়ই থাকে
  3. আপনি একসাথে পরিবর্তনের মধ্যে একত্রিত হয়েছেন এমন একটির পরিবর্তে সংঘাত কোডের সমস্ত বিভাগগুলি সরান

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

অবশেষে, কিছু দ্বন্দ্ব diff3 সঙ্গে এমনকি বোঝার ভয়ানক। এটি বিশেষ করে যখন ডিফের সাধারণ লাইন খুঁজে পায় যা semantically সাধারণ নয় (উদাহরণস্বরূপ। উভয় শাখার একই স্থানে একটি ফাঁকা লাইন থাকে!)। উদাহরণস্বরূপ, একটি শাখা একটি শ্রেণির শরীরের ইন্ডেন্টেশন পরিবর্তন করে বা অনুরূপ পদ্ধতিগুলিকে পুনর্বিন্যাস করে। এই ক্ষেত্রে, একটি ভাল রেজোলিউশন কৌশল মার্জের উভয় দিক থেকে পরিবর্তনটি পরীক্ষা করতে এবং অন্য ফাইলের সাথে আলাদাভাবে প্রয়োগ করতে পারে।

চলুন দেখি কিভাবে আমরা কোন দৃশ্যকল্পতে একটি দ্বন্দ্ব সমাধান করতে পারি যেখানে origin/feature1 যেখানে lib/message.rb দ্বন্দ্ব।

  1. আমাদের বর্তমানে চেক আউট হওয়া শাখা ( HEAD , অথবা --ours ) বা আমরা যে মার্কেটিং ( origin/feature1 , বা --theirs ) origin/feature1 করছি তা প্রয়োগ করার জন্য একটি সহজ পরিবর্তন কিনা তা নির্ধারণ করুন। ট্রিপল বিন্দু দিয়ে বিভাজন ব্যবহার করা হচ্ছে ( git diff a...b ) তার শেষ বিচ্ছেদ থেকে b যা ঘটেছে তা দেখায়, বা অন্য কথায়, খ এর একটি পূর্ব পূর্বপুরুষ এবং খ দিয়ে b ব্যবহার করে।

    git diff HEAD...origin/feature1 -- lib/message.rb # show the change in feature1
    git diff origin/feature1...HEAD -- lib/message.rb # show the change in our branch
    
  2. ফাইল এর আরো জটিল সংস্করণ পরীক্ষা করে দেখুন। এটি সমস্ত দ্বন্দ্ব চিহ্নিতকারী মুছে ফেলবে এবং আপনি যে পাশটি নির্বাচন করবেন সেটি ব্যবহার করবে।

    git checkout --ours -- lib/message.rb   # if our branch's change is more complicated
    git checkout --theirs -- lib/message.rb # if origin/feature1's change is more complicated
    
  3. জটিল পরিবর্তন চেক আউট সঙ্গে, সহজ পরিবর্তন diff আপ করুন (পদক্ষেপ 1 দেখুন)। এই diff থেকে দ্বন্দ্বপূর্ণ ফাইল প্রতিটি পরিবর্তন প্রয়োগ করুন।


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

একটি বিভাজক একটি বিভাজক চেয়ে ভাল কেন কারণ:

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

আমি নিশ্চিত যে সেই ক্ষেত্রে সঠিক কার্যপ্রবাহ (ফাইলগুলির সাধারণ সেটের উপর বিবর্তন) প্রথমটি পুনরায় বিযুক্ত হয় , তারপরে মার্জ করুন

যাইহোক, এর মানে হল যে, আপনি যদি আপনার স্থানীয় শাখাকে (ব্যাকআপ কারণে) ধাক্কা দেন তবে সেই শাখাকে অন্য কারো দ্বারা টেনে আনতে হবে না (বা কমপক্ষে ব্যবহার করা যাবে) (যেহেতু কমিটির ইতিহাস ক্রমাগত রিবেস দ্বারা পুনঃলিখন করা হবে)।

সেই বিষয়ে ( barraponto তারপর ওয়ার্কফ্লো মার্জ করুন), barraponto মন্তব্য করেছেন দুটি আকর্ষণীয় পোস্ট, উভয় randyfay.com থেকে:

এই কৌশলটি ব্যবহার করে, আপনার কাজ সর্বদা সর্বজনীন শাখার উপরের দিকে চলে যায় যেমন একটি প্যাচ যা বর্তমান HEAD সাথে আপ-টু-ডেট।

(একটি অনুরূপ কৌশল বাজারের জন্য বিদ্যমান )


Git সঙ্গে কোন "সঠিক" ওয়ার্কফ্লো আছে। আপনার নৌকা floats যাই হোক না কেন ব্যবহার করুন। তবে, যদি শাখাগুলি মার্জ করার সময় আপনি ক্রমাগত দ্বন্দ্ব পান তবে আপনার সহযোগীগণের সাথে আপনার প্রচেষ্টাকে আরও ভালভাবে সমন্বয় করা উচিত? আপনি দুটি একই ফাইল সম্পাদনা রাখা মত শব্দ। এছাড়াও, হোয়াইটস্পেস এবং সাবভার্সন কীওয়ার্ডগুলির জন্য দেখুন (অর্থাত্ "$ Id $" এবং অন্যদের)।


আপনার ব্যাখ্যাটি পড়ার পরে আমার একটি প্রশ্ন আছে: এটি এমন হতে পারে যে আপনি কখনই এটি করেননি

git checkout master
git pull origin
git checkout my_new_feature

আপনার বৈশিষ্ট্য শাখায় 'গিট রিবেস / মার্জ মাস্টার' করার আগে?

কারণ আপনার মাস্টার শাখা আপনার বন্ধুর সংগ্রহস্থল থেকে স্বয়ংক্রিয়ভাবে আপডেট হবে না। আপনি git pull origin সঙ্গে যে করতে হবে। আপনি হয়তো সর্বদা একটি পরিবর্তনশীল স্থানীয় মাস্টার শাখা থেকে রিবেস হবে? এবং তারপর ধাক্কা সময় আসা, আপনি একটি রিপোজিটরি যা pushing হয় (স্থানীয়) আপনি দেখেছি না এবং এইভাবে ধাক্কা ব্যর্থ হয়।


আমার কার্যপ্রবাহে, আমি যতটা সম্ভব রিবাজ করি (এবং আমি প্রায়ই এটি করার চেষ্টা করি। বিচ্ছিন্নতাগুলি জমা না করে তীব্র পরিমাণে শাখাগুলির মধ্যে সংঘর্ষের পরিমাণ এবং তীব্রতা হ্রাস করে)।

যাইহোক, এমনকি বেশিরভাগ রিবেস-ভিত্তিক কর্মপ্রবাহেও, একত্রিত হওয়ার স্থান রয়েছে।

মনে রাখবেন যে মার্জ আসলে দুটি পিতামাতার একটি নোড তৈরি করে। এখন নিচের পরিস্থিতি বিবেচনা করুন: আমার দুটি স্বতন্ত্র বৈশিষ্ট্য রয়েছে A এবং B, এবং এখন বৈশিষ্ট্য শাখা C তে স্টাফ বিকাশ করতে চায় যা A এবং B উভয় ক্ষেত্রেই নির্ভর করে, যখন A এবং B পর্যালোচনা করা হচ্ছে।

আমি তারপর কি, নিম্নলিখিত হয়:

  1. তৈরি করুন (এবং চেকআউট) এ শীর্ষে শাখা সি।
  2. বি সঙ্গে এটি মার্জ করুন

এখন শাখা সি এ এবং বি উভয় থেকে পরিবর্তনগুলি অন্তর্ভুক্ত করে এবং আমি এটির উপর উন্নয়ন চালিয়ে যেতে পারি। যদি আমি A তে কোনও পরিবর্তন করি তবে আমি নিম্নোক্ত পদ্ধতিতে শাখার গ্রাফ পুনর্গঠন করতে পারি:

  1. নতুন শীর্ষে শাখা টি তৈরি করুন
  2. বি সঙ্গে বি মার্জ
  3. টি সম্মুখের সি সি বি
  4. শাখা টি মুছে দিন

এইভাবে আমি আসলেই শাখার ইচ্ছাকৃত গ্রাফগুলি বজায় রাখতে পারি, তবে উপরে বর্ণিত পরিস্থিতিটির চেয়ে আরও জটিল কিছু করা ইতিমধ্যেই খুব জটিল, কারণ পিতামাতার পরিবর্তন করার সময় রিবাজ করার জন্য স্বয়ংক্রিয় সরঞ্জাম নেই।


গিট ধাক্কা মূল ব্যবহার করবেন না - সর্বাধিক কোনও সীমাবদ্ধতার অধীনে।

আপনি যদি এটি নিশ্চিত করতে চান তবে এটি জিজ্ঞাসা করে না এবং আপনি আরও ভালভাবে নিশ্চিত হবেন কারণ এটি আপনার স্থানীয় বক্সগুলিতে থাকা আপনার সমস্ত দূরবর্তী শাখা মুছে ফেলবে।

http://twitter.com/dysinger/status/1273652486






git-rebase