বিবাদ ছাড়াই কেন গিট সংলগ্ন লাইনের সংযোগ নেই?


25

আমি সম্প্রতি শিখেছি যে গিটে দুটি শাখা মার্জ করার সময়, যদি দুটি সংলগ্ন লাইনে গিট পরিবর্তন হয় তবে এটি একটি বিরোধ হিসাবে ঘোষণা করে। উদাহরণস্বরূপ, যদি ফাইলটিতে test.txtএই সামগ্রী থাকে:

Line 1: A
Line 2: B
Line 3: C
Line 4: D

এবং শাখায় masterআমরা এটিকে পরিবর্তন করি

Line 1: A
Line 2: B1
Line 3: C
Line 4: D

শাখায় থাকাকালীন testingআমরা এটিকে পরিবর্তন করি

Line 1: A
Line 2: B
Line 3: C1
Line 4: D

এবং তারপরে মার্জ করার testingচেষ্টা করুন master, গিটটি মার্জ সংঘাতের ঘোষণা দেয়। আমার নির্বোধ প্রত্যাশা ছিল যে মার্জটি দ্বন্দ্ব ছাড়াই ঘটবে এবং এটিকে ফল দেবে:

Line 1: A
Line 2: B1
Line 3: C1
Line 4: D

আমি নিশ্চিত যে গিট এইভাবে একীভূত না হওয়ার কোনও উপযুক্ত কারণ রয়েছে। কেউ এই কারণ ব্যাখ্যা করতে পারেন?


আরে আমি গত সপ্তাহেও এটি লক্ষ্য করেছি। সম্ভবত আমরা একই টিউটোরিয়াল করছিলাম।
যথাক্রমে

5
গিটের মার্জ করার ক্ষমতা আসলে বেশ দুর্বল, আইএমও
জেমস

@ জেমস আপনি কি ধৈর্যশীল অ্যালগরিদম ব্যবহার করার চেষ্টা করেছেন? আমি খুঁজে পেয়েছি যে আমি এর সাথে আরও ভাল ফলাফল পেয়েছি, বিশেষত যেখানে কুকুরগুলি বিভক্ত হয় তার সাথে ডিল করার সময় (যেমন দুটিয়ের পরিবর্তে একটি ফাংশন বডি দখল করা)। আপনি যদি গিট পছন্দ করেন না তবে আপনি নিজের ব্যবহারও করতে পারেন ( উদাহরণ হিসাবে দেখুন blog.wuwon.id.au/2010/09/… )।
deterb

1
মূল কারণ হ'ল গিটটি কোনও বিশেষ সরঞ্জামে ফ্যাক্টর করার পরিবর্তে নিজেই মার্জ করার চেষ্টা করে। পুরোপুরি ইউনিক্স দর্শন নয়। উত্স ফাইলগুলির জন্য, আপনি নির্ভরযোগ্যভাবে ডিফগুলি নির্ধারণ করতে ভাষার ব্যাকরণটি ব্যবহার করতে পারেন।
এমসাল্টারস

একমাত্র প্রচলিত প্রসঙ্গটি A এবং D, সুতরাং কেন A / C1 / B1 / D সঠিক সংযুক্তি হয় না?
ইজকাটা

উত্তর:


13

ধরে নিচ্ছি যে কোডের এই স্নিপেট

x=0
x+=1 if foo
x+=1 if bar
return x

এটিতে একটি শাখায় পরিবর্তন করা হয়েছে

x=0
x+=1 if foo && xyzzy
x+=1 if bar
return x

এবং এটি অন্য একটি শাখায়

x=0
x+=1 if foo
x+=1 if bar && xyzzy
return x

তবে আমি চাই না গিটটি এটি এতে একীভূত করবে

x=0
x+=1 if foo && xyzzy
x+=1 if bar && xyzzy
return x

আমাকে উদ্বেগ না করে

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

এই উদাহরণটি তুচ্ছ, তবে বিশাল শাখাগুলিকে মার্জ করার সময় অনুরূপ "যৌক্তিক" বিবাদগুলির ঝুঁকি অনেক বড় is কখনও কখনও আমি প্রসঙ্গটি এখনকার চেয়েও বড় হতে পছন্দ করি।


