'গিট মার্জ' এবং 'গিট রিবেস' এর মধ্যে পার্থক্য কী?


499

মধ্যে পার্থক্য কি git mergeএবং git rebase?


14
যেহেতু আমার উত্তরটি মুছে ফেলা হয়েছে, এই প্রশ্নের সঠিক উত্তর পেতে এই লিঙ্কটিতে যান: git-scm.com/book/en/Git-Branching-
রিবেসিং#

6
যাইহোক আমি এই সাইটটি যুক্ত করব। গিট শিখার বিষয়ে আপনার যা কিছু জানা দরকার তা খেলে: pcocolate.github.io/learnGitBranching
রলিং

এটি প্রথমে পড়ুন: git-scm.com/book/en/v2/… তারপরে: git-scm.com/book/en/v2/Git-Branching- রিবেসিং আপনি সত্যই বুঝতে পারবেন।
লাইবার

উত্তর:


867

মূলত ধরুন সেখানে 3 করে ছিল, A, B, C:

অ আ ক খ

তারপরে বিকাশকারী ড্যান কমিট Dতৈরি করেছে এবং বিকাশকারী এড কমিট তৈরি করেছেন E:

ABCDE

স্পষ্টতই, এই বিরোধ কোনওভাবেই সমাধান করা উচিত। এর জন্য, 2 টি উপায় রয়েছে:

মার্জ :

ABCDEM

উভয় করে Dএবং Eএখনও এখানে, কিন্তু আমরা একত্রীকরণ তৈরি কমিট Mউভয় থেকে উত্তরাধিকারী পরিবর্তন Dএবং E। তবে এটি হীরা আকার তৈরি করে যা অনেক লোককে খুব বিভ্রান্ত মনে করে find

বাতিল :

ABCDER

আমরা প্রতিশ্রুতি তৈরি করি R, যা প্রকৃত ফাইল সামগ্রীটি Mউপরের মার্জ কমিটের অনুরূপ । তবে, আমরা প্রতিশ্রুতি থেকে মুক্তি পেয়েছি E, যেমন এর অস্তিত্ব কখনও নেই (বিন্দু দ্বারা চিহ্নিত - লাইন নষ্ট)। এই বিলুপ্তির কারণে, Eবিকাশকারী এডের স্থানীয় হওয়া উচিত এবং অন্য কোনও ভাণ্ডারে কখনও ঠেকানো উচিত হয়নি। পুনর্বাসনের সুবিধা হ'ল ডায়মন্ডের আকৃতি এড়ানো হয় এবং ইতিহাস দুর্দান্ত সরলরেখায় থাকে - বেশিরভাগ বিকাশকারীরা এটি পছন্দ করে!


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

> "তবে এটি হীরা আকার তৈরি করে যা অনেক লোককে খুব বিভ্রান্ত মনে করে find" উম ... বিস্তারিত বলতে পারবেন?
গ্রেগ ম্লেটিক

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

1
যদিও এই উত্তরটি অত্যন্ত সহায়ক, আপনি যদি স্থানীয়ভাবে পুনরুত্পাদন করার জন্য সরল foo.txt ফাইলগুলির সাথে প্রকৃত গিট কমান্ডগুলি যুক্ত করেন তবে এটি আরও ভাল। গত ব্যবহারকারী যেমনটি বলেছিলেন, কে রিবেস করছে তা স্পষ্ট নয়।
ঘূর্ণি

1
@ স্পেরেল: আমি মনে করি না আপনি এটি সঠিকভাবে পেয়েছেন। git mergeইন্টারলিভ কমিট করে না (তবে এটি দেখে তা প্রদর্শিত হতে পারে git log)। পরিবর্তে git mergeড্যান এবং এড উভয় বিকাশের ইতিহাস অক্ষত রাখে, কারণ এটি প্রতিটি দৃষ্টিকোণ থেকে একবারে দেখা গিয়েছিল। git rebaseএটিকে দেখে মনে হচ্ছে যে ড্যান এটিতে প্রথমে কাজ করেছিল এবং এড তাঁর অনুসরণ করেছিলেন। উভয় ক্ষেত্রে (একীভূত এবং পুনর্বাসনা), প্রকৃত ফলাফল ফাইল ট্রি একেবারে অভিন্ন।
এমভিপি

158

গিট সম্পর্কে আমি যে 10 টি জিনিসকে ঘৃণা করি তা থেকে আমি সত্যিই এই অংশটি ভালবাসি (এটি দ্বিতীয় উদাহরণে পুনর্বাসনের জন্য একটি সংক্ষিপ্ত ব্যাখ্যা দেয়):

3. ক্রিপি ডকুমেন্টেশন

মানুষ পেজ "*** আপনি চ" এক সর্বশক্তিমান হয় 1 । তারা কোনও কম্পিউটার বিজ্ঞানীর দৃষ্টিকোণ থেকে আদেশগুলি বর্ণনা করে, কোনও ব্যবহারকারী নয়। বিন্দু ক্ষেত্রে:

