কীভাবে এবং / বা কেন গিটে এসভিএন-এর চেয়ে ভাল মার্জ করা হচ্ছে?


400

আমি কয়েকটি জায়গায় শুনেছি যে বিতরণকৃত সংস্করণ নিয়ন্ত্রণ ব্যবস্থা জ্বলজ্বল করার অন্যতম প্রধান কারণ এসভিএন এর মতো traditionalতিহ্যবাহী সরঞ্জামগুলির তুলনায় আরও ভাল মার্জিন। এটি আসলে দুটি সিস্টেম কীভাবে কাজ করে তার মধ্যে সহজাত পার্থক্যের কারণে, বা গিট / মার্কিউরিয়াল এর মতো নির্দিষ্ট ডিভিসিএস বাস্তবায়নগুলি কেবল এসভিএন এর চেয়ে ক্লিভের মার্জ আলগোরিদিমগুলিতে করে?


আমি এখনও এখানে দুর্দান্ত উত্তরগুলি পড়ে সম্পূর্ণ উত্তর পাইনি। পুনরায় পোস্ট - stackoverflow.com/questions/6172037/...
ripper234


এটি আপনার মডেলের উপর নির্ভর করে। সহজ ক্ষেত্রে, এসএনএন প্রায়শই ভাল হয় কারণ এটি দুর্ঘটনাবশত 2-উপায় সংযুক্তিকে কল করে না 3-উপায় মার্জগুলি যেমন গিটটি করতে পারে যদি আপনি একক উন্নয়ন শাখায় চাপ / মার্জ / টান / ধাক্কা দিতে পারেন। দেখুন: svnvsgit.com
এরিক অ্যারোনস্টি

উত্তর:


556

সাবভার্সনের চেয়ে ডিভিসিএসে কেন মার্জ করা ভাল তা দাবী করা মূলত কিছুকাল আগে সাবভার্সনে শাখা এবং মার্জ কীভাবে কাজ করেছিল তার উপর ভিত্তি করে ছিল। ১.০.০ এর পূর্বে সাববর্তন কখন শাখাগুলি মার্জ হয়েছিল সে সম্পর্কে কোনও তথ্য সংরক্ষণ করে না, সুতরাং আপনি যখন মার্জ করতে চেয়েছিলেন তখন আপনাকে সংশোধন করতে হবে যে সংশোধনগুলির রেঞ্জটি নির্দিষ্ট করতে হবে।

তাহলে সাবভার্সন কেন স্তন্যপান করল ?

এই উদাহরণটি বিবেচনা করুন:

      1   2   4     6     8
trunk o-->o-->o---->o---->o
       \
        \   3     5     7
b1       +->o---->o---->o

যখন আমরা বি 1-র পরিবর্তনগুলি ট্রাঙ্কে একত্রীকরণ করতে চাই তখন ট্রাঙ্কযুক্ত একটি ফোল্ডারে দাঁড়িয়ে আমরা নিম্নলিখিত কমান্ডটি প্রদান করব:

svn merge -r 2:7 {link to branch b1}

… যা b1আপনার স্থানীয় ওয়ার্কিং ডিরেক্টরিতে পরিবর্তনগুলি মার্জ করার চেষ্টা করবে । এবং তারপরে আপনি কোনও বিবাদ সমাধানের পরে ফলাফলটি পরীক্ষা করার পরে আপনি পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ। আপনি যখন পুনর্বিবেচনা ট্রিটি দেখতে পাবেন তখন এটি দেখতে পাবেন:

      1   2   4     6     8   9
trunk o-->o-->o---->o---->o-->o      "the merge commit is at r9"
       \
        \   3     5     7
b1       +->o---->o---->o

