আমি অন্য এক বিকাশকারীকে নিয়ে একটি প্রকল্পে কয়েক মাস ধরে এখন গিট ব্যবহার করছি। এসভিএন এর সাথে আমার বেশ কয়েক বছরের অভিজ্ঞতা রয়েছে , তাই আমি অনুমান করি যে সম্পর্কের জন্য আমি প্রচুর ব্যাগ নিয়ে এসেছি।
আমি শুনেছি গিট শাখা এবং মার্জ করার জন্য দুর্দান্ত, এবং এখনও পর্যন্ত, আমি এটি দেখতে পাচ্ছি না। অবশ্যই, শাখা প্রশাখাগুলি মারা গেছে, তবে যখন আমি একত্রীকরণের চেষ্টা করি তখন সবকিছু নরকে যায়। এখন, আমি এসভিএন এর সাথে অভ্যস্ত, তবে আমার কাছে মনে হয় যে আমি কেবল একটি সাব-পার ভার্সন সিস্টেমের জন্য অন্যটির জন্য ট্রেড করেছি।
আমার অংশীদার আমাকে বলেছে যে আমার সমস্যাগুলি উইলি-নিলিতে মার্জ করার আমার ইচ্ছা থেকে উদ্ভূত হয়েছে এবং অনেক পরিস্থিতিতে একীভূত হওয়ার পরিবর্তে আমার পুনরায় ব্যবহার করা উচিত। উদাহরণস্বরূপ, তিনি যে কর্মপরিধিটি রেখেছিলেন তা এখানে:
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
আমি গিটকে ভালবাসতে এসেছি এবং এসভিএন-এ আর ফিরে যেতে চাই না। যদি আপনি লড়াই করে থাকেন তবে কেবল এটির সাথে আঁকুন এবং শেষ পর্যন্ত আপনি টানেলের শেষে আলোটি দেখতে পাবেন।
rebase
বোঝার জন্য অনেক সাহায্য করেছে