গিট-এ, মার্জ - স্কোয়াশ এবং রিবেসের মধ্যে পার্থক্য কী?


363

আমি গিটে নতুন এবং আমি স্কোয়াশ এবং একটি রিবেসের মধ্যে পার্থক্য বোঝার চেষ্টা করছি। আমি এটি বুঝতে পারি যে আপনি রিবেস করার সময় স্কোয়াশ সম্পাদন করেন।

উত্তর:


360

উভয় git merge --squashএবং git rebase --interactiveএকটি "স্কোয়াশেড" প্রতিশ্রুতি উত্পাদন করতে পারে।
তবে তারা বিভিন্ন উদ্দেশ্যে পরিবেশন করে।

কোনও সংযুক্তির সম্পর্ক চিহ্নিত না করে গন্তব্য শাখায় স্কোয়াশেড কমিট তৈরি করবে।
(দ্রষ্টব্য: এটি এখনই কোনও প্রতিশ্রুতি তৈরি করে না: আপনার অতিরিক্ত প্রয়োজন git commit -m "squash branch")
আপনি যদি উত্স শাখাটি পুরোপুরি ফেলে দিতে চান তবে এটি কার্যকর হয় ( এসও প্রশ্ন থেকে নেওয়া স্কিমা ):

 git checkout stable

      X                   stable
     /                   
a---b---c---d---e---f---g tmp

প্রতি:

git merge --squash tmp
git commit -m "squash tmp"

      X-------------------G stable
     /                   
a---b---c---d---e---f---g tmp

এবং তারপরে tmpশাখা মুছে ফেলা হচ্ছে ।


দ্রষ্টব্য: git mergeএকটি --commitবিকল্প রয়েছে , তবে এটি ব্যবহার করা যাবে না --squash। এটি ব্যবহার এবং একসাথে কখনও সম্ভব ছিল না । গিট 2.22.1 (Q3 2019) থেকে, এই অসম্পূর্ণতাটি স্পষ্ট করে দেওয়া হয়েছে:--commit--squash

দেখুন 1d14d0c কমিট দ্বারা (24 মে 2019) বিশাল ভার্মা ( reloadbrain)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 33f2790 , 25 জুলাই 2019)

merge: প্রত্যাখ্যান --commitসঙ্গে--squash

পূর্বে, --squashসরবরাহ করা হলে , ' option_commit' নীরবে বাদ দেওয়া হত। এটি এমন একজন ব্যবহারকারীকে অবাক করে দিতে পারে যারা স্পষ্টতভাবে স্কোয়াশের অ-প্রতিশ্রুতিবদ্ধ আচরণকে ওভাররাইড করার চেষ্টা করেছিল --commit

git/git builtin/merge.c#cmd_merge() এখন অন্তর্ভুক্ত:

if (option_commit > 0)
    die(_("You cannot combine --squash with --commit."));

আপনার কিছু বা সমস্ত প্রতিশ্রুতি নতুন বেসে রিপ্লে করে, আপনাকে স্কোয়াশ করার অনুমতি দেয় (বা আরও সম্প্রতি "ঠিক করা", এই SO প্রশ্নটি দেখুন ), সরাসরি এখানে যান:

git checkout tmp
git rebase -i stable

      stable
      X-------------------G tmp
     /                     
a---b

যদি আপনি সমস্ত কমিটের স্কোয়াশ বেছে নিতে চান tmp(তবে এর বিপরীতে আপনি merge --squashকিছু পুনরায় খেলতে এবং অন্যকে স্কোয়াশ করতে পারেন)।

সুতরাং পার্থক্যগুলি হ'ল:

  • squashআপনার উত্স শাখা স্পর্শ করে না ( tmpএখানে) এবং আপনি যেখানে চান একটি একক প্রতিশ্রুতি তৈরি করে।
  • rebaseআপনাকে একই উত্স শাখায় যেতে (এখনও tmp) এর সাথে অনুমতি দেয়:
    • একটি নতুন বেস
    • একটি ক্লিনার ইতিহাস

11
Gহয় c--d--e--f--gএকসঙ্গে squashed?
ওয়েন কনরাড

8
@ ওয়াইন: হ্যাঁ, জি এই উদাহরণগুলিতে tmpএকসাথে স্কোয়াশড কমিটিকে উপস্থাপন করে।
ভোনসি

3
@ থ 4 ডব্লিউএন: যেহেতু সমস্ত প্রকল্পের স্ন্যাপশটগুলির সাথে গিট কারণগুলি , এর ফলে পরিবর্তিত পরিবর্তনের কারণে Gএকই বিষয়বস্তুর প্রতিনিধিত্ব করবে না । gX
ভোনসি

