tutorial - gitlab




ফিচার শাখা রিবেস পরে গিট ধাক্কা প্রত্যাখ্যাত (8)

ঠিক আছে, আমি ভাবলাম এটি একটি সহজ গিট দৃশ্যকল্প, আমি কি অনুপস্থিত?

আমার একটি master শাখা এবং একটি feature শাখা আছে। আমি master উপর কিছু কাজ, feature কিছু, এবং তারপর master উপর কিছু। আমি এইরকম কিছু দিয়ে শেষ করি (লেক্সিকোগ্রাফিক অর্ডারটি ক্রম অনুসারে নির্দেশ করে):

A--B--C------F--G  (master)
       \    
        D--E  (feature)

রিমোট master আপডেট করার জন্য git push origin master করার কোনও সমস্যা নেই এবং আমার feature জন্য রিমোট ব্যাকআপ বজায় রাখার জন্য git push origin feature (যখন feature ) রয়েছে। এখন পর্যন্ত, আমরা ভাল।

কিন্তু এখন আমি ফেইসবুকের উপরে মাস্টার্সের git checkout feature চাই, তাই আমি git checkout feature এবং git rebase master । এখনও ভাল. এখন আমাদের আছে:

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

সমস্যা: মুহূর্তে আমি নতুন রিবেডেড ব্যাকআপ ব্যাকআপ করতে চাই, git push origin feature দিয়ে ব্র্যাঞ্চেড, গাছটি পরিবর্তনের কারণে গাছটি পরিবর্তিত হওয়ার কারণে প্রত্যাখ্যাত হয় । এই শুধুমাত্র git push --force origin feature সঙ্গে সমাধান করা যেতে পারে।

আমি নিশ্চিত আমি ছাড়া এটি --force ব্যবহার করে ঘৃণা। তাই, আমার কি দরকার? রিবাজিং অপরিহার্যভাবে বোঝায় যে পরবর্তী push --force ful হতে হবে?

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


অন্যরা আপনার প্রশ্নের উত্তর দিয়েছেন। আপনি যদি কোন শাখা পুনর্বিবেচনা করেন তবে আপনাকে সেই শাখাটি ধাক্কা দিতে বাধ্য করতে হবে।

Rebase এবং একটি শেয়ার্ড রিপোজিটরি সাধারণত বরাবর পেতে না। এই ইতিহাস পুনর্বিবেচনা করা হয়। অন্যরা যদি সেই শাখাটি ব্যবহার করে বা সেই শাখা থেকে ব্র্যাঞ্চড থাকে তবে রিবেস বেশ অপ্রীতিকর হবে।

সাধারণভাবে, স্থানীয় শাখা পরিচালনার জন্য ভালভাবে কাজ করে। রিমোট শাখা ব্যবস্থাপনা সুস্পষ্ট মার্জেস (--no-ff) এর সাথে সর্বোত্তম কাজ করে।

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


অপারেটিং সিস্টেমটি সমস্যাটিকে বোঝে, ঠিক একটি নিছক সমাধান সন্ধান করে ...

কিভাবে একটি অনুশীলন হিসাবে এই সম্পর্কে?

  • প্রকৃত বৈশিষ্ট্য-বিকাশ শাখায় থাকুন (যেখানে আপনি কখনও রিজেস করবেন না এবং বলপ্রয়োগ করবেন না, তাই আপনার সহকর্মী বৈশিষ্ট্য ডেভেলপাররা আপনাকে ঘৃণা করে না)। এখানে, একটি মার্জ সঙ্গে নিয়মিত থেকে যারা পরিবর্তন দখল। Messier ইতিহাস , হ্যাঁ, কিন্তু জীবন সহজ এবং কেউ তার কাজ মধ্যে interrupted পেতে।

  • একটি দ্বিতীয় বৈশিষ্ট্য-বিকাশ শাখা আছে, যেখানে একটি ফিচার টিমের সদস্য নিয়ন্ত্রক প্রকৃতপক্ষে পুনর্নির্মিত, প্রকৃতপক্ষে পুনঃপ্রতিষ্ঠিত সমস্ত বৈশিষ্ট্যকে ধাক্কা দেয়। প্রায় পরিষ্কারভাবে একটি মোটামুটি সাম্প্রতিক মাস্টার কমিটির উপর ভিত্তি করে। বৈশিষ্ট্য সম্পন্ন হলে, মাস্টারের উপরে সেই শাখাটিকে ধাক্কা দিন।