তবে সংস্করণ গাছ বৃদ্ধি পাওয়ার সাথে সাথে সংস্করণগুলি নির্দিষ্ট করার এই উপায়টি খুব শীঘ্রই হাতছাড়া হয়ে যায় কারণ কখন এবং কী সংশোধনীগুলি একত্রিত হয়ে যায় সে সম্পর্কে কোনও মেটা ডেটা না থাকায় সংস্করণ গাছ বৃদ্ধি পায়। পরে কী ঘটবে তা চিন্তা করুন:

           12        14
trunk  …-->o-------->o
                                     "Okay, so when did we merge last time?"
              13        15
b1     …----->o-------->o

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

এই সাবভারশনটি প্রশমিত করার জন্য এখন শাখার জন্য মেটা ডেটা সঞ্চয় করে মার্জ করে। যে সব সমস্যার ঠিক সমাধান করতে হবে?

এবং ওহ, যাইহোক, সাবভারশন এখনও চুষে ...

কেন্দ্রীভূত সিস্টেমে, সাবভার্সনের মতো ভার্চুয়াল ডিরেক্টরিগুলি স্তন্যপান করে। কেন? কারণ প্রত্যেকেরই এগুলি দেখার জন্য অ্যাক্সেস রয়েছে ... এমনকি আবর্জনা পরীক্ষামূলক। আপনি পরীক্ষা করতে চান তবে ব্রাঞ্চিং ভাল তবে আপনি প্রত্যেকে দেখতে চান না 'এবং তাদের মাসিদের পরীক্ষা করা । এটি মারাত্মক জ্ঞানীয় শব্দ। আপনি যত বেশি শাখা যুক্ত করবেন, ততই ক্র্যাপগুলি দেখতে পাবেন।

আপনার ভাণ্ডারগুলিতে যত বেশি পাবলিক শাখা রয়েছে তা সমস্ত বিভিন্ন শাখার ট্র্যাক রাখা তত কঠিন। সুতরাং আপনার কাছে প্রশ্নটি থাকবে যদি শাখাটি এখনও বিকাশে রয়েছে বা এটি সত্যিই মারা গেছে যা কোনও কেন্দ্রীভূত সংস্করণ নিয়ন্ত্রণ ব্যবস্থায় বলা মুশকিল।

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

তাহলে ডিভিসিএস, যেমন গিট, মার্কিউরিয়াল এবং বাজার, শাখা এবং মার্জ করার সময়ে সাবভার্সনের চেয়ে কেন ভাল?

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

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

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

মার্জ করার একটি খুব সাধারণ উদাহরণ এটি হবে; কল করা একটি কেন্দ্রীয় ভান্ডার originএবং তার ব্যবহারকারী, এলিস তার যন্ত্রটিতে ক্লোনিং করে imagine

         a…   b…   c…
origin   o<---o<---o
                   ^master
         |
         | clone
         v

         a…   b…   c…
alice    o<---o<---o
                   ^master
                   ^origin/master

ক্লোন চলাকালীন যা ঘটে তা হ'ল প্রতিটি সংশোধন অ্যালিসে ঠিক তেমনভাবে অনুলিপি করা হয় (যা অনন্যরূপে সনাক্তযোগ্য হ্যাশ-আইডি দ্বারা যাচাই করা হয়), এবং যেখানে মূলটির শাখা রয়েছে তা চিহ্নিত করে।

তারপরে অ্যালিস তার রেপোতে কাজ করে তার নিজের ভাণ্ডারে প্রতিশ্রুতিবদ্ধ এবং তার পরিবর্তনগুলি ধাক্কা দেওয়ার সিদ্ধান্ত নেয়:

         a…   b…   c…
origin   o<---o<---o
                   ^ master

              "what'll happen after a push?"


         a…   b…   c…   d…   e…
alice    o<---o<---o<---o<---o
                             ^master
                   ^origin/master

সমাধানটি সহজ সরল, কেবলমাত্র originरिपাইজরিটি যা করতে হবে তা হল সমস্ত নতুন সংশোধনী গ্রহণ করা এবং এর শাখাকে সর্বাধিক সংশোধনীর দিকে নিয়ে যাওয়া (যা গিটকে "দ্রুত-এগিয়ে" বলে):

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

         a…   b…   c…   d…   e…
