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


970

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

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

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

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

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

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

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

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

এর মতো কোনও কিছুর জন্য "সঠিক" ওয়ার্কফ্লো কী? গিটের শাখা প্রশাখি করা এবং একত্রীকরণকে সহজ-সরল করার কথা রয়েছে এবং আমি এটি কেবল দেখছি না।

আপডেট 2011-04-15

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

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

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

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

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

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

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

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

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


31
দুর্ভাগ্যক্রমে, নতুন প্রাগমাস্টিক প্রোগ্রামিং বইটি বেশিরভাগই এসভিএন-তে চিন্তা করার সময় গিট ব্যবহার করা থেকে রচিত এবং এই ক্ষেত্রে এটি আপনাকে বিভ্রান্ত করেছে। গিট-এ, রিবেসে জিনিসগুলি সহজ হতে পারে simple আপনার অভিজ্ঞতা আপনাকে বলতে পারে যে আপনার ওয়ার্কফ্লো গিটে কাজ করে না, এমন নয় যে গিট কাজ করে না।
পল

18
আমি এই ক্ষেত্রে স্কোয়াশ একত্রীকরণের পরামর্শ দেব না, কারণ এটি কীভাবে একীভূত হয় (কোনও এসএনএন এর মতো, তবে এখানে কোনও মার্জিনফো নেই) সম্পর্কিত কোনও তথ্য সংরক্ষণ করে না।
মারিয়াস কে

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

6
আপনি বৈশিষ্ট্য শেষ করার পরে, আপনি নতুন_মূর্তিটি মাস্টারে মার্জ করার আগে একবারে কি পুনরায় ব্যবহার করবেন না?
সফ্টনারন

17
আপনার কর্মপ্রবাহটি মুছে ফেলা শাখা থেকে সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাস হারিয়ে
ফেলেছে

উত্তর:


371

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

একীভূতকরণের চেয়ে পুনরায় শোধ করার কারণটি হ'ল:

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

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

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


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

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

(একই ধরণের কৌশল বাজারের জন্য বিদ্যমান )



2
randyfay.com/node/91 এবং randyfay.com/node/89 দুর্দান্ত পঠিত। এই নিবন্ধগুলি আমাকে বুঝতে সক্ষম করেছে যে আমার কর্মপ্রবাহের সাথে কী জড়িত ছিল এবং কী আদর্শ আদর্শ কর্মপ্রবাহ হবে।
ক্যাপি ইথেরিল

কেবল এটিকে সোজা করার জন্য, মাস্টার ব্রাঞ্চ থেকে আপনার লোকালটিতে রিভিজিং করা মূলত আপনার ইতিহাসের কোনও ইতিহাস আপডেট করতে পারে যে কোনও মাস্টার সংযুক্তির পরে মাস্টার সম্পর্কে জ্ঞান থাকতে পারে?
হেল্লাতান

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

385

টি এল; ডিআর

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


সংঘাতের সমাধানের জন্য রিবেস ওয়ার্কফ্লো ভাল নয়!

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

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

কারণ # 1: প্রতিশ্রুতিবদ্ধতার জন্য একবারের পরিবর্তে একবার বিরোধগুলি সমাধান করুন

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

বাস্তব দৃশ্য

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

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

গিট একীভূত: আমি একটি দ্বন্দ্ব পেতে। আমি তাদের যে পরিবর্তনটি দেখতে পেলাম তা তারা আমার শাখার সাথে (চূড়ান্ত পণ্য) আয়ত্ত করতে এবং এতে একীভূত করে। সম্পন্ন.

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

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

আপনার অতিরিক্ত অতিরিক্ত দ্বন্দ্বের সমাধানের দরকার হ'ল এটি আপনার ভুল করার সম্ভাবনা কেবল বাড়িয়ে তোলে । ভুলগুলি গিটের মধ্যে থেকে ঠিক আছে যেহেতু আপনি পূর্বাবস্থায় ফিরে আসতে পারেন, তাই না? অবশ্যই ...

কারণ # 2: পুনর্বাসনের সাথে, কোনও পূর্বাবস্থা নেই!

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

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