1
@ ভনসি: শেষ মন্তব্যটি সম্পর্কে নিশ্চিত নন। এর git merge --no-ff tempপরিবর্তে যদি আপনার কাছে থাকে git merge --squash tempতবে আপনি একটি মেসির ইতিহাস পেয়ে যাবেন তবে আপনি খুব git revert eসহজেই এর মতো জিনিসও করতে পারেন। এটি একটি অগোছালো তবে সত্যবাদী এবং বাস্তববাদী ইতিহাস এবং মূল শাখাটি এখনও মোটামুটি পরিষ্কার remains
nnot101

2
@ naught101 আমি সম্মত যদিও স্ট্যাকওভারফ্লো . com/a/7425751/6309-তে ব্যাখ্যা করা হয়েছে , এটি ভাঙ্গা না করা git bisectবা git blameখুব বেশি বেশি ব্যবহৃত হওয়ার সময়ও রয়েছে (যেমন git pull --no-ff: স্ট্যাকওভারফ্লো / সেকশনস / 12798767/… )। সেখানে এক পদ্ধতির যাহাই হউক না কেন, যার কারণে এই নিবন্ধটি বর্ণনা তিনটি (হয় stackoverflow.com/questions/9107861/... )
VonC

183

মার্জ কমিটস: আপনার ব্রাঞ্চের সমস্ত কমিটকে ধরে রাখে এবং বেস শাখায় কমিট দিয়ে তাদেরকে ইন্টারলিভ করেএখানে চিত্র বর্ণনা লিখুন

স্কোয়াশকে মার্জ করুন: পরিবর্তনগুলি ধরে রাখে তবে ইতিহাস থেকে স্বতন্ত্র কমিট বাদ দেয় এখানে চিত্র বর্ণনা লিখুন

রিবেস: এটি পুরো বৈশিষ্ট্য শাখাকে মাস্টার শাখার ডগায় শুরু করতে প্রেরণা করে, কার্যকরভাবে নতুন সমস্ত কমিটকে মাস্টারে অন্তর্ভুক্ত করে

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

আরও এখানে


81

মার্জ স্কোয়াশ একটি বৃক্ষকে (একত্রিত করার ক্রম) একক প্রতিশ্রুতিতে মার্জ করে। এটি হ'ল এটি এন-এ করা সমস্ত পরিবর্তনকে একক প্রতিশ্রুতিতে স্কোয়াশ করে।

রিবেসিং হ'ল রি-বেসিং, অর্থাত্ একটি গাছের জন্য একটি নতুন বেস (প্যারেন্ট কমিট) বেছে নেওয়া। হতে পারে এর জন্য পারদর্শী শব্দটি আরও স্পষ্ট: তারা এটিকে ট্রান্সপ্ল্যান্ট বলে কারণ এটি কেবলমাত্র: গাছের জন্য একটি নতুন স্থল (পিতামাতার প্রতিশ্রুতিবদ্ধ, মূল) বাছাই করা।

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

আশা করি তা পরিষ্কার ছিল!


7
আমার কখন রিবেস করা উচিত এবং কখন আমার স্কোয়াশ করা উচিত?
মার্টিন থোমা

31

নীচের উদাহরণ দিয়ে শুরু করা যাক:

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

এখন আমরা এর পরিবর্তনগুলি মার্জ 3 অপশন আছে বৈশিষ্ট্য শাখা মধ্যে মাস্টার শাখা :

  1. মার্জ কমিটগুলি বৈশিষ্ট্য শাখার
    সমস্ত কমিটের ইতিহাস রাখে এবং এটিকে মাস্টার শাখায় স্থানান্তরিত করে অতিরিক্ত ডমি অঙ্গীকার যুক্ত করবে।

  2. রিবেস এবং সংযুক্তি মাস্টার শাখার সামনের ফিচার শাখার
    সমস্ত সম্পাদনের ইতিহাস যুক্ত করবে অতিরিক্ত ডমি কমিট যুক্ত করবে না।

  3. স্কোয়াশ এবং একত্রিত
    উইল সমস্ত বৈশিষ্ট্য শাখা একটি কমান্ট মধ্যে প্রতিশ্রুতিবদ্ধ তারপর মাস্টার শাখার সামনে এটি যুক্ত
    করুন অতিরিক্ত ডমি অঙ্গীকার যুক্ত করবে।

আপনি নীচের দিকে দেখতে পারেন যে কীভাবে মাস্টার শাখা তাদের প্রত্যেকটির যত্ন নেবে ।

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

সব ক্ষেত্রে:
আমরা বৈশিষ্ট্য শাখাটি নিরাপদে মুছে ফেলতে পারি ।


1
২ য় ছবিতে ডামি কমিট কি বোঝাতে পারবেন ?? আমি গিট মধ্যে একটি শিক্ষানবিস।
ইউসুফ

1
@ ইউসুফ, এটি কেবল একটি অতিরিক্ত প্রতিশ্রুতি যা উভয় শাখার আপডেট রয়েছে, এটি ডিফল্ট প্রতিশ্রুতি বার্তা = "মেগ্রে শাখা এক্সওয়াইজেডকে মাস্টারে পরিণত করুন"
আহমেদনাবিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.