জোর করে ধাক্কা না দিয়ে আমি কীভাবে গিট রিবেস ব্যবহার করতে পারি?


94

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

আমি গিট 101 প্রবাহ হিসাবে বিবেচনা করে যা চালিয়ে যাচ্ছি (যা আমি নীচে বানান করি), push --forceযখন আমার পরিবর্তনগুলি আবার উত্সের দিকে ঠেলে দিতে হবে।

আমি একমাত্র নই - আমি জানি যে এটি আচ্ছাদিত স্থল (দেখুন 1 , 2 , 3 , 4 , 5 ), এবং আমি কেন জোর প্রয়োজন তা প্রযুক্তিগত কারণগুলি বুঝতে পারি । আমার সমস্যাটি হ'ল: অনেকগুলি (অনেক) ব্লগ এন্ট্রিগুলি পুনর্বাসনের প্রশংসা গাইছে এবং এটি কীভাবে তাদের জীবন বদলেছে (দেখুন 1 , 2 , 3 , 4 কয়েকটি তালিকা তৈরি করুন) তবে তাদের কোনওটিরই উল্লেখ নেই যা push --forceএর অংশ তাদের প্রবাহ তবে বিদ্যমান স্ট্যাকওভারফ্লো প্রশ্নের প্রায় প্রতিটি উত্তরই "হ্যাঁ, যদি আপনি পুনরায় ব্যবহার করতে চান, তবে আপনাকে ব্যবহার করতে হবে" এর মতো জিনিস বলে push --force

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

push --forceএকটি খারাপ জিনিস

সুতরাং এখানে আমার প্রবাহ। আমি কীভাবে কোনও শক্তি ছাড়াই একই ফলাফল অর্জন করতে পারি?

সাধারণ উদাহরণ

দুটি শাখা:

  • v1.0 - একটি রিলিজ শাখায় কেবল প্যাচ রয়েছে
  • মাস্টার - পরবর্তী বড় রিলিজ জন্য সবকিছু।

আমি কয়েক প্যাচ কমিট এবং পরবর্তী প্রকাশের জন্য কয়েকটি কমিট পেয়েছি।

প্রিমার

আমি প্যাচগুলি আমার মাস্টারে অন্তর্ভুক্ত করতে চাই যাতে তারা পরবর্তী প্রকাশের জন্য হারিয়ে না যায়। প্রাক-আলোকায়ন আমি কেবল:

git checkout master
git merge v1.0

তবে এখন আমি চেষ্টা করছি

git checkout master
git rebase v1.0

সুতরাং এখন আমি এখানে:

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

সময়ের জন্য:

git push

কোন পাশা.

উত্তর:


43

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

git checkout add-new-widget
git rebase -i master

শাখার মাস্টার হিসাবে দ্রুত-ফরোয়ার্ড মার্জ করার আগে। উদাহরণ স্বরূপ:

git checkout master
git merge --ff-only add-new-widget

এর সুবিধাটি হ'ল আপনার ইতিহাসে অনেকগুলি জটিল মার্জ কমিট বা মার্জ সংঘাত থাকবে না, কারণ আপনার সমস্ত পরিবর্তনগুলি মার্জ হওয়ার আগে মাস্টারের ডগায় পুনর্বাসিত হবে। একটি গৌণ সুবিধা হ'ল আপনি প্রত্যাবর্তন করেছেন, তবে আপনাকে ব্যবহার করতে হবে না git push --forceকারণ আপনি মাস্টার ব্রাঞ্চে ইতিহাস ক্লোবারিং করছেন না।

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


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

4
আমি এটি বুঝতে পারি, তবে মূল প্রশ্নটি রয়ে গেছে। আমি মনে করি আসল উত্তরটি হ'ল @ ফ্যাবিয়ান কোয়াটারভাক্স
ইসমাইলএস

4
ঠিক আছে, আপনি এখনও 1.0 শাখা জোর-ধাক্কা করতে হবে, না? অন্ততপক্ষে, আমার কাছে সবসময় জিনিসগুলি ঘুরে দাঁড়ায়। ফাবিয়েনস পদ্ধতিটি ঘটতে বাধা দেয়।
জর্ক্স

23

@ কোডডনোম ঠিক আছে। আপনি মাস্টারকে ভি 1.0 শাখায় রিবেস করবেন না তবে মাস্টারের উপর ভি 1.0 শাখা করা উচিত, এটি সমস্ত তাত্পর্য তৈরি করবে।

git checkout -b integrate_patches v1.0
git rebase master
git checkout master
git merge integrate_patches

একটি নতুন শাখা তৈরি করুন যা v1.0 এ নির্দেশ করে, সেই নতুন শাখাটি মাস্টারের শীর্ষে সরান এবং তারপরে V1.0 প্যাচগুলির নতুন সংস্করণকে মাস্টার শাখায় সংহত করুন। আপনি এরকম কিছু দিয়ে শেষ করবেন:

o [master] [integrate_patches] Another patch on v1.0
o A patch on v1.0
o Another change for the next major release
o Working on the next major release
|  o [v1.0] Another path on v1.0
|  o A patch on v1.0
| /
o Time for the release