আপনি যখন কোনও শাখাটিকে রিবেস করেন , দ্বন্দ্বের সমাধানটি ভুলভাবে সংঘটিত হওয়ার সম্ভাব্য ইভেন্টে আপনার ক্ষতি হয়। প্রতিটি প্রতিশ্রুতিতে এখন খারাপ একত্রীকরণ থাকে এবং আপনি কেবল পুনর্বাসনাটি আবার করতে পারবেন না। সর্বোপরি, আপনাকে ফিরে যেতে হবে এবং আক্রান্ত প্রতিটি কমিটির সংশোধন করতে হবে। মজা না.

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

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

দ্বন্দ্বের সমাধান থেকে বেরিয়ে আসুন: ডিফার 3 ব্যবহার করুন

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

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

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

বিচ্ছিন্নভাবে উদ্ধার!

git config --global merge.conflictstyle diff3

আপনি যখন ডিফফ 3টি ব্যবহার করেন, তখন প্রতিটি নতুন বিরোধের তৃতীয় বিভাগ থাকে, একত্রীকৃত সাধারণ পূর্বপুরুষ।

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

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

TextMessage.send(:include_timestamp => false)

সাধারণভাবে:

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

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

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

আসুন আমরা কীভাবে কোনও সংঘাতের সমাধান করতে পারি origin/feature1যেখানে lib/message.rbসংঘাতগুলি যেখানে মার্জ হয়ে যায় সেখানে ।

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

    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. জটিল পরিবর্তনটি যাচাই করা হয়ে গেলে, সহজ পরিবর্তনের ভিন্নতাটি টানুন (দেখুন পদক্ষেপ 1)। এই পৃথক থেকে বিরোধী ফাইলটিতে প্রতিটি পরিবর্তন প্রয়োগ করুন।


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

8
আমার মনে হচ্ছে আমি # 1-এ কারণটির দিকে সম্বোধন করেছি। যদি পৃথক প্রতিশ্রুতি যুক্তিযুক্তভাবে সুসংগত না হয় তবে আরও যুক্তিযুক্তভাবে সামঞ্জস্যপূর্ণ শাখাটি মার্জ করার কারণ, যাতে আপনি প্রকৃতপক্ষে দ্বন্দ্বটি উপলব্ধি করতে পারেন। কমিট 1 যদি বগি হয় এবং 2 টি কমিট করে ঠিক করে দেয় তবে কমিট 1 মার্জ করা বিভ্রান্তিকর হবে। এমন বৈধ কারণ রয়েছে যেগুলি আপনি উপরে বর্ণিত মত একটি সারিতে 15 টি দ্বন্দ্ব পেতে পারেন। এছাড়াও আপনার রিবেসটি খারাপ না হওয়ার পক্ষে যুক্তি কিছুটা ভিত্তিহীন। রিবাজ আসল ভাল কমিটগুলিতে খারাপ মার্জগুলিকে মিশ্রিত করে এবং আপনাকে আবার চেষ্টা করার জন্য ভাল প্রতিশ্রুতিগুলি ছেড়ে দেয় না। মার্জ করে।
এডওয়ার্ড অ্যান্ডারসন

6
আমি আপনার সাথে পুরোপুরি একমত দুর্দান্ত পোস্ট; এটি কিছু জিনিস পরিষ্কার করে দেয়। আমি ভাবছি যদি এখানে তবে রিয়ারের কোনও সহায়তা হবে। এছাড়াও, ডিফফ 3 ব্যবহারের পরামর্শের জন্য ধন্যবাদ, আমি অবশ্যই এখনই এটি স্যুইচ করতে যাচ্ছি।
ডেরিক

45
আমাকে একাই ডিফফ 3 সম্পর্কে বলার জন্য +1 - সাধারণ পূর্বপুরুষের বক্তব্য আমাকে কী না বলে আমাকে দায়বদ্ধ না করে তাকে দোষ দেওয়া কতবার অবিশ্বাস্য বিরোধের দিকে তাকাচ্ছিল। আপনাকে অনেক ধন্যবাদ.
জন

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

32

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

তবে, এমনকি বেশিরভাগ রিবাস-ভিত্তিক ওয়ার্কফ্লোতেও একত্রীকরণের জায়গা রয়েছে।

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

আমি তখন যা করি তা হ'ল:

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

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

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

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