5
এটির সাথে এর কোনও যোগসূত্র নেই, তবে কেবল এই দুটিয়ের মধ্যে একটি অপরিবর্তনীয় রেখা যুক্ত করুন এবং হঠাৎ গিট কোনও সমস্যা ছাড়াই এগুলিকে একত্রিত করে।
দারখোগ

হ্যাঁ আমি এই উত্তরটি পাই না। সমস্ত স্বয়ংক্রিয় মার্জগুলি এড়ানোর জন্য আপনি একই যুক্তি ব্যবহার করতে পারেন।
মেহরদাদ

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

11

এই গিট-একমাত্র আচরণ?

সহকর্মীর সাথে আলোচনার পরে, আমি কেবল চেষ্টা করেছি, এবং এসভিএন সমস্যা ছাড়াই এটি পরিচালনা করে : আপনি 2 টি লাইন সংশোধন করেছেন।

বেশ কয়েকটি ভিসিএসের মার্জ ক্ষমতা এখানে বাজার, ডার্কস, গিট এবং মুর্যুয়ালিয়াল জন্য পরীক্ষা করা হয় : https://github.com/mndrix/ विसरा- এই এই

দেখে মনে হচ্ছে কেবলমাত্র অট্টালিকা সফলভাবে "সংলগ্ন রেখাগুলি" কেসটিকে মার্জ করে।

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

কেন কেউ সিদ্ধান্ত নেবেন যে সংলগ্ন রেখাগুলি সংশোধন করা একটি বিরোধ সৃষ্টি করে?

আমি মনে করি এটি এটি আপনাকে এটি দেখার জন্য জোর করা হয়

int max = MAX_ITEMS;
for(unsigned int i = 0; i < max; i++)
    do_stuff(i);

সংশোধনী নম্বর 1, মাস্টারে:

int max = MAX_ITEMS/2; // Do stuff only on the first half
for(unsigned int i = 0; i < max; i++)
    do_stuff(i);

মোডিফ নম্বর 2, একটি শাখা থেকে মার্জ করা:

int max = MAX_ITEMS;
for(unsigned int i = 0; i < max/2; i++) // max/2: only on 1st half
    do_stuff(i);

মার্জ হওয়ার পরে, আপনি এটি চান না:

int max = MAX_ITEMS/2; // Do stuff only on the first half
for(unsigned int i = 0; i < max/2; i++) // max/2: only on 1st half
    do_stuff(i);

এই আচরণটি একটি বৈশিষ্ট্য হিসাবে দেখছে

আপনি গিট মার্জিং আচরণটি একটি সুবিধার দিকে বদলে দিতে পারেন। যখন আপনার 2 লাইন সামঞ্জস্য রাখতে হবে তবে আপনি এটি সনাক্ত করতে পারবেন না (সংকলনের সময়ে, আপনার পরীক্ষার শুরুতে বা অন্যথায়), আপনি সেগুলিতে যোগদানের চেষ্টা করতে পারেন।

এটি আবার লিখুন ...:

for(unsigned int i = 0; i < max; i++)
    r = do_stuff(i);
    // Need to do something else
    do_something_else(r);

... এটি:

for(unsigned int i = 0; i < max; i++)
    r = do_stuff(i);
    do_something_else(r); // Need to do something else

সুতরাং আপনি যখন মোডিফ 1 মার্জ করবেন ...:

for(unsigned int i = 0; i < max; i++)
    r = do_stuff(i)/2; // we need only the half
    do_something_else(r); // Need to do something else

... মোডিফ 2 সহ ...:

for(unsigned int i = 0; i < max; i++)
    r = do_stuff(i);
    if(r < 0) // do_stuff can return an error
        handle_error(r);
    do_something_else(r/2); // Need to do something else

..., গিট একটি বিরোধ সৃষ্টি করবে এবং আপনি এটি দেখার জন্য আপনাকে বাধ্য করবেন।


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

5

আমি বেশিরভাগ অনুমান করছি, তবে আমি মনে করি এটি 3 লাইন পরিবর্তনের প্রসঙ্গ হিসাবে ব্যবহৃত হচ্ছে লাইন 2 এর সাথে করা উচিত।

