গিট টানার ফলাফল কমিট লগের বহিরাগত "মার্জ শাখা" বার্তাগুলিতে


110

আমি একটি প্রকল্পে অন্য বিকাশকারীর সাথে কাজ করছি এবং আমরা গিথুবকে আমাদের দূরবর্তী রেপো হিসাবে ব্যবহার করছি। আমি 1.7.7.3 গিট ব্যবহার করে একটি ম্যাকে আছি, তিনি উইন্ডোতে 1.7.6 গিট ব্যবহার করছেন।

এটাই হচ্ছে

  1. আমাদের মধ্যে একজন (আসুন তাকে বিকাশকারী হিসাবে ডাকি, তবে এটি কোনটি বিবেচনা করে না) গিটহাবের কাছে একটি সেটকে চাপ দেয়।
  2. অন্যটি (বিকাশকারী বি) কিছু স্থানীয় কমিট করে।
  3. খ করে a git pull
  4. খ করে a git push
  5. প্রতিশ্রুতিবদ্ধ ইতিহাসের লগটি দেখে আমি দেখতে পাই গিথুব ডটকম: ফু / বারের শাখাটি 'মাস্টার'

প্রতিশ্রুতিবদ্ধ লগ সময়ের সাথে সাথে "মার্জ শাখা" বার্তাগুলি দ্বারা বিভক্ত হয়ে যায়, এবং বিকাশকারী বি কে বিকাশকৃত পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হিসাবে দেখায়। এই সমস্যাটি রোধ করার জন্য আমরা একমাত্র git pull --rebaseউপায়টি পেয়েছি step ধাপে একটি কাজ করা, তবে আমি জানি না যে রিবাইসিংয়ের ফলে কী পার্শ্ব প্রতিক্রিয়া প্রবর্তিত হবে। এটি আমার প্রথমবারের মতো একটি বহু-বিকাশকারী গিট রেপোতে কাজ করছে, তবে এটি কি কেবল সাধারণ আচরণ? এই সমস্যাটি কীভাবে সমাধান করবেন?


2
আপনার সাথে মার্জ ছাড়া লগ দেখতে পারেনgit log --no-merges
wjandrea

উত্তর:


88

আপনি যে প্রতিশ্রুতিটি দেখছেন তা পুরোপুরি ঠিক। একজন pullকার্যকরভাবে রান git fetchএবং তারপর git mergeতাই একটি একত্রীকরণ সাধারণত ঘটছে যখন আপনি চালাতে git pull

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

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

সুতরাং, দীর্ঘ গল্প সংক্ষিপ্ত: হ্যাঁ, মার্জ কমিটগুলি করা পুরোপুরি ঠিক আছে এবং আপনার সেগুলি সম্পর্কে চিন্তা করা উচিত নয়।


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

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

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

1
@ বোবেসপঞ্জা এমন সমস্ত প্রতিশ্রুতি যা টানা দূরবর্তী শাখায় নেই সেগুলি আবারও লেখা হয়। এটিতে অন্যান্য শাখা থেকে প্রকাশিত কমিটগুলি অন্তর্ভুক্ত থাকতে পারে, যেমন বৈশিষ্ট্য শাখাগুলি সহ, যা অন্যরা ইতিমধ্যে এর আগে অ্যাক্সেস করেছে। যেমন, হ্যাঁ, আপনি কী পুনর্বাসন করবেন তা ভেবে ছাড়াই মুক্তি কিছুটা বিপজ্জনক।
অকর্মা

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

48

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


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

উদাহরণস্বরূপ, দুটি ব্যক্তি একই শাখায় কাজ করছেন। শাখাটি শুরু হয়:

...->C1

প্রথম ব্যক্তি তাদের কাজ শেষ করে শাখায় চাপ দেয়:

...->C1->C2

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

...->C1->C3

যদি টানটি মার্জ করার জন্য সেট করা থাকে তবে দ্বিতীয় ব্যক্তিদের সংগ্রহস্থলের মতো দেখাবে।

...->C1->C3->M1
      \      /
       ->C2->

যেখানে এম 1 হ'ল মার্জ কমিট। এই নতুন শাখার ইতিহাসকে রেপোতে ঠেলে দেওয়া হবে। পরিবর্তে, টানটি স্থানীয় রেপোকে পুনরায় চালু করতে সেট করা লাগবে:

...->C1->C2->C3

কোনও মার্জ কমিট নেই। ইতিহাসকে আরও লিনিয়ার করা হয়েছে।

উভয় পছন্দ শাখার ইতিহাস প্রতিফলিত করে। গিট আপনাকে কোন ইতিহাস পছন্দ করবে তা চয়ন করতে দেয়।

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

আপনি শাখার সেট করতে পারেন utআটোসেটুপ্রেবেস = সর্বদা গিটটি স্বয়ংক্রিয়ভাবে আপনার দূরবর্তী শাখাগুলিকে মাস্টারের পরিবর্তে পুনরায় হিসাবে স্থাপন করতে হবে।

git config --global branch.autosetuprebase always

এই সেটিংটি গিটকে প্রতিটি প্রত্যন্ত শাখার জন্য স্বয়ংক্রিয়ভাবে একটি কনফিগারেশন সেটিংস তৈরি করতে দেয়:

branch.<branchname>.rebase=true

আপনি ইতিমধ্যে সেটআপ করা আপনার দূরবর্তী শাখাগুলির জন্য নিজেকে এটি সেট করতে পারেন।

git config branch.<branchname>.rebase true

আমি আমার পূর্ববর্তী বক্তব্যগুলি জিজ্ঞাসা ও অনুসরণ করার জন্য @ লরেন্সহলস্টকে ধন্যবাদ জানাতে চাই। গিটটি কীভাবে টানুন এবং মার্জ কমিটগুলির সাথে কাজ করে সে সম্পর্কে অবশ্যই আমি আরও শিখেছি।

মার্জ কমিটস সম্পর্কে আরও তথ্যের জন্য আপনি প্রোজিট-বুকের কোনও প্রকল্পে অবদান পড়তে পারেন । ব্যক্তিগত ছোট দল অধ্যায় শো করে একত্রিত করে।


7
“একটি টানে মার্জ করার পরিবর্তে রিবেস ব্যবহার করা ভাগ করা সংগ্রহস্থলের সঠিক ইতিহাস সরবরাহ করে। মার্জ ব্যবহার করা একটি ভ্রান্ত ইতিহাস সরবরাহ করে। - এই বরং সাহসী বিবৃতি ব্যাক আপ যুক্তি কি? মার্জগুলির সাথে কোনও ইতিহাসই 'মিথ্যা ইতিহাস' নয়। এটি যে ক্রম ঘটেছিল তার সঠিক চিত্রায়ন। আপনি রিবেসিংয়ের মাধ্যমে যা করছেন তা আসলে ইতিহাসের পরিবর্তন , এর সামান্য আরও রৈখিক সংস্করণ তৈরি করা। আপনি নান্দনিকতার জন্য নির্ভুলতা ত্যাগ করেন। হতে পারে এমন কিছু যা আপনি করতে পছন্দ করেন তবে কোনওভাবেই সত্যবাদী নয়।
লরেন্স হলস্ট

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

2
পুনর্বাসিত ইতিহাস কীভাবে আরও সঠিক? আপনি এটি স্পষ্ট করবেন না, এবং এটি কেমন হবে তা আমি দেখতে পাচ্ছি না।
লরেন্স হলস্ট

1
ইতিহাস ভাগের রেপোতে কমিটগুলি ঘটেছিল সেই সময়ের প্রতিচ্ছবি । একদিন 1, ভাগ করা রেপো C2 কমিট করে দেখেছিল। ২ য় দিনে, ভাগ করা রেপো সিটি C3 দেখতে পায়। সি 3 যদি সি 2 এর আগে আসে তবে সময়ের প্রতিবিম্বটি সঠিক হবে না। সি 3 সি 2 এর আগে আসেনি। এই সমস্ত রিবেসটি, ভাগ করে নেওয়া সংগ্রহস্থলের দ্বারা প্রদর্শিত ইতিহাসকে যথাযথভাবে প্রতিফলিত করার জন্য স্থানীয় সংগ্রহস্থলে পুনরায় সংগঠিত করা হয় ।
বিল ডোর

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

11

আপনি করতে পারেন:

git pull --rebase

তবে এটি সর্বদা আপনার সহযোগীদের শীর্ষে আপনার পরিবর্তনগুলি রাখবে। তবে আপনি কোনও দূষণকারী মার্জ বার্তা পাবেন না।


9

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

git stash
git pull
git stash pop

তারপরে আপনি যে কোনও মার্জ সংঘাতের সমাধান করতে পারেন।


বেশিরভাগ বিরক্তিকর এবং উদ্বেগ হ'ল হুবুহু সংহত দ্বন্দ্ব। আমি বরং এড়াতে চাই
সবুজ

1
@ গ্রীন যদি আপনি মার্জ সংঘাত সম্পর্কে উদ্বিগ্ন হন তবে গিট টানও আলাদা নয়।
জোসো

যে এক সময় ছাড়া আপনি করতে ভুলবেন যখন stashআপনি আগে pull। উঘ গিটের প্রয়োজন হয় আমার সারাক্ষণ আমার খেলার শীর্ষে থাকা।
লিনাক্স নুব

git pull --rebaseস্থানীয় পরিবর্তনের পূর্বে দূরবর্তী পরিবর্তনগুলিকে একীভূত করা দরকার , নির্বিশেষে।
ভনব্র্যান্ড

7

গিট টান দিয়ে "মার্জ শাখা" বার্তাগুলি সন্নিবেশ করা হবে, এটি ঠিক তাই করে। গিট টান দিয়ে আপনি দূরবর্তী শাখাটি আপনার স্থানীয় শাখায় একীভূত করেছেন।

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

যতদূর আমি জানি এটি ঠিক গিট কীভাবে কাজ করে এবং এর চারপাশে কোনও উপায় নেই।

রিবেসিং গিট ইতিহাসটি দূরে সরিয়ে দেবে, সুতরাং আপনি কখন মার্জগুলি ঘটতে পারবেন তা দেখতে পারবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.