1
আপনি কেবল প্রত্যাখ্যানের মাধ্যমে এটি অর্জন করতে পারেন। মার্জটি এখানে আসলে প্রয়োজনীয় নয় (আপনি যদি কমিটগুলি নকল করতে না চান তবে - তবে আমি যুক্তি হিসাবে খুব কমই দেখতে পাচ্ছি)।
বিতর্কিত

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

আমি প্রথম অনুচ্ছেদের সাথে 100% একমত (@ এডওয়ার্ডের উত্তরটি যেখানে কাজ করে সেখানে এটি কাজ করে, তবে আমি আপনার পরামর্শ মতো বিশ্বের সমস্ত প্রকল্পের কাজ করব)। উত্তরটির উত্তরটি খানিকটা সুদূরপ্রসারী বলে মনে হচ্ছে যে A এবং B অগ্রগতিতে C এর সাথে কাজ করা ইতিমধ্যে এক ধরণের ঝুঁকিপূর্ণ (কমপক্ষে এটি আসলে ক এবং খ এর উপর নির্ভর করে), এমনকি শেষ পর্যন্ত আপনি সংযুক্তিগুলি সম্ভবত রাখে না (সি সর্বশেষ ও সর্বোত্তমের উপরে পুনর্বাসিত হবে)।
আলয়েস মাহডাল

22

গিট পুশ অরিজিন ব্যবহার করবেন না - প্রায় যে কোনও চক্রের আওতায় ror

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

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


6
বা এমন ফলাফলগুলি করবেন না যা আপনি নিশ্চিত হন না যে ফলাফলটি কী হবে? আমি প্রশাসনের জন্য ব্যবহৃত একটি মেশিনের Instructions to this machine may lead to unintended consequences, loss of work/data, or even death (at the hands of the sysad). Remember that you are solely responsible for the consequences of your actions এমওটিডি ছিল।
ধনী