alice    o<---o<---o<---o<---o
                             ^master
                             ^origin/master

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

সুতরাং আপনি কীভাবে আমাকে এমন উদাহরণ দেখান যাতে সত্যিকারের একত্রীকরণ আছে?

স্বীকারোক্তিভাবে উপরের উদাহরণটি একটি খুব সাধারণ ব্যবহারের ক্ষেত্রে, তাই আরও সাধারণ একটি হলেও অনেক বেশি বাঁকানো যাক। মনে আছে originতিনটি সংশোধন দিয়ে শুরু হয়েছে? ঠিক আছে, যে লোকটি সেগুলি করেছিল, তাকে বব বলে , সে তার নিজের উপর কাজ করছে এবং তার নিজের ভাণ্ডারে প্রতিশ্রুতিবদ্ধ করেছে:

         a…   b…   c…   f…
bob      o<---o<---o<---o
                        ^ master
                   ^ origin/master

                   "can Bob push his changes?" 

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

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

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

                        v master
         a…   b…   c…   f…
bob      o<---o<---o<---o
                   ^
                   |    d…   e…
                   +----o<---o
                             ^ origin/master

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

টান প্রক্রিয়াটির দ্বিতীয় ধাপটি হ'ল ডাইভারিং টিপসগুলিকে একীভূত করা এবং ফলাফলটির প্রতিশ্রুতিবদ্ধ:

                                 v master
         a…   b…   c…   f…       1…
bob      o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                   +----o<---o<--+
                             ^ origin/master

আশা রাখি, একত্রীকরণ (যদি আপনি তাদের কহা আপনি নিজে সঙ্গে Git মধ্যে দুই ধাপ কি করতে পারেন দ্বন্দ্ব মধ্যে চলবে না fetchএবং merge)। পরবর্তীতে যা করা দরকার তা হ'ল সেই পরিবর্তনগুলিকে আবারও ঠেলে দেওয়া origin, যা মার্জ কমান্ড originরিপোজিটরিতে সর্বশেষের সরাসরি বংশধর হওয়ায় দ্রুত ফরোয়ার্ড সংশ্লেষে পরিণত হবে :

                                 v origin/master
                                 v master
         a…   b…   c…   f…       1…
bob      o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                   +----o<---o<--+

                                 v master
         a…   b…   c…   f…       1…
origin   o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                   +----o<---o<--+

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

পাঠকের অনুশীলন হিসাবে, এটি যুক্ত অন্য ব্যবহারকারীর সাথে কীভাবে কার্যকর হবে তা আঁকার চেষ্টা করুন। এটি একইভাবে ববকে উপরের উদাহরণ হিসাবে করা হয়েছে। আপনি যা ভাবেন তার চেয়ে বেশি সংগ্রহস্থলের মধ্যে মার্জ করা সহজ কারণ সমস্ত সংশোধন / কমিটি স্বতন্ত্রভাবে চিহ্নিতযোগ্য।

প্রতিটি বিকাশকারীদের মধ্যে প্যাচগুলি প্রেরণের বিষয়টিও রয়েছে, এটি সাবভার্সনে একটি বিশাল সমস্যা ছিল যা স্বতন্ত্ররূপে চিহ্নিতযোগ্য সংশোধনগুলির দ্বারা গিট, এইচজি এবং বিজেআর-র মাধ্যমে প্রশমিত হয়। একবার তার পরিবর্তনগুলি মার্জ হয়ে গেলে (যেমন একটি মার্জ কমিট তৈরি করা হয়েছে) এবং এটি দলের অন্য সবার জন্য এটি কেন্দ্রীয় ভান্ডারটিতে চাপ দিয়ে বা প্যাচগুলি প্রেরণ করার জন্য পাঠিয়ে দেয় তবে তাদের মার্জ সম্পর্কে চিন্তা করতে হবে না, কারণ এটি ইতিমধ্যে ঘটেছে because । মার্টিন জালিয়া কাজ করার এই ভাবে ডাকে এলোমেলো ইন্টিগ্রেশন