git-push – Update remote refs along with associated objects

মানুষের জন্য এখানে বর্ণনা রয়েছে:

git-push – Upload changes from your local repository into a remote repository

আপডেট করুন, অন্য একটি উদাহরণ: (ধন্যবাদ সিজিডি)

git-rebase – Forward-port local commits to the updated upstream head

অনুবাদ:

git-rebase – Sequentially regenerate a series of commits so they can be 
             applied directly to the head node

এবং তারপর আমাদের আছে

git-merge - Join two or more development histories together

যা একটি ভাল বর্ণনা।


1. মূলতে সেন্সর করা


সমস্যাটি ভাষা নয় বা ব্যবহারকারী কম্পিউটার বিজ্ঞানী কিনা তা নয়। এটি অন্য উপায়ে পুনরায় রেকর্ডিংয়ের প্রান্তগুলি (অর্থাত্ কী ঘটে) পরিষ্কার করতে সহায়তা করে, তবে এটি (কীভাবে এটি ঘটে) উপায়গুলি ব্যাখ্যা করতে ব্যর্থ হয়। গিটকে শেষগুলি বোঝার জন্য উপায়গুলি বোঝার প্রয়োজন। এটি স্পষ্টভাবে বোঝার উপায় যা গিটকে এতটা কঠিন করে তুলেছে। একটি সরঞ্জাম হিসাবে, কার্যের প্রয়োজনীয় প্রচেষ্টা সহজ বা কমাতে ব্যবহৃত কিছু, গিট ভয়াবহভাবে ব্যর্থ হয়। দুঃখের বিষয়, অনেকগুলি ডেভস এটি উপলব্ধি করতে ব্যর্থ হয়েছিল।
এটিএল_ডিইভি

128

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

কথায় এটি ব্যাখ্যা করতে:

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

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

আমি মনে করি মনে হয় এমন প্রোগ্রামারদের ব্লগ পোস্টগুলি পড়ে যারা কেবল রিবাজ ব্যবহার করে এবং অন্যরা কখনও রিবেস ব্যবহার করে না

উদাহরণ

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

Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md

এটি হল আপনার ডকুমেন্টেশন কমিটের মাঝখানে মার্জ এবং ইউআই কমিট করে।

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

Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger

আপনার সমস্ত কমিট শীর্ষে রয়েছে (নতুন) এবং তারপরে বাকী masterশাখাটি রয়েছে।

( অস্বীকৃতি: আমি "গিট সম্পর্কে ঘৃণা করি" 10 টি পোস্টের লেখক যা অন্য একটি উত্তরে উল্লেখ করা হয়েছে )


42

যদিও গৃহীত এবং সর্বাধিক উত্তোলিত উত্তর দুর্দান্ত, তবে আমি কেবলমাত্র শব্দ দ্বারা পার্থক্যটি ব্যাখ্যা করার চেষ্টা করে দরকারী:

একত্রিত করা

  • “ঠিক আছে, আমরা আমাদের সংগ্রহশালার দুটি পৃথকভাবে বিকশিত রাষ্ট্র পেয়েছি। আসুন তাদের একত্রিত করুন। দু'জন পিতা-মাতা, একজনই বাচ্চা ”'

রি-বেসের ফলে

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

সংক্ষিপ্তসার: সম্ভব হলে রিবেস প্রায় সবসময়ই ভাল is মূল শাখায় পুনরায় সংহত করা সহজ।

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


18

গিট রিবেস একীকরণের কাছাকাছি। রিবেসে পার্থক্য হ'ল:

  • স্থানীয় কমিটগুলি শাখা থেকে সাময়িকভাবে সরানো হয়।
  • গিট টান চালান
  • আপনার সমস্ত স্থানীয় কমিট পুনরায় sertোকান।

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


7

সহজ বুঝতে আমার চিত্র দেখতে পারেন।

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

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


0

আমি গিট রিবেস বনাম মার্জ সম্পর্কিত একটি আকর্ষণীয় নিবন্ধ পেয়েছি , এটি এখানে ভাগ করে নেওয়ার চিন্তাভাবনা করেছি

  • ইতিহাসটি যেমন ঘটেছিল ঠিক তেমন দেখতে চাইলে আপনার মার্জটি ব্যবহার করা উচিত। মার্জ ইতিহাস সংরক্ষণ করে যেখানে রিবেস এটি পুনরায় লিখে দেয়।
  • মার্জ করা আপনার ইতিহাসে একটি নতুন প্রতিশ্রুতি যুক্ত করে
  • জটিল ইতিহাসকে প্রবাহিত করার জন্য রিবেসিং ভাল, আপনি ইন্টারেক্টিভ রিবেস দ্বারা প্রতিশ্রুতিবদ্ধ ইতিহাস পরিবর্তন করতে সক্ষম হন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.