গিট রিবেস বনাম গিট মার্জ কখন ব্যবহার করার পরামর্শ দেওয়া হয়?
একটি সফল রিবেস পরে আমার কি এখনও একীভূত হওয়া দরকার?
গিট রিবেস বনাম গিট মার্জ কখন ব্যবহার করার পরামর্শ দেওয়া হয়?
একটি সফল রিবেস পরে আমার কি এখনও একীভূত হওয়া দরকার?
উত্তর:
সুতরাং আপনি যখন কোন এক ব্যবহার করবেন?
init
একটি নতুন রেপো, add
ফাইল এবং সহ একটি ডিরেক্টরি তৈরি করুন commit
। একটি নতুন বৈশিষ্ট্য শাখা চেকআউট করুন ( checkout -b feature
।) পাঠ্য ফাইলটি পরিবর্তন করুন, প্রতিশ্রুতি দিন এবং পুনরাবৃত্তি করুন যাতে বৈশিষ্ট্য শাখায় দুটি নতুন কমিট থাকে। তারপর checkout master
এবং merge feature
। ইন log
, আমি মাস্টার সম্পর্কে আমার প্রাথমিক প্রতিশ্রুতি দেখি, তারপরে বৈশিষ্ট্য থেকে মার্জ করা দু'জনের পরে। আপনি যদি merge --squash feature
বৈশিষ্ট্যটি মাস্টারের সাথে একীভূত হন তবে প্রতিশ্রুতিবদ্ধ না হন, তবে মাস্টার সম্পর্কে একমাত্র নতুন প্রতিশ্রুতিটি আপনি নিজেরাই বানাবেন।
ইহা সাধারণ. পুনর্বাসনের সাথে আপনি অন্য একটি শাখাকে আপনার কাজের নতুন ভিত্তি হিসাবে ব্যবহার করার কথা বলেছেন ।
আপনার যদি, উদাহরণস্বরূপ, একটি শাখা থাকে তবে master
আপনি একটি নতুন বৈশিষ্ট্য বাস্তবায়নের জন্য একটি শাখা তৈরি করেন এবং বলেছিলেন যে আপনি এটির নাম cool-feature
রেখেছেন অবশ্যই মাস্টার শাখাটি আপনার নতুন বৈশিষ্ট্যের ভিত্তি।
এখন একটি নির্দিষ্ট সময়ে আপনি master
শাখায় প্রয়োগ করা নতুন বৈশিষ্ট্যটি যুক্ত করতে চান । আপনি কেবল শাখায় স্যুইচ করতে master
এবং মার্জ করতে পারবেন cool-feature
:
$ git checkout master
$ git merge cool-feature
তবে এইভাবে একটি নতুন ডামি কমিট যুক্ত করা হয়েছে। আপনি যদি স্প্যাগেটি-ইতিহাস এড়াতে চান তবে আপনি পুনঃব্যবস্থা করতে পারেন :
$ git checkout cool-feature
$ git rebase master
এবং তারপরে এটি মার্জ করুন master
:
$ git checkout master
$ git merge cool-feature
এবার, যেহেতু টপিক শাখায় একই বৈশিষ্ট্যযুক্ত মাস্টার প্লাস নতুন বৈশিষ্ট্যটি নিয়ে কমিট রয়েছে, তাই মার্জটি কেবল দ্রুত-অগ্রসর হবে।
but this way a new dummy commit is added, if you want to avoid spaghetti-history
- এটা কেমন খারাপ?
Sean Schofield
একটি মন্তব্যে বলেছেন: "রিবেসটিও দুর্দান্ত কারণ আপনি একবারে আপনার জিনিসগুলি মাস্টারে ফিরিয়ে আনুন (যা ইতিমধ্যে বর্ণিত হিসাবে তুচ্ছ) আপনি এটি আপনার কমিটের ইতিহাসের" শীর্ষ "এ বসে আছেন On প্রকল্পগুলি যেখানে বৈশিষ্ট্যগুলি লিখিত হতে পারে তবে বেশ কয়েক সপ্তাহ পরে মার্জ হয়ে যায়, আপনি কেবল তাদেরকে মাস্টারের সাথে একীভূত করতে চান না কারণ তারা ইতিহাসে ফিরে আসার মাস্টার পথে "স্টাফড" হয়ে যায় I ব্যক্তিগতভাবে আমি গিট লগ করতে এবং দেখতে সক্ষম হতে পছন্দ করি সাম্প্রতিক বৈশিষ্ট্যটি ঠিক উপরে "শীর্ষে" রয়েছে। নোটের তারিখগুলি সংরক্ষণ করা আছে তা নোট করুন - রিবেস সেই তথ্য পরিবর্তন করে না ""
merge
, rebase
, fast-forward
, ইত্যাদি) একটি নির্দেশ acyclic গ্রাফ নির্দিষ্ট হেরফেরের উল্লেখ করা হয়। তারা সেই মানসিক মডেলটি মাথায় রেখেই তর্ক করতে সহজ হয়ে যায়।
টিসম্পার দ্বারা উল্লিখিত আমার নিজের উত্তরটির পরিপূরক করতে ,
মার্জ করার আগে একটি রিবেস প্রায়শই করা ভাল ধারণা, কারণ ধারণাটি হ'ল আপনি আপনার শাখায় Y
যে শাখার B
সংশ্লেষ করবেন সেটির কাজটি আপনি একীভূত করবেন।
তবে আবার মার্জ করার আগে আপনি নিজের শাখায় যে কোনও দ্বন্দ্ব সমাধান করেছেন (যেমন: "রিবেস", যেমন "শাখার সাম্প্রতিক বিন্দু থেকে আমার শাখায় আমার কাজটি পুনরায় খেলুন B
)
সঠিকভাবে করা গেলে পরবর্তীকালে আপনার শাখা থেকে মার্জ করুন to শাখা B
দ্রুত এগিয়ে যেতে পারে।
একটি মার্জ সরাসরি গন্তব্য শাখাকে প্রভাবিত করে B
, যার অর্থ মার্জগুলি আরও ভাল তুচ্ছ হতে পারে, অন্যথায় B
a শাখাটি স্থিতিশীল অবস্থায় ফিরে আসতে দীর্ঘতর হতে পারে (আপনার সমস্ত দ্বন্দ্বের সমাধানের সময়)
একটি রিবেস পরে মার্জ পয়েন্ট?
আমি যে বর্ণনা করছি সে ক্ষেত্রে আমি B
আমার শাখায় পুনর্বার আছি, কেবল আমার কাজটি সাম্প্রতিক বিন্দু থেকে রিপ্লে করার সুযোগ পাবে B
, তবে আমার শাখায় থাকা অবস্থায়।
এই ক্ষেত্রে, আমার "পুনরায় খেলানো" কাজটি আনার জন্য এখনও একত্রীকরণের প্রয়োজন B
।
অন্যান্য দৃশ্য ( উদাহরণস্বরূপ গিট রেডিতে বর্ণিত ) হ'ল আপনার কাজটি B
একটি রিবেসের মাধ্যমে সরাসরি এনে দেওয়া (যা আপনার সমস্ত সুন্দর প্রতিশ্রুতি রক্ষা করে, বা এমনকি ইন্টারেক্টিভ রিবেসের মাধ্যমে সেগুলি পুনরায় অর্ডার করার সুযোগ দেয়)।
সেক্ষেত্রে (বি শাখায় থাকাকালীন আপনি যেখানে রিবেস করবেন), আপনি ঠিক বলেছেন: আর কোনও সংযুক্তির দরকার নেই:
ডিফল্ট একটি গিট ট্রি যখন আমরা সংহত বা পুনরায় ব্যবস্থা না করি
আমরা মুক্তি দিয়ে পেয়েছি:
এই দ্বিতীয় দৃশ্যটি প্রায়: আমি কীভাবে নতুন বৈশিষ্ট্যটি মাস্টারে ফিরে পাব।
আমার বক্তব্য, প্রথম রিবেস দৃশ্যের বর্ণনা দিয়ে সবাইকে মনে করিয়ে দেওয়া হয় যে একটি রিবেসটিকে প্রাথমিক পদক্ষেপ হিসাবেও ব্যবহার করা যেতে পারে (যে "নতুন বৈশিষ্ট্যটি আবার মাস্টার হয়ে যায়")।
আপনি প্রথমে নতুন বৈশিষ্ট্য শাখায় মাস্টার আনতে "রিবেস" ব্যবহার করতে পারেন: রিবাজে নতুন ফিচারের কমিটগুলি রিপ্লে করবে HEAD master
তবে নতুন বৈশিষ্ট্য শাখায়, কার্যকরভাবে আপনার শাখার প্রারম্ভিক অবস্থানটিকে পুরানো মাস্টার কমিট থেকে কার্যকরভাবে সরিয়ে নিয়ে যাবে HEAD-master
।
এটি আপনাকে আপনার শাখায় যে কোনও দ্বন্দ্ব সমাধান করতে দেয় (অর্থাত্ বিচ্ছিন্নতার ক্ষেত্রে, যদি আপনার বিরোধ নিষ্পত্তি পর্যায়ে খুব বেশি সময় লাগে তবে মাস্টারকে সমান্তরালভাবে বিকশিত হতে থাকবে)।
তারপর আপনি মাস্টার এবং একত্রীকরণ সুইচ করতে পারেন new-feature
(অথবা রি-বেসের ফলে new-feature
সম্মুখের master
আপনি মধ্যে সম্পন্ন করে সংরক্ষণ করতে ইচ্ছুক আপনারnew-feature
শাখা)।
তাই:
master
,।আপনার যদি সন্দেহ থাকে তবে মার্জটি ব্যবহার করুন।
একটি রিবেস এবং একীকরণের মধ্যে কেবলমাত্র পার্থক্যগুলি হ'ল:
সুতরাং সংক্ষিপ্ত উত্তরটি হ'ল রিবেস বাছাই করা বা আপনি নিজের ইতিহাসটি কেমন দেখতে চান তার উপর ভিত্তি করে মার্জ করা ।
কোন অপারেশনটি ব্যবহার করবেন তা বেছে নেওয়ার ক্ষেত্রে কয়েকটি কারণ বিবেচনা করা উচিত।
যদি তাই হয় তবে রিবেস করবেন না। রিবেস শাখাটি নষ্ট করে দেয় এবং সেইগুলি বিকাশকারীরা ব্যবহার না করে ভাঙা / অসামঞ্জস্যপূর্ণ সংগ্রহস্থল রাখবে git pull --rebase
। অন্যান্য বিকাশকারীদের দ্রুত বিরক্ত করার এটি একটি ভাল উপায়।
রিবেস একটি ধ্বংসাত্মক অপারেশন। এর অর্থ, আপনি যদি এটি সঠিকভাবে প্রয়োগ না করেন তবে আপনি প্রতিশ্রুতিবদ্ধ কাজটি হারাতে পারেন এবং / অথবা অন্যান্য বিকাশকারীর সংগ্রহস্থলগুলির ধারাবাহিকতা ভঙ্গ করতে পারেন।
আমি এমন দলগুলিতে কাজ করেছি যেখানে বিকাশকারীরা এমন এক সময় থেকে এসেছিলেন যখন সংস্থাগুলি শাখা এবং মার্জিংয়ের সাথে ডিল করার জন্য নিবেদিত কর্মীদের সামর্থ্য করতে পারে। এই বিকাশকারীরা গিট সম্পর্কে খুব বেশি জানেন না এবং বেশি কিছু জানতে চান না। এই দলগুলিতে আমি কোনও কারণে ছাড় দেওয়ার সুপারিশ করার ঝুঁকি নেব না।
কিছু দল শাখা-প্রতি-বৈশিষ্ট্য মডেল ব্যবহার করে যেখানে প্রতিটি শাখা একটি বৈশিষ্ট্য উপস্থাপন করে (বা বাগফিক্স, বা উপ-বৈশিষ্ট্য ইত্যাদি) এই মডেলটিতে শাখাটি সম্পর্কিত কমিটগুলির সেট সনাক্ত করতে সহায়তা করে। উদাহরণস্বরূপ, কেউ সেই শাখার মার্জটি ফিরিয়ে দিয়ে দ্রুত কোনও বৈশিষ্ট্যটিকে ফিরিয়ে আনতে পারে (সত্যি বলতে গেলে এটি বিরল অপারেশন) a অথবা দুটি শাখার তুলনায় একটি বৈশিষ্ট্য পৃথক করুন (আরও সাধারণ)। রিবেস শাখাটি ধ্বংস করবে এবং এটি সোজা হবে না।
আমি সেই দলগুলিতেও কাজ করেছি যা শাখা-প্রতি-বিকাশকারী মডেল ব্যবহার করেছিল (আমরা সবাই সেখানে এসেছি)। এক্ষেত্রে শাখা নিজেই কোনও অতিরিক্ত তথ্য সরবরাহ করে না (কমিটটির ইতিমধ্যে লেখক রয়েছে)। প্রত্যাবাসনে কোনও ক্ষতি হবে না।
একত্রিতকরণকে ফিরিয়ে আনার তুলনায় পুনরায় ফিরিয়ে দেওয়া (পূর্বাবস্থায় ফেরা হিসাবে) একটি রিবেস যথেষ্ট কঠিন এবং / অথবা অসম্ভব (যদি রিবেসে দ্বন্দ্ব ছিল)। যদি আপনি মনে করেন যে কোনও সুযোগ আছে তবে আপনি ফিরে যেতে চান তবে মার্জটি ব্যবহার করুন।
রিবেস ক্রিয়াকলাপগুলিকে একটি সংশ্লিষ্ট সাথে টানতে হবে git pull --rebase
। আপনি যদি নিজেরাই কাজ করে থাকেন তবে আপনি উপযুক্ত সময়ে কোনটি ব্যবহার করা উচিত তা আপনি মনে করতে সক্ষম হতে পারেন। আপনি যদি একটি দলে কাজ করছেন তবে এটি সমন্বয় করা খুব কঠিন হবে। এ কারণেই বেশিরভাগ রিবেস ওয়ার্কফ্লোগুলি সমস্ত মার্জ (এবং git pull --rebase
সমস্ত টানার জন্য) রিবেস ব্যবহার করার পরামর্শ দেয় ।
ধরে নিচ্ছি আপনার নিম্নলিখিত সংশ্লেষ রয়েছে:
B -- C
/ \
A--------D
কিছু লোক জানিয়েছেন যে মার্জটি কমিটের ইতিহাসকে "ধ্বংস" করে দেয় কারণ আপনি যদি কেবলমাত্র মাস্টার শাখার (এ - ডি) লগটি দেখতে চান তবে আপনি বি এবং সিতে থাকা গুরুত্বপূর্ণ প্রতিশ্রুতি বার্তাগুলি মিস করবেন would
যদি এটি সত্য হয় তবে আমাদের মতো প্রশ্ন থাকবে না । মূলত, আপনি বি এবং সি দেখতে পাবেন যতক্ষণ না আপনি স্পষ্টভাবে সেগুলি না দেখার জন্য জিজ্ঞাসা করেন (- প্রথম-পিতামাতার ব্যবহার করে)। এটি নিজের জন্য চেষ্টা করা খুব সহজ।
দুটি পদ্ধতির পৃথকভাবে মার্জ হয়েছে, তবে এটি পরিষ্কার নয় যে একটি সর্বদা অন্যের চেয়ে ভাল এবং এটি বিকাশকারী কার্যপ্রবাহের উপর নির্ভর করে। উদাহরণস্বরূপ, যদি কোনও বিকাশকারী নিয়মিত প্রতিশ্রুতিবদ্ধ হন (যেমন তারা কাজ থেকে ঘরে ঘরে রূপান্তরিত হওয়ার সাথে সাথে তারা দিনে দু'বার প্রতিশ্রুতিবদ্ধ) তবে প্রদত্ত শাখার জন্য প্রচুর প্রতিশ্রুতি থাকতে পারে। এই কমিটগুলি অনেকেই চূড়ান্ত পণ্যটির মতো দেখতে না দেখায় (প্রতি বৈশিষ্ট্যটিতে আমার কাছে একবার বা দু'বার যোগাযোগ করার চেষ্টা করি) ref যদি অন্য কেউ সম্পর্কিত কোনও কোড সম্পর্কিত এলাকায় কাজ করে এবং তারা আমার পরিবর্তনগুলি পুনরায় ফিরিয়ে দেওয়ার চেষ্টা করে তবে এটি মোটামুটি ক্লান্তিকর কাজ হতে পারে।
আপনি যদি "সময় বাঁচাতে" উপনামটি পছন্দ করেন তবে আপনার জন্য পুনর্বাসনাটি rm
হতে rm -rf
পারে।
আমি সবসময় ভাবি যে কোনও দিন আমি এমন একটি দৃশ্য দেখতে পাব যেখানে গিট রিবেস হ'ল দুর্দান্ত সরঞ্জাম যা সমস্যার সমাধান করে। অনেকটা আমি মনে করি আমি এমন একটি দৃশ্যের মুখোমুখি হব যেখানে গিট রিফ্লগ একটি দুর্দান্ত সরঞ্জাম যা আমার সমস্যা সমাধান করে। আমি গিটির সাথে এখন পাঁচ বছরেরও বেশি সময় ধরে কাজ করেছি। এটা হয়নি।
অগোছালো ইতিহাস আমার জন্য সত্যই কখনও সমস্যা ছিল না। আমি কখনও একটি উত্তেজনাপূর্ণ উপন্যাসের মতো আমার প্রতিশ্রুতিবদ্ধ ইতিহাসটি পড়ি না। আমার একটি ইতিহাসের প্রয়োজনের বেশিরভাগ সময় আমি যাইহোক গিট দোষ বা গিট বাইসেক্ট ব্যবহার করতে যাচ্ছি। সেক্ষেত্রে মার্জ কমিট হওয়া আমার পক্ষে আসলেই দরকারী, কারণ যদি মার্জটি ইস্যুটি চালু করে তবে তা আমার কাছে অর্থবহ তথ্য।
আমার সাধারণ পরামর্শটি এখনও দাঁড়িয়ে থাকলেও আমি রেবেস ব্যবহারে ব্যক্তিগতভাবে নরম হয়েছি তা উল্লেখ করার জন্য আমি বাধ্যবাধকতা বোধ করি। আমি সম্প্রতি কৌণিক 2 উপাদান প্রকল্পের সাথে অনেক কথোপকথন করেছি । তারা খুব পরিষ্কার প্রতিশ্রুতিবদ্ধ ইতিহাস রাখতে রিবেস ব্যবহার করেছে। এটি আমাকে খুব সহজেই দেখার অনুমতি দিয়েছে যে কোন প্রতিশ্রুতিবদ্ধ কোনও প্রদত্ত ত্রুটি সংশোধন করেছে এবং সেই প্রতিশ্রুতি প্রকাশে অন্তর্ভুক্ত ছিল কি না। এটি রিবেসকে সঠিকভাবে ব্যবহারের দুর্দান্ত উদাহরণ হিসাবে কাজ করে।
এখানে প্রচুর উত্তর বলে যে মার্জ করা আপনার সমস্ত প্রতিশ্রুতি একটিকে পরিণত করে এবং তাই আপনার কমিটগুলি সংরক্ষণের জন্য পুনরায় ব্যবহার করার পরামর্শ দেয়। এটি ভুল। এবং যদি আপনি ইতিমধ্যে আপনার প্রতিশ্রুতিগুলি ঠেলে থাকেন তবে একটি খারাপ ধারণা ।
মার্জ করা আপনার প্রতিশ্রুতিগুলি বিলুপ্ত করে না । মার্জ ইতিহাস সংরক্ষণ করে! (কেবল গিটকে দেখুন) রিবেস ইতিহাস পুনর্লিখন করে, যা আপনি এটি ঠেলে দেওয়ার পরে একটি খারাপ বিষয় ।
মার্জ ব্যবহার করুন - যখনই আপনি ইতিমধ্যে ঠেলাঠেলি করেছেন তখন পুনরায় ব্যবহার করবেন না ।
এখানে লিনাস '(গিটের লেখক) এটি গ্রহণ করুন (এখন আমার নিজের ব্লগে হোস্ট করা হয়েছে, যেমন ওয়েব্যাক মেশিন দ্বারা উদ্ধার করা হয়েছে )। এটি সত্যিই ভাল পড়া।
অথবা আপনি নীচে একই ধারণার নিজস্ব সংস্করণ পড়তে পারেন।
মাস্টারের উপর একটি শাখা ছাড়:
বিপরীতে, একটি বিষয় শাখাকে মাস্টারে মার্জ করা:
টিএলডিআর: এটি সবচেয়ে গুরুত্বপূর্ণ কিসের উপর নির্ভর করে - একটি পরিপাটি ইতিহাস বা উন্নয়নের ক্রমের সত্য উপস্থাপনা
যদি একটি পরিপাটি ইতিহাস সবচেয়ে গুরুত্বপূর্ণ হয়, তবে আপনি প্রথমে রিবেস করবেন এবং তারপরে আপনার পরিবর্তনগুলি মার্জ করবেন, সুতরাং নতুন কোডটি কী তা সঠিকভাবে স্পষ্ট। আপনি যদি ইতিমধ্যে আপনার শাখাটি ঠেলে ফেলে থাকেন তবে আপনি যদি পরিণতিগুলি মোকাবেলা করতে না পারেন তবে রিবেস করবেন না।
যদি ক্রমের সত্য উপস্থাপনা সবচেয়ে গুরুত্বপূর্ণ হয় তবে আপনি ছাড় ছাড়াই একত্রীকরণ করবেন।
মার্জ করার অর্থ: একটি একক নতুন প্রতিশ্রুতি তৈরি করুন যা আমার পরিবর্তনগুলিকে গন্তব্যে একীভূত করে। দ্রষ্টব্য: এই নতুন প্রতিশ্রুতিটির দু'জন পিতা-মাতা থাকবে - আপনার প্রতিশ্রুতিবদ্ধ স্ট্রিংয়ের সর্বশেষ প্রতিশ্রুতি এবং আপনি যে শাখাটি মার্জ করছেন তা সর্বশেষ প্রতিশ্রুতিবদ্ধ।
রিবেসের অর্থ: আমার বর্তমান কমিটের সেটটি ইঙ্গিত হিসাবে ব্যবহার করে কমিটের সম্পূর্ণ নতুন সিরিজ তৈরি করুন। অন্য কথায়, আমার পরিবর্তনগুলি দেখতে কেমন হত তা গণনা করুন যদি আমি সেখান থেকে প্রত্যাবর্তন করছি এমন বিন্দু থেকে সেগুলি তৈরি করা শুরু করি। রিবাজের পরে, আপনার পরিবর্তনগুলি পুনরায় পরীক্ষা করার প্রয়োজন হতে পারে এবং রিবাজের সময় আপনার সম্ভবত কয়েকটি বিবাদ হতে পারে।
এটি দেওয়া হয়েছে, আপনি কেন পুনর্বাসন করবেন? শুধু উন্নয়নের ইতিহাস পরিষ্কার রাখতে। ধরা যাক আপনি এক্স ফিচারে কাজ করছেন এবং আপনার কাজ শেষ হয়ে গেলে আপনি নিজের পরিবর্তনগুলিকে এতে মার্জ করে দিন The এখন, মার্জ করার পরিবর্তে, আপনি যদি রিবেসড হন এবং তারপরে মার্জ হয়ে যান, তবে গন্তব্য বিকাশের ইতিহাসে সমস্ত স্বতন্ত্র কমিটগুলি একক যৌক্তিক অগ্রগতিতে অন্তর্ভুক্ত থাকবে। এটি পরে পর্যালোচনা পরিবর্তনগুলি আরও সহজ করে তোলে। ভাবুন যে 50 টি বিকাশকারীরা সমস্ত সময় বিভিন্ন বৈশিষ্ট্য একত্রিত করে রাখলে আপনি বিকাশের ইতিহাস পর্যালোচনা করতে কতটা কষ্ট পেয়েছেন।
এটি বলেছে যে আপনি যদি উজানে প্রবাহিত শাখাটি ইতিমধ্যে ঠেলে ফেলে থাকেন তবে আপনাকে পুনরায় শোধ করা উচিত নয়, পরিবর্তে মার্জ করা উচিত। যে শাখাগুলি উপরের দিকে ধাবিত হয়নি, রিবেস, পরীক্ষা এবং মার্জ করা হয়েছে For
আর একবার আপনি রিবেস করতে চাইতে পারেন যখন আপনি যখন প্রবাহের দিকে ধাক্কা দেওয়ার আগে আপনার শাখা থেকে কমিটস থেকে মুক্তি পেতে চান। উদাহরণস্বরূপ: যে কমিটগুলি প্রাথমিকভাবে কিছু ডিবাগিং কোড প্রবর্তন করে এবং সেই কোডটি পরিষ্কার করে তা সম্পর্কে আরও কমিট করে। এটি করার একমাত্র উপায় একটি ইন্টারেক্টিভ রিবেস সম্পাদন করা:git rebase -i <branch/commit/tag>
আপডেট: আপনি যখন গিটটি এমন কোনও সংস্করণ নিয়ন্ত্রণ সিস্টেমে ইন্টারফেসে ব্যবহার করেন যা অ-রৈখিক ইতিহাস সমর্থন করে না ( উদাহরণস্বরূপ সাবভারশন )। গিট-এসএনএন ব্রিজটি ব্যবহার করার সময়, এটি খুব গুরুত্বপূর্ণ যে আপনি যে পরিবর্তনগুলি সাবভারশনটিতে আবার মার্জ করে তা ট্রাঙ্কের সাম্প্রতিক পরিবর্তনের শীর্ষে পরিবর্তনের ক্রমিক তালিকা। এটি করার দুটি মাত্র উপায় রয়েছে: (১) ম্যানুয়ালি পরিবর্তনগুলি পুনরায় তৈরি করুন এবং (২) রিবেস কমান্ডটি ব্যবহার করুন যা অনেক দ্রুত।
আপডেট 2: পুনর্বাসনের কথা ভাবার একটি অতিরিক্ত উপায় হ'ল এটি আপনার বিকাশ শৈলী থেকে আপনার প্রতিশ্রুতিবদ্ধ ভান্ডারটিতে গৃহীত শৈলীতে এক ধরণের ম্যাপিং সক্ষম করে। আসুন আমরা আপনাকে ছোট, ছোট অংশগুলিতে প্রতিশ্রুতিবদ্ধ করতে পছন্দ করি say আপনার একটি টাইপো ঠিক করার প্রতিশ্রুতিবদ্ধ, অব্যবহৃত কোড থেকে মুক্তি পাওয়ার জন্য একটি প্রতিশ্রুতিবদ্ধ। আপনার যা করা দরকার তা শেষ করার সাথে সাথে আপনার এক দীর্ঘ সিরিজের কমিট রয়েছে। এখন বলা যাক যে ভাণ্ডারগুলি আপনি বড় কমিটকে উত্সাহিত করার প্রতিশ্রুতি দিচ্ছেন, সুতরাং আপনি যে কাজটি করছেন তার জন্য একজন এক বা দুইটি কমিট আশা করতে পারে। আপনি কীভাবে আপনার প্রতিশ্রুতিগুলির স্ট্রিং নেন এবং কীভাবে প্রত্যাশিত তা সংকুচিত করেন? আপনি একটি ইন্টারেক্টিভ রিবেস ব্যবহার করবেন এবং আপনার ক্ষুদ্র প্রতিশ্রুতিগুলি আরও বৃহত্তর অংশে স্কোয়াশ করবেন। বিপরীতটি প্রয়োজন হলে একই কথাটি সত্য হয় - যদি আপনার স্টাইলটি কয়েকটি বড় কমিট হয়, তবে সংগ্রহস্থল ছোট ছোট কমিটের দীর্ঘ স্ট্রিংয়ের দাবি করেছিল। আপনি এটি করতে একটি রিবেস ব্যবহার করবেন। আপনি যদি পরিবর্তে মার্জ হয়ে থাকেন তবে আপনি এখন আপনার প্রতিশ্রুতিবদ্ধ শৈলীটি মূল ভান্ডারটিতে রচনা করেছেন। যদি এখানে অনেক বিকাশকারী থাকে তবে আপনি কল্পনা করতে পারেন যে কিছু সময়ের পরে বেশ কয়েকটি আলাদা কমিট স্টাইল সহ কোনও ইতিহাস অনুসরণ করা কতটা কঠিন।
আপডেট 3: Does one still need to merge after a successful rebase?
হ্যাঁ, আপনি না। কারণটি হ'ল প্রত্যাবর্তন মূলত কমিটস "শিফটিং" এর সাথে জড়িত। যেমনটি আমি আগেই বলেছি, এই কমিটগুলি গণনা করা হয়, তবে যদি শাখা প্রশাখার দিক থেকে আপনার 14 টি কমিট থাকে তবে ধরে নেওয়া আপনার রিবেসে কোনও ভুল হয় না, আপনি 14 কমিট এগিয়ে যাবেন (আপনি যে পয়েন্টে প্রত্যাবর্তন করছেন) এর পরে রিবেস করা হয়েছে। পুনঃবাসের আগে আপনার একটি শাখা ছিল। আপনার পরে একই দৈর্ঘ্যের একটি শাখা থাকবে। আপনার পরিবর্তনগুলি প্রকাশের আগে আপনাকে এখনও মার্জ করতে হবে। অন্য কথায়, আপনি যতবার চান রিবেস করুন (আবার, কেবলমাত্র আপনি যদি আপনার পরিবর্তনগুলিকে প্রবাহিত না করেন)। আপনি পুনঃস্থাপনের পরেই মার্জ করুন।
git merge
সমর্থন করে --no-ff
যা এটি মার্জ কমিট করতে বাধ্য করে।
যদিও সংযুক্তি পরিবর্তনগুলি সংহত করার অবশ্যই সহজতম এবং সর্বাধিক সাধারণ উপায়, তবে এটি একমাত্র নয়: রিবেস সংহতকরণের একটি বিকল্প উপায়।
সামান্য উন্নত মার্জ বোঝা
গিট যখন মার্জ করে, এটি তিনটি কমিটের সন্ধান করে:
ফাস্ট-ফরওয়ার্ড বা মার্জ কমিট
খুব সাধারণ ক্ষেত্রে, ব্রাঞ্চিংয়ের পরে দুটি শাখার মধ্যে একটিরও নতুন কমিট নেই - এর সর্বশেষ প্রতিশ্রুতি এখনও সাধারণ পূর্বপুরুষ।
এক্ষেত্রে, সংহতকরণ সম্পাদন করা মরিয়া: গিট সাধারণ পিতৃপুরুষদের প্রতিশ্রুতিবদ্ধতার শীর্ষে অন্য শাখার সমস্ত কমিট যুক্ত করতে পারে। গিট-এ, সংহতকরণের এই সর্বাধিকতম রূপকে "ফাস্ট-ফরোয়ার্ড" একীকরণ বলা হয়। উভয় শাখাই ঠিক একই ইতিহাস ভাগ করে।
অনেক ক্ষেত্রে তবে উভয় শাখা পৃথকভাবে এগিয়ে গেছে।
ইন্টিগ্রেশন করার জন্য, গিটকে একটি নতুন কমিট তৈরি করতে হবে যাতে তাদের মধ্যে পার্থক্য রয়েছে - মার্জ কমিট।
হিউম্যান কমিটস এবং মার্জ কমিটস
সাধারণত, একটি প্রতিশ্রুতি যত্ন সহকারে একটি মানুষ তৈরি করে। এটি একটি অর্থবহ ইউনিট যা কেবলমাত্র সম্পর্কিত পরিবর্তনগুলিকে আবৃত করে এবং তাদের একটি মন্তব্য দিয়ে টিকা দেয়।
মার্জ কমিট কিছুটা আলাদা: কোনও বিকাশকারী তৈরি না করে এটি গিট দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়। এবং সম্পর্কিত পরিবর্তনগুলির একটি সেট মোড়কের পরিবর্তে, এর উদ্দেশ্য হ'ল একটি গিঁটের মতো দুটি শাখা সংযোগ করা। আপনি যদি পরে কোনও মার্জ অপারেশন বুঝতে চান তবে আপনার উভয় শাখার ইতিহাস এবং সংশ্লিষ্ট কমিট গ্রাফের দিকে নজর দেওয়া উচিত।
রিবেসের সাথে একীকরণ করা হচ্ছে
কিছু লোক এ জাতীয় স্বয়ংক্রিয় মার্জ কমিট ছাড়াই যেতে পছন্দ করে। পরিবর্তে, তারা প্রকল্পের ইতিহাসটি দেখতে চান যেন এটি একক, সরলরেখায় বিকশিত হয়েছিল। কোনও পর্যায়ে এটি একাধিক শাখায় বিভক্ত হয়ে গেছে বলে কোনও ইঙ্গিত পাওয়া যায়নি।
আসুন ধাপে ধাপে একটি রিবেস অপারেশন দিয়ে চলুন। পূর্ববর্তী উদাহরণগুলির মতো দৃশ্যটি একই রকম: আমরা শাখা-বি থেকে পরিবর্তনগুলি শাখা-এতে সংহত করতে চাই, তবে এখন পুনরায় ব্যবহারের মাধ্যমে।
আমরা এটি তিনটি পদক্ষেপে করব
git rebase branch-A // Synchronises the history with branch-A
git checkout branch-A // Change the current branch to branch-A
git merge branch-B // Merge/take the changes from branch-B to branch-A
প্রথমে, গিট শাখা-এ-তে সমস্ত প্রতিশ্রুতি "পূর্বাবস্থায় ফিরিয়ে দেবে" যা লাইনগুলি শাখা শুরু করার পরে ঘটেছিল (সাধারণ পূর্বপুরুষের অঙ্গীকারের পরে)। তবে অবশ্যই এটি তাদের ত্যাগ করবে না: পরিবর্তে আপনি সেইসব অঙ্গীকারকে "সাময়িকভাবে রক্ষা পেয়েছেন" বলে ভাবতে পারেন।
এরপরে, এটি শাখা-বি থেকে করা চুক্তিগুলি প্রয়োগ করে যা আমরা সংহত করতে চাই। এই মুহুর্তে, উভয় শাখা একেবারে একই দেখায়।
চূড়ান্ত পদক্ষেপে, শাখা-এ-তে নতুন কমিটিগুলি পুনরায় প্রয়োগ করা হয় - তবে একটি নতুন অবস্থানে, শাখা-বি থেকে সংহত কমিটগুলির শীর্ষে (সেগুলি পুনরায় ভিত্তিক)।
ফলাফল দেখে মনে হচ্ছে উন্নয়নটি সরলরেখায় ঘটেছিল। সমস্ত সংযুক্ত পরিবর্তনগুলি সমন্বিত একত্রিত প্রতিশ্রুতির পরিবর্তে মূল কমিট কাঠামোটি সংরক্ষণ করা হয়েছিল।
অবশেষে, আপনি কোনও অযাচিত এবং স্বয়ংক্রিয় উত্পন্ন কমিট ছাড়াই একটি পরিষ্কার শাখা শাখা- এ পাবেন।
দ্রষ্টব্য: দ্বারা দুর্দান্ত পোস্টটি নেওয়া হয়েছে git-tower
। অসুবিধেও এর rebase
একটি ভাল একই পোস্টে পড়া হয়।
মার্জ / রিবেস করার আগে:
A <- B <- C [master]
^
\
D <- E [branch]
পরে git merge master
:
A <- B <- C
^ ^
\ \
D <- E <- F
পরে git rebase master
:
A <- B <- C <- D' <- E'
(এ, বি, সি, ডি, ই এবং এফ কমিট হয়)
এই উদাহরণটি এবং গিট সম্পর্কিত আরও অনেক ভাল চিত্রিত তথ্য গিট দি বেসিকস টিউটোরিয়ালে পাওয়া যাবে ।
এই বাক্যটি এটি পায়:
সাধারণভাবে, উভয় বিশ্বের সেরা লাভের উপায় হ'ল আপনার স্থানীয় পরিবর্তনগুলি পুনর্বার করা, কিন্তু আপনার গল্পটি পরিষ্কার করার জন্য তাদের ধাক্কা দেওয়ার আগে এখনও ভাগ করে নেওয়া হয়নি, তবে আপনি কোথাও ঠেকানো কোনও কিছুর পুনরায় ক্ষতি করবেন না never ।
এই উত্তরটি গিট ফ্লোকে কেন্দ্র করে ব্যাপকভাবে কেন্দ্রিক । টেবিল চমৎকার দিয়ে তৈরি করা হয়েছে হওয়া ASCII ছক জেনারেটর , এবং এই বিস্ময়কর কমান্ড (সঙ্গে ইতিহাস গাছ ওরফে যেমন git lg
):
git log --graph --abbrev-commit --decorate --date=format:'%Y-%m-%d %H:%M:%S' --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%ad%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
ইতিহাসের গাছগুলির সাথে আরও সুসংগত হওয়ার জন্য টেবিলগুলি বিপরীত কালানুক্রমিক ক্রমে থাকে। প্রথম git merge
এবং git merge --no-ff
প্রথমটির মধ্যে পার্থক্যটিও দেখুন (আপনি সাধারণত git merge --no-ff
এটি ব্যবহার করতে চান কারণ এটি আপনার ইতিহাসকে বাস্তবের নিকটবর্তী করে তোলে):
git merge
আদেশগুলি:
Time Branch "develop" Branch "features/foo"
------- ------------------------------ -------------------------------
15:04 git merge features/foo
15:03 git commit -m "Third commit"
15:02 git commit -m "Second commit"
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* 142a74a - YYYY-MM-DD 15:03:00 (XX minutes ago) (HEAD -> develop, features/foo)
| Third commit - Christophe
* 00d848c - YYYY-MM-DD 15:02:00 (XX minutes ago)
| Second commit - Christophe
* 298e9c5 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git merge --no-ff
আদেশগুলি:
Time Branch "develop" Branch "features/foo"
------- -------------------------------- -------------------------------
15:04 git merge --no-ff features/foo
15:03 git commit -m "Third commit"
15:02 git commit -m "Second commit"
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* 1140d8c - YYYY-MM-DD 15:04:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/foo' - Christophe
| * 69f4a7a - YYYY-MM-DD 15:03:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 2973183 - YYYY-MM-DD 15:02:00 (XX minutes ago)
|/ Second commit - Christophe
* c173472 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git merge
বনাম git rebase
প্রথম পয়েন্ট: বৈশিষ্ট্যগুলি বিকাশে সর্বদা মার্জ করুন, বৈশিষ্ট্যগুলি থেকে কখনই বিকাশ পুনরায় করুন । এটি রিব্যাসিংয়ের সুবর্ণ নিয়মের একটি পরিণতি :
এর সুবর্ণ নিয়ম
git rebase
হ'ল এটি কখনই সর্বজনীন শাখায় ব্যবহার না করা ।
আপনি কোথাও ঠেলে দেওয়া কোনও জিনিসকে কখনই রিবাজ করবেন না।
আমি ব্যক্তিগতভাবে যুক্ত করব: যদি না এটি কোনও বৈশিষ্ট্য শাখা থাকে এবং আপনি এবং আপনার দল পরিণতি সম্পর্কে অবগত না হন ।
সুতরাং git merge
বনামের প্রশ্নটি git rebase
প্রায়শই কেবল বৈশিষ্ট্য শাখায় প্রযোজ্য (নিম্নলিখিত উদাহরণগুলিতে, --no-ff
মার্জ হওয়ার সময় সর্বদা ব্যবহৃত হয়ে থাকে)। মনে রাখবেন যেহেতু আমি নিশ্চিত নই যে এর থেকে আরও ভাল সমাধান ( বিতর্ক বিদ্যমান ), আমি কেবল উভয় আদেশই কীভাবে আচরণ করব তা সরবরাহ করব। আমার ক্ষেত্রে, আমি git rebase
এটি ব্যবহার করতে পছন্দ করি কারণ এটি একটি উত্তম ইতিহাস গাছ উত্পাদন করে :)
git merge
আদেশগুলি:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- --------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* c0a3b89 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 37e933e - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * eb5e657 - YYYY-MM-DD 15:07:00 (XX minutes ago)
| |\ Merge branch 'features/foo' into features/bar - Christophe
| * | 2e4086f - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | | Fifth commit - Christophe
| * | 31e3a60 - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | | Fourth commit - Christophe
* | | 98b439f - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ \ Merge branch 'features/foo' - Christophe
| |/ /
|/| /
| |/
| * 6579c9c - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 3f41d96 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* 14edc68 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git rebase
আদেশগুলি:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git rebase features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* 7a99663 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 708347a - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * 949ae73 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * 108b4c7 - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | Fourth commit - Christophe
* | 189de99 - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| |/
| * 26835a0 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * a61dd08 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* ae6f5fc - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
develop
একটি বৈশিষ্ট্য শাখায়git merge
আদেশগুলি:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git commit -m "Sixth commit"
15:08 git merge --no-ff develop
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* 9e6311a - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 3ce9128 - YYYY-MM-DD 15:09:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * d0cd244 - YYYY-MM-DD 15:08:00 (XX minutes ago)
| |\ Merge branch 'develop' into features/bar - Christophe
| |/
|/|
* | 5bd5f70 - YYYY-MM-DD 15:07:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| * | 4ef3853 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | | Third commit - Christophe
| * | 3227253 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ / Second commit - Christophe
| * b5543a2 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * 5e84b79 - YYYY-MM-DD 15:05:00 (XX minutes ago)
|/ Fourth commit - Christophe
* 2da6d8d - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git rebase
আদেশগুলি:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git commit -m "Sixth commit"
15:08 git rebase develop
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* b0f6752 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 621ad5b - YYYY-MM-DD 15:09:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * 9cb1a16 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * b8ddd19 - YYYY-MM-DD 15:05:00 (XX minutes ago)
|/ Fourth commit - Christophe
* 856433e - YYYY-MM-DD 15:07:00 (XX minutes ago)
|\ Merge branch 'features/foo' - Christophe
| * 694ac81 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 5fd94d3 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* d01d589 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git cherry-pick
যখন আপনার কেবল একটি নির্দিষ্ট প্রতিশ্রুতি প্রয়োজন, git cherry-pick
এটি একটি দুর্দান্ত সমাধান ( -x
বিকল্পটি একটি লাইন সংযোজন করে যা " (চেরিটি কমিট থেকে নেওয়া ...) " মূল কমিট বার্তার মূল অংশে যুক্ত করে, তাই এটি সাধারণত এটি ব্যবহার করা ভাল - git log <commit_sha1>
দেখুন এটা):
আদেশগুলি:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -----------------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git cherry-pick -x <second_commit_sha1>
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ফলাফল:
* 50839cd - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 0cda99f - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * f7d6c47 - YYYY-MM-DD 15:03:00 (XX minutes ago)
| | Second commit - Christophe
| * dd7d05a - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * d0d759b - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | Fourth commit - Christophe
* | 1a397c5 - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| |/
|/|
| * 0600a72 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * f4c127a - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* 0cf894c - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git pull --rebase
আমি নিশ্চিত না যে আমি ডেরেক গুরলেয়ের চেয়ে এটি আরও ভালভাবে ব্যাখ্যা করতে পারি ... মূলত এর git pull --rebase
পরিবর্তে ব্যবহার করুন git pull
:) নিবন্ধটিতে যা অনুপস্থিত রয়েছে তা হ'ল আপনি এটি ডিফল্টরূপে সক্ষম করতে পারবেন :
git config --global pull.rebase true
git rerere
আবার, সুন্দরভাবে এখানে ব্যাখ্যা । তবে সোজা কথায়, যদি আপনি এটি সক্ষম করে থাকেন তবে আপনাকে আর একাধিক বার একই দ্বন্দ্বের সমাধান করতে হবে না।
প্রো গীত বই সত্যিই একটি ভাল ব্যাখ্যা রয়েছে rebasing পৃষ্ঠা ।
মূলত মার্জ দুটি করে কমিট করে একত্রিত হবে।
একটি রিবেস দু'জনের সাধারণ পূর্বপুরুষের কাছে যাবে এবং ক্রমবর্ধমানভাবে একে অপরের উপরে পরিবর্তনগুলি প্রয়োগ করবে। এটি একটি 'ক্লিনার' এবং আরও রৈখিক ইতিহাস তৈরি করে।
তবে আপনি যখন রিবেস করেন, আপনি পূর্ববর্তী চুক্তিগুলি ছেড়ে দেন এবং একটি নতুন তৈরি করেন। সুতরাং আপনার সর্বজনীন যে কোনও সংগ্রহস্থল পুনরায় চালু করা উচিত নয়। ভান্ডারটিতে কাজ করা অন্যান্য ব্যক্তিরা আপনাকে ঘৃণা করবে।
একা একা আমি প্রায় একচেটিয়াভাবে মার্জ করি। আমার শাখাগুলির 99% সময় এতটা পৃথক হয় না, তাই যদি বিবাদ হয় তবে এটি কেবল এক বা দুটি জায়গায়।
ইতিহাস ক্লিনার এবং ভান্ডার কাঠামোর লিনিয়ার লিনিয়ারে শাখা পাথ তৈরি করতে গিট রিবেস ব্যবহার করা হয়।
এটি আপনার দ্বারা তৈরি শাখাগুলি ব্যক্তিগত রাখার জন্যও ব্যবহৃত হয়, যেমন সার্ভারে পরিবর্তনগুলি রিবিস করার পরে এবং চাপ দেওয়ার পরে, আপনি যদি আপনার শাখাটি মুছে ফেলেন তবে আপনি যে শাখায় কাজ করেছেন তার কোনও প্রমাণ থাকবে না। সুতরাং আপনার শাখা এখন আপনার স্থানীয় উদ্বেগ।
রিবেস করার পরে আমরা একটি অতিরিক্ত প্রতিশ্রুতি থেকে মুক্তি পেতে পারি যা আমরা দেখতাম যে আমরা একটি সাধারণ মার্জ করি কিনা।
এবং হ্যাঁ, একটি সফল পুনর্বাসনের পরে এখনও একীভূত হওয়া দরকার কারণ রিবেস কমান্ড কেবল আপনার কাজটি পুনর্বাসনের সময় উল্লিখিত শাখার উপরে রেখেছিল, মাস্টার বলুন এবং মাস্টার ব্রাঞ্চের প্রত্যক্ষ বংশধর হিসাবে আপনার শাখার প্রথম প্রতিশ্রুতিবদ্ধ করে তোলে । এর অর্থ আমরা এখন এই শাখা থেকে মাস্টার শাখায় পরিবর্তন আনতে দ্রুত ফরোয়ার্ড মার্জ করতে পারি।
কিছু বাস্তব উদাহরণ, কিছুটা বড় আকারের বিকাশের সাথে যুক্ত যেখানে জেরিট পর্যালোচনা এবং বিতরণ সংহতকরণের জন্য ব্যবহৃত হয়:
আমি যখন আমার বৈশিষ্ট্য শাখাটিকে নতুন কোন দূরবর্তী মাস্টারে উন্নীত করি তখন আমি মার্জ করি। এটি ন্যূনতম উত্সাহের কাজ দেয় এবং বৈশিষ্ট্য বিকাশের ইতিহাস অনুসরণ করা সহজ উদাহরণস্বরূপ গিটকে ।
git fetch
git checkout origin/my_feature
git merge origin/master
git commit
git push origin HEAD:refs/for/my_feature
আমি যখন ডেলিভারি কমিট প্রস্তুত করি তখন আমি মার্জ হয়ে যাই।
git fetch
git checkout origin/master
git merge --squash origin/my_feature
git commit
git push origin HEAD:refs/for/master
আমার বিতরণ প্রতিশ্রুতিবদ্ধ কারণে যে কোনও কারণেই ইন্টিগ্রেশন ব্যর্থ হলে আমি পুনঃব্যবস্থা করি এবং আমি তা নতুন রিমোট মাস্টারের দিকে আপডেট করতে হবে।
git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master
কি রিবেস এবং কোনটি মার্জ হয় তা বহুবার ব্যাখ্যা করা হয়েছিল, তবে কখন কী ব্যবহার করা উচিত?
আপনার কখন পুনরায় ব্যবহার করা উচিত?
যেমন গিট রিবেস ইতিহাস পরিবর্তন করে। সুতরাং অন্য কেউ একই শাখায় / যখন আপনি এটি ঠেলাঠেলি করে কাজ করছেন তখন আপনার এটি ব্যবহার করা উচিত নয়। তবে আপনার যদি স্থানীয় একটি শাখা থাকে তবে আপনি একটি ক্লিনার ইতিহাস বজায় রাখতে আপনার শাখাটিকে মাস্টারে ফেরত দেওয়ার আগে মার্জ রিবেস মাস্টার করতে পারেন। এটি করার পরে, মাস্টার শাখায় মার্জ হওয়ার পরে এটি দৃশ্যমান হবে না যে আপনি মাস্টার শাখায় একটি শাখা ব্যবহার করেছেন - ইতিহাসটি "পরিষ্কার" কারণ আপনার স্বয়ংক্রিয়ভাবে উত্পন্ন "মার্জড .." নেই, তবে এখনও রয়েছে স্বয়ংক্রিয়ভাবে "সংহত .." না করেই আপনার মাস্টার শাখায় সম্পূর্ণ ইতিহাস comm
তবে নিশ্চিত হয়ে নিন যে আপনি git merge feature-branch --ff-only
নিজের বৈশিষ্ট্যটি মূলদিকে ফিরে যাওয়ার সময় কোনও একক প্রতিশ্রুতি তৈরির কোনও দ্বন্দ্ব নেই তা নিশ্চিত করার জন্য ব্যবহার করেন use এটি আকর্ষণীয় যদি আপনি বৈশিষ্ট্য শাখার ইতিহাস পাওয়ার সাথে সাথে কাজ করেন এমন প্রতিটি কাজের জন্য বৈশিষ্ট্য শাখা ব্যবহার করছেন তবে "মার্জড .." অঙ্গীকার নয়
দ্বিতীয় দৃশ্যটি হ'ল, যদি আপনি কোনও শাখা থেকে শাখা করেন এবং প্রধান শাখায় কী পরিবর্তন হয়েছে তা জানতে চান। রেবেস আপনাকে তথ্য দেয় কারণ এতে প্রতিটি একক প্রতিশ্রুতি অন্তর্ভুক্ত থাকে।
আপনি কখন মার্জ ব্যবহার করবেন?
যখন আপনার মাস্টার ব্রাঞ্চে কোনও বৈশিষ্ট্য শাখার সমস্ত ইতিহাস প্রয়োজন বা আপনি চান না বা অন্যরা যদি একই শাখায় কাজ করছেন / আপনি এটিকে চাপ দিয়েছেন তখন। আপনি যদি এখনও ইতিহাস দেখতে চান তবে বৈশিষ্ট্য শাখাকে মাস্টার হিসাবে মার্জ করার আগে কেবল মাস্টারকে বৈশিষ্ট্য শাখায় মার্জ করুন। এর ফলে দ্রুত অগ্রগামী সংশ্লেষের ফলাফল ঘটবে যেখানে আপনার মাস্টারের বৈশিষ্ট্য শাখার ইতিহাস রয়েছে (আপনার বৈশিষ্ট্য শাখায় থাকা মার্জ কমিট সহ যেহেতু আপনি এতে মাস্টারকে একীভূত করেছেন)।
আমি কখন ব্যবহার করব git rebase
? প্রায় কখনও না, কারণ এটি ইতিহাস পুনর্লিখন করে। git merge
প্রায় সবসময়ই পছন্দনীয় পছন্দ, কারণ এটি আপনার প্রকল্পে যা ঘটেছিল তা সম্মান করে।