কাঠামো সাবভারশন থেকে আলাদা, পরিবর্তে একটি ডিএজি নিযুক্ত করে, এটি শাখা প্রশাখা এবং মার্জিংকে কেবল সিস্টেমের জন্য নয় কেবল ব্যবহারকারীর জন্যও একটি সহজ পদ্ধতিতে সক্ষম করে তোলে ables


6
আমি আপনার শাখাগুলি == গোলমাল যুক্তির সাথে একমত নই। প্রচুর শাখাগুলি মানুষকে বিভ্রান্ত করে না কারণ লিড দেব লোকদের জানান যে কোন শাখাটি বড় বৈশিষ্ট্যগুলির জন্য ব্যবহার করা উচিত ... সুতরাং দুটি ডিভগুলি শাখা এক্সতে "উড়ন্ত ডাইনোসর" যুক্ত করতে কাজ করতে পারে, 3 ওয়াইতে কাজ করতে পারে "আপনাকে ফেলে দিতে দেবে" লোকদের গাড়ি "
মিঃ বয়

16
জন: হ্যাঁ, সংখ্যক শাখাগুলির জন্য খুব কম শব্দ হয় এবং এটি পরিচালনাযোগ্য। তবে আপনি 50+ শাখা এবং ট্যাগগুলি দেখেছেন বা এমন কি বিবর্তন বা পরিষ্কার ক্ষেত্রে দেখা গেছে যেখানে তাদের বেশিরভাগ তারা সক্রিয় আছেন কিনা তা আপনি বলতে পারবেন না। একপাশে সরঞ্জামগুলি থেকে ব্যবহারের ইস্যু; কেন আপনার ভাণ্ডারে চারপাশে সমস্ত জঞ্জাল আছে? কমপক্ষে পি 4-তে (যেহেতু একজন ব্যবহারকারীর "ওয়ার্কস্পেস" মূলত প্রতি ব্যবহারকারী শাখা), গিট বা এইচজি আপনি বিকল্পগুলি পেয়েছেন যতক্ষণ না আপনি সেগুলিকে উপরে প্রবাহিত না করা পর্যন্ত আপনার করা পরিবর্তনগুলি সম্পর্কে অবহিত করবেন যা নিরাপদ- পরিবর্তনগুলি যখন অন্যদের সাথে প্রাসঙ্গিক হয় তখন নজর রাখুন।
Spoike

24
আমি আপনার "অত্যধিক পরীক্ষামূলক শাখাগুলি শোনার আর্গুমেন্ট হয় না, @ স্পাইকে পাই না We আমাদের কাছে একটি" ব্যবহারকারী "ফোল্ডার রয়েছে যেখানে প্রতিটি ব্যবহারকারীর নিজস্ব ফোল্ডার থাকে There সেখানে তিনি যতবার ইচ্ছা তার শাখা করতে পারেন Sub শাখাগুলি সাবভারশনে সস্তা এবং যদি আপনি অন্য ব্যবহারকারীর ফোল্ডারগুলিকে অগ্রাহ্য করেন (তবে তাদের কেন আপনার যত্ন নেওয়া উচিত) তবে আপনি শব্দ শুনতে পাচ্ছেন না But তবে আমার পক্ষে এসভিএনে মার্জ করা চুষে না (এবং আমি প্রায়শই এটি করি এবং না, এটি কোনও ছোট নয়) প্রকল্প)। সুতরাং সম্ভবত আমি কিছু ভুল করেছি;) তবুও গিট এবং মার্কুরিয়াল একত্রীকরণ সর্বোত্তম এবং আপনি এটিকে সুন্দরভাবে উল্লেখ করেছেন
জন স্মিথার