ইতিমধ্যে এই পদ্ধতির জন্য একটি প্যাটার্ন নাম হতে পারে।


এটি এমন বা হতে পারে না যে এই শাখায় কেবলমাত্র একজন বিকাশকারী রয়েছে, যা এখন (বিনিময়ের পরে) মূল / বৈশিষ্ট্যের সাথে ইনলাইন নয়।

যেমন আমি নিম্নলিখিত ক্রম ব্যবহার করার পরামর্শ দিতে হবে:

git rebase master
git checkout -b feature_branch_2
git push origin feature_branch_2

হ্যাঁ, নতুন শাখা, এটি একটি -force ছাড়া এটি সমাধান করা উচিত, যা আমি মনে করি সাধারণত একটি প্রধান গিট বিপত্তি হয়।


এটির একটি সমাধান হল msysGit এর রিবেসিং মার্জ স্ক্রিপ্ট যা করতে হয় - রিবেস করার পরে, আমাদের পুরানো feature একত্রিত করে -এস। আপনি কমিট গ্রাফ সঙ্গে শেষ পর্যন্ত:

A--B--C------F--G (master)
       \         \
        \         D'--E' (feature)
         \           /
          \       --
           \    /
            D--E (old-feature)

... এবং feature আপনার ধাক্কা একটি দ্রুত এগিয়ে হবে।

অন্য কথায়, আপনি করতে পারেন:

git checkout feature
git branch old-feature
git rebase master
git merge -s ours old-feature
git push origin feature

(পরীক্ষা করা হয়নি, কিন্তু আমি মনে করি ঠিক আছে ...)


পরিবর্তে -এফ বা --force ডেভেলপার ব্যবহার করা উচিত

--force-with-lease

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


শক্তি ধাক্কা এড়িয়ে চলার আমার উপায় হল নতুন শাখা তৈরি করা এবং সেই নতুন শাখায় অবিরত কাজ এবং কিছু স্থিতিশীলতার পরে, পুনঃস্থাপিত পুরানো শাখাকে সরিয়ে দিন:

  • স্থানীয়ভাবে চেক আউট শাখা রিবাউস
  • একটি নতুন শাখা থেকে রিবেড শাখা থেকে শাখা
  • রিমোট একটি নতুন শাখা হিসাবে যে শাখা pushing। এবং রিমোট উপর পুরানো শাখা মুছে ফেলা

সহজ পদক্ষেপগুলি অনুসরণ করে আমার জন্য:

1. git checkout myFeature
2. git rebase master
3. git push --force-with-lease
4. git branch -f master HEAD
5. git checkout master
6. git pull

উপরের সব করার পরে, আমরা কমান্ডের সাহায্যে myFeature শাখাটি মুছে ফেলতে পারি:

git push origin --delete myFeature

feature শাখা একটি git merge master সঙ্গে ভুল কি? এটি আপনার মেইনলাইন শাখার থেকে পৃথক থাকার সময় আপনার কাজটি সংরক্ষণ করবে।

A--B--C------F--G
       \         \
        D--E------H

সম্পাদনা: আহ দুঃখিত আপনার সমস্যা বিবৃতি পড়তে না। আপনি একটি rebase সঞ্চালিত হিসাবে আপনি বল প্রয়োজন হবে। ইতিহাস সংশোধন করতে সমস্ত কমান্ডের --force আর্গুমেন্ট প্রয়োজন হবে। এটি আপনাকে একটি কাজ হারাতে বাধা দেয় (পুরানো D এবং E হারিয়ে যাবে)।

সুতরাং আপনি একটি git rebase সম্পাদন করেছেন যা গাছটিকে দেখতে দেয় (যদিও D এবং E হিসাবে আংশিকভাবে লুকানো থাকে তবে নামযুক্ত শাখায় আর নেই):

A--B--C------F--G
       \         \
        D--E      D'--E'

সুতরাং, যখন আপনার নতুন feature শাখা (এটিতে E' D' এবং E' ) চাপিয়ে দেওয়ার চেষ্টা করছেন, তখন আপনি D এবং E হারাবেন।








git