গিটটি কেবল এটি বলতে পারে না যে "সি এর সাথে লাইনটি সি 1 এর সাথে একটি লাইন হয়ে গেছে" কারণ "সি" এর সাথে অন্য একটি লাইনও থাকতে পারে, সুতরাং এটি বলেছে "সি দিয়ে লাইন, এটি ফাইলের শুরু হওয়ার ঠিক পরে, লাইনটি দিয়ে এ, এবং বি এর সাথে লাইনটি এখন সি 1 "

যদি "বি এর সাথে রেখাটি" আর না থাকে, তবে কিছু প্রসঙ্গটি হারিয়ে যায় এবং গিটটি কেবল নতুন লাইনে কোথায় যেতে হবে তা মোটামুটিভাবে বলতে পারে।


5
এটি খুব সম্ভবত যে সি বি এর উপর নির্ভর করে, তাই নির্দোষ একীভূত হওয়া অসুবিধাজনক হতে পারে এমনকি যদি গিট "কীভাবে" এটি করতে হয় তা জানে
লুসিনা

বিশ্বাস করুন গিট কেবল "এটি জানেন এটি" মনে করে। গিট ভুল ধারণার কবরস্থান, সোজা হওয়ার চেষ্টা করছে!
ব্যবহারকারীর 3833732

2

এখানে অন্যান্য উত্তরগুলি সবই পয়েন্টে রয়েছে তবে আমার কাছে এটি সর্বদা একটি অপ্রয়োজনীয় সীমাবদ্ধতার মতো মনে হয়েছিল।

অন্যরা যেমন বলেছে, এই ক্ষেত্রে আপনি অবশ্যই গীত সতর্কতা ছাড়াই লাইনগুলিকে একত্রিত করতে চান না।

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

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

এটি আমার একটি প্রচুর সময় সাশ্রয় করে, কারণ আমি এমন একটি প্রকল্প পরিচালনা করি যেখানে লোকেরা প্রায়শই একই ফাইলগুলিতে কাজ করে এবং প্রচুর কোডকে রিফ্যাক্ট করে।

স্ক্রিপ্টটি জিপিএলভি 3 + লাইসেন্সের আওতায় গিটহাবে পাওয়া যায়। আপনি এটি দরকারী খুঁজে পেতে পারেন:

https://github.com/paulaltin/git-subline-merge


4
কেউ কেন এটি নিম্নোক্ত ছিল তা বোঝাতে মন চাইবে? আমি এখানে মোটামুটি নতুন, তাই যদি আমি কিছু ভুল করে থাকি তবে আমি এটি কী তা জানতে চাই তাই ভবিষ্যতে এটি এড়াতে পারি। আমি বুঝতে পারি আমার পোস্টটি ঠিক যেমনটি জিজ্ঞাসা করা হয়েছে ঠিক তেমন উত্তর দেয় না, তবে এটি এখনও প্রাসঙ্গিক এবং আমি মনে করি যে এখানে আসা বেশিরভাগ লোকেরা কেবল গিট কেন এটি করে তা নয় তবে তারা এটি সম্পর্কে কী করতে পারে তাও জানতে চাইবে (যেমন আমি যখন করেছি তখন প্রথমে গুগল অনুসন্ধান থেকে এই প্রশ্নে পৌঁছেছেন)।
deltacrux

আমি এটি এখনও চেষ্টা করি নি তবে আমি এটি স্বয়ংক্রিয় করার উপায় খুঁজতে এসেছি এবং এটি এখানে পেয়ে খুশি হয়েছিল। ধন্যবাদ :) আপনি দুর্দান্ত
মেহরদাদ

1
সমস্যা নেই! আমি আশা করি আপনি এটি দরকারী বলে মনে করেন, এবং আপনি যদি সমস্যাগুলি নিয়ে চলে যান বা উন্নতির জন্য কোনও পরামর্শ পেয়ে থাকেন তবে দয়া করে গিথুবকে প্রতিক্রিয়া জানাতে বিনা দ্বিধা বোধ করবেন। ধন্যবাদ!
deltacrux
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.