11
নিষ্ক্রিয় শাখাগুলি মেরে এসএনএন-তে সহজ, আপনি কেবল এগুলি মুছুন। মানুষ যেহেতু অব্যবহৃত শাখাগুলি অপসারণ না করে তাই বিশৃঙ্খলা তৈরি করা এই বিষয়টি কেবল গৃহকর্মের বিষয়। আপনি গিটের পাশাপাশি প্রচুর অস্থায়ী শাখাগুলিও সহজেই সরিয়ে ফেলতে পারেন। আমার কর্মক্ষেত্রে আমরা স্ট্যান্ডার্ডগুলি ছাড়াও একটি "টেম্প-শাখা" শীর্ষ স্তরের ডিরেক্টরি ব্যবহার করি - ব্যক্তিগত শাখা এবং পরীক্ষামূলক শাখাগুলি যেখানে শাখাগুলি ডিরেক্টরিতে "অফিসিয়াল" লাইন রাখা হয় সেখানে বিশৃঙ্খলা না করে সেখানে যায় (আমরা না বৈশিষ্ট্য শাখা ব্যবহার করুন)।
কেন লিউ

10
তার মানে কি তখন, v1.5 বিপর্যয় থেকে কমপক্ষে একত্রে পাশাপাশি গিট ক্যানও পারে?
স্যাম

29

.তিহাসিকভাবে, সাবভার্সন কেবল একটি সরল দ্বি-মুখী মার্জ সম্পাদন করতে সক্ষম হয়েছে কারণ এটি কোনও মার্জ তথ্য সংরক্ষণ করে না। এর মধ্যে কয়েকটি সেট পরিবর্তন করা এবং সেগুলি গাছে প্রয়োগ করা জড়িত। এমনকি মার্জ তথ্য সহ, এটি এখনও সর্বাধিক ব্যবহৃত ব্যবহৃত মার্জ কৌশল।

গিটটিতে ডিফল্টরূপে 3-উপায় সংহত অ্যালগরিদম ব্যবহার করা হয়, যার মধ্যে একত্রিত হওয়া মাথাগুলির মধ্যে একটি সাধারণ পূর্বপুরুষের সন্ধান এবং মার্জটির উভয় পক্ষের উপস্থিত জ্ঞানকে ব্যবহার করা জড়িত। এটি গিটকে দ্বন্দ্ব এড়ানোর ক্ষেত্রে আরও বুদ্ধিমান হতে দেয়।

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


4
আপনার কি এমন উদাহরণ আছে যে এসএনএন সংঘাত বিভক্ত করেছে তবে গিট দেয় না?
Gqqnbig

17

সহজভাবে বললে একত্রীকরণ বাস্তবায়ন ভালো সম্পন্ন করা হয় গীত তুলনায় SVN । 1.5 এর আগে এসভিএন কোনও মার্জ অ্যাকশন রেকর্ড করে না, সুতরাং ব্যবহারকারীর সাহায্য ছাড়াই ভবিষ্যতে সংহতগুলি করতে অক্ষম ছিল যা এসভিএন রেকর্ড করে না এমন তথ্য সরবরাহ করা প্রয়োজন। 1.5 এর সাথে এটি আরও ভাল হয়ে গেছে, এবং সত্যই এসভিএন স্টোরেজ মডেল গিটের ডিএজি থেকে কিছুটা বেশি সক্ষম। তবে এসভিএন একত্রিত আকারে মার্জ তথ্য সংরক্ষণ করেছে যা গিটের চেয়ে মার্জগুলিকে ব্যাপকভাবে আরও বেশি সময় নিতে দেয় - আমি মৃত্যুদন্ড কার্যকর করার সময়টিতে 300 এর কারণগুলি পর্যবেক্ষণ করেছি।

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