রিবাজ ব্যবহারের এই উপায়টি অফিশিয়াল গিট ডকুমেন্টেশন দ্বারা প্রস্তাবিত ।

আমি মনে করি আপনি সম্পর্কে ঠিক বলেছেন git push --force: আপনি যদি ভুল করে থাকেন এবং কিছু না চান তবে আপনি কেবল এটি ব্যবহার করতে পারেন use


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

ধন্যবাদ ফ্যাবিয়েন, দুর্দান্ত উত্তর। আমাদের মধ্যে যেগুলি কেবল পরিবর্তনগুলিকে একীভূত করতে চায় masterএবং বৈশিষ্ট্য শাখায় নিজেই মার্জ করতে পছন্দ করে না, এটি করা যেতে পারে:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
সায়াবাস

17

আপনি যদি রিবাজ করেন তবে আপনাকে চাপ দিতে হবে, এবং আপনি ইতিমধ্যে আপনার পরিবর্তনগুলি প্রকাশ করেছেন, তাই না?

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

এটি ওয়ার্কফ্লোয়ের কেন্দ্র যেখানে আপনি রিবেস ব্যবহার করেন তবে বেশি চাপ দেবেন না: জিনিসগুলি প্রস্তুত না হওয়া পর্যন্ত প্রকাশ করবেন না, চাপ দেওয়ার পরে পুনরায় ব্যবহার করবেন না।


ধন্যবাদ ড্যান উপরেরটি কীভাবে অর্জন করা উচিত তা আমাকে জানাতে পারেন? এটি কি এমন পরিস্থিতি নয় যেখানে রিবেস প্রযোজ্য?
রায় ট্রুইলোভ

4
আপনি যদি আপনার সমস্ত কাজ বিষয় শাখায় আলাদা করে রাখেন তবে তা প্রত্যাখ্যানের জন্য একটি ভাল দৃশ্যের সেট আপ করে। আপনি rebaseআপনার টপিক শাখায় নতুন পরিবর্তন এনেছেন, কিন্তু যখন আপনি এই শাখার পরিবর্তনগুলি শেষ করেছেন, আপনি mergeশাখাটি আবার মূল বিকাশ শাখায় পরিণত করবেন।
redhotvengeance

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

রিবেসিংয়ের মতো শব্দগুলি এই দৃশ্যের জন্য কাজ করে না। v1.0 কোনও বিষয় শাখা নয়, এটি একটি রিলিজ শাখা, সুতরাং এটি কখনই মরবে না এবং প্রকাশ করতে হবে।
রায় ট্রুইলোভ

5

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


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

3

আমি যা ব্যবহার করি তা এখানে (আপনার শাখার নামটি ফুবার ধরে ধরে ):

git checkout master              # switch to master
git rebase   foobar              # rebase with branch
git merge -s ours origin/master  # do a basic merge -- but this should be empty
git push origin master           # aaand this should work

4
রিবাজিং মাস্টারকে অদ্ভুত দেখাচ্ছে।
এমিল বিক্রষ্টম

4
gitব্যক্তিত্ব ব্যতীত নয়
15-18

4
git merge -s ours origin/<branch>আমাদের জন্য এটি কী স্থির করে ছিল
সর্বাধিক

0

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

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

git checkout master
git checkout -b new-feature
git commit -am "commit new work"
git push -u origin new-feature
# have code reviewed, run CI, etc.,
# meanwhile master has new commits
git checkout master
git pull
git rebase -i master # -i for interactive rebase allows you to squash intermediate commits
git push --force-with-lease
git merge master

আমরা এখানে যা করেছি তার একটি সরল ইংরেজী সংস্করণ:

  1. মাস্টার ছাড়াই একটি নতুন শাখা তৈরি করেছে
  2. শাখায় কাজ শেষ হয়েছে এবং রিমোটে ঠেলা গেছে
  3. মাস্টার ছাড়িয়ে
  4. সঙ্গে রিমোট কাজ ধাক্কা force-with-lease
  5. অত্যন্ত ক্লিন গিট লগ দিয়ে মাস্টারে মার্জ করুন, সর্বদা সর্বশেষ মাস্টার (ভাগ করা শাখা) এর সাথে আমাদের শাখাটি "ধরা" পেতে আমাদের ভাগ করা শাখা থেকে একাধিক সংশ্লেষ থেকে বিশৃঙ্খলা হ্রাস করে

চতুর্থ পদক্ষেপটি সত্যই গুরুত্বপূর্ণ এবং আমি পুনর্বাসনের ব্যবহারের পক্ষে পরামর্শ নেওয়া শুরু করার অন্যতম প্রধান কারণ। force-with-leaseকোনও নতুন কমিট যুক্ত করা হয়েছে কিনা তা দেখতে রিমোটটি পরীক্ষা করে দেখুন। যদি আপনার git pushধ্বংসাত্মক হিসাবে প্রমাণিত হয় তবে তা ধাক্কা দেবে না!

আমি আশা করি এটি কাউকে রিবেস ব্যবহারের আরও আত্মবিশ্বাস দেয়।

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