আপনার যদি মিররযুক্ত রেপো থাকে তবে এটি ব্যবহার করুন (যদিও আমার ক্ষেত্রে এটি এখন পোস্ট-রিসিভ হুকের উত্স
রেপোতে

14

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

git checkout master
git pull origin
git checkout my_new_feature

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

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


13

আপনার পরিস্থিতিতে আমি আপনার সঙ্গী সঠিক বলে মনে করি। রিবাইজিংয়ের ক্ষেত্রে দুর্দান্ত যা হ'ল বহিরাগতের কাছে আপনার পরিবর্তনগুলি দেখে মনে হয় সেগুলি সমস্ত নিজেরাই একটি পরিষ্কার ক্রমে ঘটেছে। এর অর্থ

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

আপনি এখনও ব্যাকআপের স্বার্থে আপনার ব্যক্তিগত বিকাশ শাখাটিকে দূরবর্তী সংগ্রহস্থলের দিকে ঠেলাঠেলি চালিয়ে যেতে পারেন তবে অন্যেরা যে "পাবলিক" শাখা হিসাবে বিবেচনা করবে না যেহেতু আপনি ছাড় পাচ্ছেন। বিটিডাব্লু, এটি করার জন্য একটি সহজ কমান্ডgit push --mirror origin

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


1
গিট ব্যবহার করে প্যাকেজিং সফ্টওয়্যারটির লিঙ্কটি আর কাজ করে না। মূল উত্তরটি সম্পাদনা করার জন্য আমি কোনও ভাল লিঙ্কটি খুঁজে পাইনি।
চেতান

আপনি আয়না করা উচিত নয় origin, আপনি একটি তৃতীয় ডেডিকেটেড-ব্যাকআপ সংগ্রহস্থলে মিরর করা উচিত।
মিরাল

12

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

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

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

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


আপনি বোঝাচ্ছেন যে ওপিতে তার প্রক্রিয়াটিতে কিছু অনাবৃত রিবেস বা ভুল রয়েছে, তাই না?
ক্রোসনভোল্ড

7

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


7

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

  • বিদ্যমান শাখা এ থেকে নতুন শাখা বি তৈরি করুন

  • শাখা বিতে পরিবর্তনগুলি যুক্ত করুন / প্রতিশ্রুতিবদ্ধ করুন

  • শাখা এ থেকে রিবেস আপডেটগুলি

  • শাখা বি থেকে শাখা A তে পরিবর্তিত করুন "

https://www.atlassian.com/git/tutorials/merging-vs-rebasing/


3

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


0

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

এখানে চিত্র বর্ণনা লিখুন

আমার কর্মপ্রবাহ আপনার কাছ থেকে প্রায় একই, তবে কেবলমাত্র একটি ছোট পার্থক্য সহ: আমি squashআমার শাখার আগে স্থানীয় শাখায় একটিতে rebaseসর্বশেষ পরিবর্তনগুলিতে প্রতিশ্রুতিবদ্ধ masterকারণ:

rebaseপ্রতিটি প্রতিশ্রুতি ভিত্তিতে কাজ করে

যার অর্থ, যদি আপনার 15 টির মতো একই লাইনটি পরিবর্তন করার masterঅঙ্গীকার থাকে তবে আপনি স্কোয়াশ না করলে 15 বার যাচাই করতে হবে, তবে কী চূড়ান্ত ফলাফল, তাই না?

সুতরাং, পুরো কর্মপ্রবাহটি হ'ল:

  1. masterআপনার সর্বশেষতম সংস্করণ রয়েছে তা নিশ্চিত করতে চেকআউট করুন এবং টানুন

  2. সেখান থেকে একটি নতুন শাখা তৈরি করুন

  3. সেখানে আপনার কাজটি করুন, আপনি নির্দ্বিধায় বেশ কয়েকবার প্রতিশ্রুতিবদ্ধ করতে পারেন এবং দূরবর্তী স্থানে যেতে পারেন, কোনও উদ্বেগ নেই, কারণ এটি আপনার শাখা।

  4. যদি কেউ আপনাকে বলে, "আরে, আমার পিআর / এমআর অনুমোদিত হয়েছে, এখন এটি মাস্টারের সাথে একীভূত হয়েছে", আপনি তাদের আনতে / এড়াতে পারেন। আপনি এটি যে কোনও সময় বা 6 ধাপে করতে পারেন।

  5. আপনার সমস্ত কাজ করার পরে, তাদের প্রতিশ্রুতিবদ্ধ করুন এবং আপনার যদি বেশ কয়েকটি কমিটি করে থাকে তবে সেগুলি স্কোয়াশ করুন (তারা আপনার সমস্ত কাজ code এটি ঠেলাও বা না, কিছু যায় আসে না।

  6. Checkout এ master, pullআবার তা নিশ্চিত করার জন্য আপনি সর্বশেষ আছে masterস্থানীয় হবে। আপনার চিত্রটি এর অনুরূপ হওয়া উচিত:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, আপনি আপনার স্থানীয় শাখায় রয়েছেন , যা পুরানো অবস্থা থেকে উদ্ভূত master, যখন master(স্থানীয় এবং দূরবর্তী উভয়ই) আপনার সহকর্মীর পরিবর্তনের সাথে এগিয়ে চলেছে।

  1. আপনার শাখায় ফিরে চেকআউট করুন, এবং মাস্টারকে পুনরায় সেট করুন। আপনি এখন শুধু কমিট, তাই আপনি দ্বন্দ্ব সমাধান হবে শুধুমাত্র একবার (এবং GitKraken, আপনি কেবল আপনার শাখা টেনে করতে হবে। masterএবং পছন্দ করে নিন "রি-বেসের ফলে।"; অন্য কারণ কেন আমি এটা মত) এর পরে, আপনি হতে হবে মত:

এখানে চিত্র বর্ণনা লিখুন

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

  2. PR / এমআর তৈরি করুন এবং এটি অনুমোদিত না হওয়া পর্যন্ত অপেক্ষা করুন, সুতরাং masterআপনার অবদান থাকবে। অভিনন্দন! সুতরাং masterডায়াগ্রামটি পরিষ্কার করার জন্য আপনি এখন চেকআউট করতে পারেন , আপনার পরিবর্তনগুলি টানতে পারেন এবং আপনার স্থানীয় শাখাটি মুছতে পারেন। রিমোট শাখাটিও মুছে ফেলা উচিত, যদি আপনি এটি মাস্টারে মার্জ করার সময় এটি করা না হয়।

চূড়ান্ত চিত্রটি আবার পরিষ্কার এবং পরিষ্কার:

এখানে চিত্র বর্ণনা লিখুন

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