অন্যদিকে, গিট এমনকি নামগুলিও ট্র্যাক করে না তবে এটিকে সত্যিকারের পরে (মার্জ করার সময়) সনাক্ত করে এবং এগুলি দুর্দান্ত যাদুতে করে।

এসভিএন মার্জ উপস্থাপনারও সমস্যা রয়েছে; 1.5 / 1.6 এ আপনি ট্রাঙ্ক থেকে শাখায় প্রায়শই পছন্দ মতো, স্বয়ংক্রিয়ভাবে মার্জ হয়ে যেতে পারেন, তবে অন্য দিকের সাথে একত্রীকরণের ঘোষণা দেওয়ার দরকার ছিল ( --reintegrate) এবং শাখাটি একটি অকেজো অবস্থায় ফেলে রেখেছিলেন। অনেক পরে তারা খুঁজে পাওয়া যায় নি যে এটি আসলে ঘটনা না, এবং যে ক) --reintegrate করতে স্বয়ংক্রিয়ভাবে মূর্ত আউট হবে, এবং খ) পুনরাবৃত্তি উভয় নির্দেশাবলী মধ্যে মার্জ সম্ভব।

তবে এত কিছুর পরেও (যা আইএমএইচও তারা কী করছে তা বোঝার অভাব দেখায়), আমি হব (ঠিক আছে, আমি) কোনও অনাকাঙ্ক্ষিত ব্রাঞ্চিং দৃশ্যে এসভিএন ব্যবহার করার জন্য খুব সতর্কতা অবলম্বন করেছি এবং গিট কী ভাবছেন তা আদর্শভাবে দেখার চেষ্টা করবে মার্জ ফলাফল।

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

সংক্ষেপে: গিট এসভিএন এর তুলনায় সংশোধনগুলি সংরক্ষণ করার জন্য অনেক সহজ ডেটা মডেল ব্যবহার করে এবং সুতরাং এটি প্রতিনিধিত্বকে => কার্যকরীভাবে আরও ভাল মার্জ করার পরিবর্তে প্রকৃত মার্জ অ্যালগরিদমগুলিতে প্রচুর শক্তি প্রয়োগ করতে পারে।


11

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

তবে, সম্ভবত এটি কেবল সেই লোকদের পক্ষে যারা পৃথক শাখাগুলি ব্যবহার করার জন্য খুব বোকা তাদের পক্ষে কেবল (যদি আমি সঠিকভাবে মনে করি তবে আমাদের কেবলমাত্র একটি শাখা ছিল যেখানে আমি এসভিএন ব্যবহার করেছি সেই সংস্থায় ফিরে বিকাশের জন্য ব্যবহৃত হয়েছিল)।


10

সম্পাদনা: এটি প্রাথমিকভাবে প্রশ্নের এই অংশটিকে সম্বোধন করছে: এটি
আসলে দুটি সিস্টেম কীভাবে কাজ করে তার মধ্যে অন্তর্নিহিত পার্থক্যের কারণে, বা গিট / মার্চুরিয়ালের মতো নির্দিষ্ট ডিভিসিএস বাস্তবায়নগুলি কেবল এসভিএন এর চেয়ে ক্লিভের মার্জ অ্যালগরিদমগুলিতে করে?
টিএল; ডিআর - এই নির্দিষ্ট সরঞ্জামগুলিতে আরও ভাল অ্যালগরিদম রয়েছে। বিতরণ করাতে কিছু কর্মপ্রবাহ সুবিধা রয়েছে তবে মার্জিং সুবিধাগুলির ক্ষেত্রে এটি অরথোগোনাল।
শেষ সম্পাদনা

আমি গৃহীত উত্তরটি পড়েছি। এটা ঠিক সরল ভুল।

এসভিএন মার্জ করা একটি ব্যথা হতে পারে এবং এটি জটিলও হতে পারে। তবে, এটি কীভাবে আসলে এক মিনিটের জন্য কাজ করে তা উপেক্ষা করুন। গিট রাখে বা প্রাপ্ত করতে পারে এমন কোনও তথ্য নেই যা এসভিএন রাখে না বা অর্জন করতে পারে। আরও গুরুত্বপূর্ণ, ভার্সন নিয়ন্ত্রণ সিস্টেমের আলাদা (কখনও কখনও আংশিক) অনুলিপি রাখার কোনও কারণ নেই যা আপনাকে আরও প্রকৃত তথ্য সরবরাহ করবে provide দুটি কাঠামো সম্পূর্ণ সমতুল্য।

ধরে নিন আপনি "কিছু চালাক জিনিস" করতে চান গিটটি "আরও ভাল" " এবং আপনি জিনিস এসভিএন মধ্যে চেক করা হয়।

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

দিন শেষে, যে কোনও সংস্করণ নিয়ন্ত্রণ ব্যবস্থা আমাকে দেয়

1. Generate a set of objects at a given branch/revision.
2. Provide the difference between a parent child branch/revisions.

অতিরিক্তভাবে, মার্জ করার জন্য এটি জানতেও দরকারী (বা সমালোচনা))

3. The set of changes have been merged into a given branch/revision.

মার্চুরিয়াল , গিট এবং সাবভার্সিয়ন (এখন স্থানীয়ভাবে, পূর্বে এসএনএনএম.পি ব্যবহার করে) সমস্ত তিনটি তথ্য সরবরাহ করতে পারে। ডিভিসির মাধ্যমে মৌলিকভাবে আরও ভাল কিছু প্রদর্শনের জন্য, দয়া করে গিট / মার্কিউরিয়াল / ডিভিসি-তে উপলব্ধ কিছু চতুর্থ অংশের তথ্যটি এসভিএন / কেন্দ্রীভূত ভিসিতে পাওয়া যায় না।

এগুলি বলার অপেক্ষা রাখে না যে তারা আরও ভাল সরঞ্জাম নয়!


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

5
সংস্করণ 1.5 অবধি সাবভার্সন সমস্ত প্রয়োজনীয় তথ্য সংরক্ষণ করে না । 1.5-পরবর্তী পোস্টে এসভিএনযুক্ত ওয়েভ স্টোরেজ করা তথ্যগুলি পৃথক: গিট সমস্ত একত্রীকরণের প্রতিশ্রুতি রাখার জন্য পিতামাতাকে সংরক্ষণ করে, যখন সাবভার্সনগুলি কি সংশোধনগুলি ইতিমধ্যে শাখায় মার্জ করা হয়েছিল stores
জাকুব নরবস্কি

4
একটি সরঞ্জাম যা একটি এসএনএন সংগ্রহস্থলটিতে পুনরায় প্রয়োগ করা শক্ত git merge-base। গিটের সাহায্যে, আপনি "ব্রাঞ্চ এ এবং বি রিভিশন x এ বি বিভাজন" বলতে পারেন। তবে এসএনএন স্টোরগুলি "ফাইলগুলি ফু থেকে বারে অনুলিপি করা হয়েছিল", সুতরাং আপনার বারবার অনুলিপি ব্যবহার করতে হবে যে বারের অনুলিপিটি কোনও প্রকল্পের মধ্যে ফাইলগুলি অনুলিপি করার পরিবর্তে একটি নতুন শাখা তৈরি করছে। কৌশলটি হ'ল এসএনএন-তে একটি সংশোধন সংশোধন নম্বর এবং বেস পাথ দ্বারা সংজ্ঞায়িত করা হয় । যদিও বেশিরভাগ সময় "ট্রাঙ্ক" ধরে নেওয়া সম্ভব হয়, তবে সেখানে যদি সত্যিই শাখা থাকে তবে এটি কামড় দেয়।
ডগলাস

2
পুনরায়: "গিটটি এমন কোনও তথ্য নেই যা গিট রাখে বা প্রাপ্ত করতে পারে যা এসএনএন রাখে না বা অর্জন করতে পারে না" " - আমি দেখতে পেয়েছি যে জিনিসগুলি একত্রীকরণের সময় এসভিএন মনে রাখেনি। আপনি যদি ট্রাঙ্ক থেকে আপনার শাখায় কাজ টানতে এবং পিছনে যেতে চান তবে মার্জ করা শক্ত হয়ে যেতে পারে। গিটে প্রতিটি নোডকে তার সংশোধন গ্রাফটি জানে যে এটি কোথা থেকে এসেছে। এটিতে দু'জন পিতা-মাতা এবং কিছু স্থানীয় পরিবর্তন রয়েছে। আমি গিটকে এসভিএন এর চেয়ে বেশি সংহত করতে সক্ষম হতে বিশ্বাস করব। আপনি যদি এসভিএনগুলিতে মার্জ হন এবং শাখাটি মুছুন তবে শাখার ইতিহাস হারিয়ে যাবে is যদি আপনি জিআইটিতে মার্জ হন এবং শাখাটি মুছুন তবে গ্রাফটি অবধি রয়েছে এবং এর সাথে "দোষ" প্লাগইন রয়েছে।
রিচার্ড করফিল্ড

1
স্থানীয়ভাবে, যদিও গিট এবং মুরিউরিয়ালের সমস্ত প্রয়োজনীয় তথ্য আছে, এমন কি নয়, যদিও এসএনএন তথ্য প্রাপ্তির জন্য স্থানীয় এবং কেন্দ্রীয় উভয় উপাত্তের দিকে নজর দেওয়া দরকার?
ওয়ারেন ডিউ

8

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

আমি এখনও এসভিএন প্রচুর ব্যবহার করি তবে আমি গিটকে কয়েকবার ব্যবহার করে খুব সন্তুষ্ট।

আপনার সময় থাকলে একটি দুর্দান্ত পঠন: আমি কেন গিটকে বেছে নিয়েছি


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

গিট ফাইলগুলির বিষয়বস্তু ট্র্যাক করে, এটি কেবল সামগ্রী হিসাবে পরিবর্তিত হিসাবে দেখায়
ফেরিবিগ

6

জোয়েলের ব্লগে কেবল একটি নিবন্ধ পড়ুন (দুঃখের সাথে তাঁর শেষটি)। এটি একটি মার্চুরিয়াল সম্পর্কে, তবে এটি আসলে গিটের মতো বিতরণকারী ভিসি সিস্টেমের সুবিধার কথা বলে about

বিতরণ করা সংস্করণ নিয়ন্ত্রণের সাথে, বিতরণ করা অংশটি আসলে সবচেয়ে আকর্ষণীয় অংশ নয়। মজার বিষয় হ'ল এই সিস্টেমগুলি পরিবর্তনের ক্ষেত্রে চিন্তা করে, সংস্করণের ক্ষেত্রে নয়।

নিবন্ধটি এখানে পড়ুন ।


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

2
আমিও ভেবেছিলাম যে এটি অস্পষ্ট ছিল ... আমি সবসময়ই ভাবতাম পরিবর্তনগুলি সংস্করণগুলির (বা পরিবর্তনের পরিবর্তে) একটি অবিচ্ছেদ্য অঙ্গ, যা আমাকে অবাক করে দেয় যে কিছু প্রোগ্রামার পরিবর্তনের দিক থেকে ভাবেন না।
স্পোকাইক

এমন একটি ব্যবস্থার জন্য যা সত্যই "পরিবর্তনের ক্ষেত্রে বিবেচনা করে", ডার্কস পরীক্ষা করুন
সর্বোচ্চ

@ ম্যাক্স: নিশ্চিত, তবে যখন ধাক্কাটি আসে, গিট বিতরণ করে যেখানে ডারাক্স মূলত সাবভারশন হিসাবে ঠিক ততটা বেদনাদায়ক যখন এটি সংযুক্তির বিষয়টি আসে।
ট্রিপলি

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