আমার অফিস নীতি হিসাবে অসীম শাখা মার্জ করতে চায়; আমাদের আর কোন বিকল্প নেই?


119

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

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

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

সমস্যাটি এখানে: আমি কমান্ড লাইনের সাথে একচেটিয়াভাবে কাজ করি, তবে আমার দলটির বাকী অংশ জিইআইআইএস ব্যবহার করে। এবং আমি আবিষ্কার করেছি জিইউআইএসের কাছে অন্যান্য শাখা থেকে ইতিহাস প্রদর্শন করার কোনও যুক্তিসঙ্গত বিকল্প নেই । তাই আপনি যদি একটি স্কোয়াশ কমিট বলার অপেক্ষা রাখে না "এই উন্নয়ন শাখা থেকে squashed পৌঁছাতে XYZ", এটি একটি এর বিশাল দেখুন সেখানে কি আছে যেতে ব্যথা XYZ

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

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

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

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


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

65
ঠিক আছে, কিন্তু আমার মনের মধ্যে একটি দীর্ঘ চলমান শাখা ঠিক যেখানে আপনি কি , যাতে দায়ী এবং bisects শুধু "পরিবর্তন 2016 বিগ লেখা অংশ হিসেবে চালু করা হয়" অবতরণ না কিছু দৃশ্যমানতা চাই। আমি উত্তর হিসাবে পোস্ট করার মতো যথেষ্ট আত্মবিশ্বাসী নই, তবে আমার প্রবৃত্তিটি হ'ল বৈশিষ্ট্য শাখার মধ্যে এমন কাজগুলি যাতে স্কোয়াশ করা উচিত, যাতে আপনার প্রজেক্টের একটি সংক্ষিপ্ত-ইতিহাস রয়েছে যা ইতিহাসের মূল ইতিহাস থেকে অ্যাক্সেসযোগ্য হবে to একটি অনাথ শাখা পরীক্ষা করুন।
IMSoP

5
এই কথাটি বলা সম্ভব, সুতরাং এই প্রশ্নটি হ্রাস পেয়েছে "আমি আমার সতীর্থদের চেয়ে উচ্চ স্তরে গিট ব্যবহার করার চেষ্টা করছি; আমি কীভাবে তাদের এই গোলযোগ থেকে বিরত রাখব?" যা, যথেষ্ট ন্যায্য, আমি কেবল সততার git log master+bugfixDec10thসাথে ব্রেকিং পয়েন্ট হওয়ার আশা করিনি : - /
স্ট্যান্ডব্যাক

26
"দীর্ঘমেয়াদী সাইডব্র্যাঞ্চগুলি - যে ধরণের আপনি কয়েকটি লোককে সাইডব্র্যাঞ্চে কাজ করে যা মাস্টারের কাছ থেকে বিভক্ত হয়ে যায়, আমরা কয়েক মাস ধরে বিকাশ করি এবং যখন আমরা একটি মাইলফলক পৌঁছায় তখন আমরা দু'জনকে সমন্বয় করি।" আপনি কি পর্যায়ক্রমে মাস্টার থেকে পাশের শাখায় টানবেন না? প্রতিটি (কয়েক) মাস্টার প্রতিশ্রুতিবদ্ধ তা করা অনেক ক্ষেত্রে জীবনকে সহজ করে তোলে।
TafT

4
আপনি merge --no-ffকি চান? উপর masterনিজেই এক কমিট বর্ণনা কি শাখায় পরিবর্তিত হয়েছে, কিন্তু করে সব এখনও বিদ্যমান এবং মাথা থেকে parented করছে।
CAD97

উত্তর:


244

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

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

রিবেসিং, চেরি-পিকিং, বা স্কোয়াশিংয়ের ইতিহাস মুছে ফেলা বা পুনর্লিখনের মতো ক্রিয়া। বিশেষত, ফলস্বরূপ প্রতিশ্রুতিগুলি আর মূল আসলগুলি উল্লেখ করে না। এই বিবেচনা:

  • আপনি কিছু প্রতিশ্রুতি স্কোয়াশ করছেন এবং প্রতিশ্রুতি বার্তায় নোট করুন যে স্কোয়াশড ইতিহাসটি মূল কমিট abcd123 এ উপলব্ধ।
  • আপনি [1] সমস্ত শাখা বা ট্যাগগুলিকে মুছে ফেলা হয়েছে যা abcd123 অন্তর্ভুক্ত রয়েছে সেগুলি মার্জ হওয়ার পরে।
  • আপনি আবর্জনা সংগ্রহকারী চালাতে দিন।

[1]: কিছু গিট সার্ভার শাখাগুলি দুর্ঘটনাজনিত মোছার বিরুদ্ধে সুরক্ষিত রাখার অনুমতি দেয় তবে আমি সন্দেহ করি যে আপনি আপনার সমস্ত বৈশিষ্ট্য শাখা অনন্তকাল ধরে রাখতে চান।

এখন আপনি সেই প্রতিশ্রুতিটি আর দেখতে পাচ্ছেন না - এটি কেবল বিদ্যমান নেই।

প্রতিশ্রুতিবদ্ধ বার্তায় একটি শাখার নাম উল্লেখ করা আরও খারাপ, যেহেতু শাখার নামগুলি কোনও রেপোতে স্থানীয়। কি master+devFeatureআপনার স্থানীয় চেকআউট হতে পারে doodlediduhখনি হবে। শাখাগুলি কেবল সীমাবদ্ধ লেবেলগুলি চালিত করে যা কিছু প্রতিশ্রুতিবদ্ধ অবজেক্টের দিকে নির্দেশ করে।

ইতিহাসের পুনর্লিখনের সমস্ত কৌশলগুলির মধ্যে, রিবাজিং সর্বাধিক সৌম্য কারণ এটি তাদের সমস্ত ইতিহাসের সাথে সম্পূর্ণ কমিটগুলি নকল করে এবং কেবল পিতামাতার প্রতিশ্রুতি প্রতিস্থাপন করে।

যে masterকারণ যে বাস্তবতা প্রতিনিধিত্ব করে ইতিহাস, সব শাখা এটি একটি ভাল জিনিস মধ্যে মিশে গিয়ে তৈরি হয়েছিল সম্পূর্ণ ইতিহাস অন্তর্ভুক্ত করা হয়েছে। [২] যদি সমান্তরাল বিকাশ ঘটে থাকে তবে তা লগে দৃশ্যমান হওয়া উচিত।

[২]: এই কারণে, আমি লিনিয়ারাইজড তবে শেষ পর্যন্ত জাল ইতিহাসের তুলনায় স্পষ্টভাবে মার্জ কমিটগুলি পছন্দ করি reb

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

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

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

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


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

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

80
এর চেয়ে বেশি হতাশার কিছু নেই যে কোডটি ব্যবহার করে কোনও বাগের কারণ চিহ্নিত করার চেষ্টা করা হচ্ছে git bisect, কেবল এটির পাশের একটি শাখা থেকে 10,000 লাইন উবার-কমিটে পৌঁছানো।
tpg2114

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

2
চেরি-পিক পুনর্লিখন বা ইতিহাস মুছবে না। এটি কেবলমাত্র নতুন কমিট তৈরি করে যা বিদ্যমান
কমিটগুলি

111

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

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

স্ট্যান্ডার্ড গিটক ভিউ

হ্যাঁ, কিছুটা জটলা, তবে আমরা এটিকেও পছন্দ করি কারণ আমরা ঠিক দেখতে পাচ্ছি যে কখন কী পরিবর্তন হয়েছিল। এটি আমাদের বিকাশের ইতিহাসকে নির্ভুলভাবে প্রতিফলিত করে। যদি আমরা উচ্চ-স্তরের দর্শন দেখতে চাই, এক বারে এক টানার অনুরোধ একত্রিত হয়ে যায়, আমরা নীচের মতামতটি দেখতে পারি, যা git log --first-parentআদেশের সমতুল্য :

- প্রথম-পিতামাতার সাথে গিটক ভিউ

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


24
আমি এই বিকল্পের সাথে পরিচিত ছিলাম না! এটি আমার জন্য একটি বিশাল সহায়তা এবং আরও লগ বিকল্পগুলি শিখার ফলে এটি আমাকে আরও সহজেই বাঁচতে দেয় sounds
স্ট্যান্ডব্যাক

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

@ স্ট্যান্ডব্যাক সম্পর্কিত, আমার পক্ষে এই কাঠামোটি বজায় রাখতে সহায়তা করে এমন একটি জিনিস ব্যবহার করছে merge --no-ff- দ্রুত-ফরোয়ার্ড মার্জগুলি ব্যবহার করবেন না, পরিবর্তে সর্বদা একটি মার্জ কমিট তৈরি করুন যাতে --first-parentকাজ করার মতো কিছু থাকে
ইজকাটা

34

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

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

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

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


3
আমি সম্পূর্ণ চুক্তিতে আছি; প্রত্যেকেই প্রভুর কাছাকাছি থাকতে পছন্দ করেন। তবে এটি একটি ভিন্ন ইস্যু, যা আমার নিজের নম্র প্রভাবের অধীনে অনেক বড় এবং অনেক কম :
পি

2
+1 এর জন্যgit merge --no-ff
0xcaff

1
এছাড়াও +1 git merge --no-ff। আপনি যদি গিটফ্লো ব্যবহার করেন তবে এটি ডিফল্ট হয়ে যায়।
ডেভিড হ্যামেন

10

আমাকে আপনার বিষয়গুলির প্রত্যক্ষ এবং স্পষ্ট উত্তর দিন:

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

আপনি সাধারণত কয়েক মাস ধরে আপনার শাখাগুলিকে সিঙ্ক না করতে চান না।

আপনার বৈশিষ্ট্য শাখাটি আপনার কর্মপ্রবাহের উপর নির্ভর করে কিছু ছড়িয়েছে; আসুন কেবল এটি masterসরলতার জন্য কল করুন । এখন, যখনই আপনি মাস্টার প্রতিশ্রুতিবদ্ধ, আপনি এবং করতে পারেন git checkout long_running_feature ; git rebase master। এর অর্থ হ'ল আপনার শাখাগুলি ডিজাইনের মাধ্যমে সর্বদা সিঙ্ক থাকে।

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

এখন, আইএমএইচও, এটি পরিচালনা করার প্রাকৃতিক উপায় হ'ল, একক প্রতিশ্রুতিতে সাইডব্র্যাঞ্চকে স্কোয়াশ করুন।

না, আপনি একেবারে এটি চান না, আপনি একটি মার্জ কমিট চান। মার্জ কমিটও একটি "একক কমিট" is এটি, কোনওভাবে, সমস্ত স্বতন্ত্র শাখাকে "মাস্টার" করার মাধ্যমে সন্নিবেশ করায় না। masterএকত্রীকরণের সময় প্রধান এবং শাখা প্রধান - এটি দুটি পিতা-মাতার সাথে একক প্রতিশ্রুতিবদ্ধ ।

--no-ffঅবশ্যই অবশ্যই বিকল্পটি নির্দিষ্ট করে নিন ; --no-ffআপনার দৃশ্যের মধ্যে ছাড়াই মার্জ করা কঠোরভাবে নিষিদ্ধ করা উচিত। দুর্ভাগ্যক্রমে, --no-ffডিফল্ট নয়; তবে আমি বিশ্বাস করি যে একটি বিকল্প আপনি সেট করতে পারেন যা এটি এটিকে করে makes দেখুন git help mergeকি জন্য --no-ffআছে (সংক্ষেপে: এটা আচরণ আমি আগের অনুচ্ছেদে বর্ণিত সক্রিয়), এটা অত্যন্ত গুরুত্বপূর্ণ।

আমরা মাস্টার্সের ইতিহাসে সমান্তরাল বিকাশের মাসগুলিকে পূর্ববর্তীভাবে ছাড়ছি না।

একদম ঠিক নয় - আপনি কখনও কোনও শাখার কিছু "ইতিহাসের" মধ্যে ফেলে দিচ্ছেন না, বিশেষত মার্জ কমিট দিয়ে নয়।

আর যদি কারও পক্ষে সাইডব্র্যাঞ্চের ইতিহাসের জন্য আরও ভাল সমাধানের প্রয়োজন হয় তবে অবশ্যই এটি এখনও রয়েছে - এটি কেবল মাস্টার নয়, এটি সাইডব্র্যাঞ্চে।

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

আমি কি করেছি দেখুন? আপনার স্কোয়াশ প্রতিশ্রুতিবদ্ধতার জন্য আপনি যে সমস্ত জিনিস বর্ণনা করেছেন তা মার্জ কমিটের সাথেই রয়েছে--no-ff

সমস্যাটি এখানে: আমি কমান্ড লাইনের সাথে একচেটিয়াভাবে কাজ করি, তবে আমার দলটির বাকী অংশ জিইআইএস ব্যবহার করে।

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

এবং আমি আবিষ্কার করেছি জিইউআইএসের কাছে অন্যান্য শাখা থেকে ইতিহাস প্রদর্শন করার কোনও যুক্তিসঙ্গত বিকল্প নেই।

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

সুতরাং আপনি যদি এই স্কোয়াশ প্রতিশ্রুতিতে পৌঁছে যান, "এই উন্নয়নটি শাখা এক্সওয়াইজেড থেকে স্কোয়াশড হয়েছে", এক্সওয়াইজেডে কী আছে তা দেখার জন্য এটি একটি বিশাল বেদনা।

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

সুতরাং তারা এই বড়, দীর্ঘ বিকাশের সাইডব্যাঞ্চগুলি সর্বদা মার্জ কমিটের সাথে একত্রীকরণ করতে চায়।

এবং তারা একেবারে ঠিক আছে। কিন্তু তারা "মার্জ নেই মধ্যে ", তারা শুধু মার্জ করা হয়েছে। মার্জ একটি সত্যিকারের ভারসাম্যযুক্ত জিনিস, এর কোনও পছন্দের দিক নেই যা "অন্য" টিতে মিশে যায় ( শাখা ইত্যাদির মতো ছোট ছোট দৃশ্যগত পার্থক্য বাদে git checkout A ; git merge Bঠিক একই রকম) git checkout B ; git merge Aminorgit log

তারা এমন কোনও ইতিহাস চান না যা মাস্টার শাখা থেকে তাত্ক্ষণিকভাবে অ্যাক্সেসযোগ্য নয়।

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

আমি এই ধারণা ঘৃণা করি;

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

এর অর্থ সমান্তরাল বিকাশের ইতিহাসের একটি অবিরাম, অপরিবর্তনীয় জট।

অন্তহীন, সমান্তরাল - হ্যাঁ।

অবিচল, জট - না।

তবে আমাদের কী বিকল্প আছে তা আমি দেখছি না।

প্রতিদিনের উদ্ভাবক git, আপনার সহকর্মী এবং বিশ্বের অন্যান্য অংশের মতো প্রতিদিন কাজ করবেন না কেন ?

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

অন্য কোনও বিকল্প নেই; খারাপ হিসাবে না।


10

দীর্ঘমেয়াদী সাইডব্র্যাঞ্চ স্কোয়াশ করা আপনার প্রচুর তথ্য হারাবে।

আমি যা করব তা হ'ল সাইডব্র্যাঞ্চকে মাস্টার হিসাবে মার্জ করার আগে দীর্ঘমেয়াদী সাইডব্র্যাঞ্চে মাস্টারকে রিবেস করার চেষ্টা করা । প্রতিশ্রুতিবদ্ধ ইতিহাসকে লিনিয়ার এবং বোঝার জন্য সহজ করার সময় আপনি প্রতিটি প্রতিশ্রুতি মাস্টারকে রেখেছেন।

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


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

1

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

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

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

আপনার প্রশ্নের স্পষ্টভাবে উত্তর দিতে:

একত্রিত-কমিটের সাথে নিয়মিত সাইডব্র্যাঞ্চগুলি মাস্টারে মার্জ করার পাশাপাশি এখানে কি আমাদের কোনও বিকল্প আছে?

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


3
আমি দুঃখিত - আমি একই জিনিসটি করি, তবে আমি দেখতে পাচ্ছি না কীভাবে এটি প্রশ্নের উত্তর দেয়: - /
স্ট্যান্ডব্যাক

2
আপনার বর্ণিত প্রশ্নের একটি সুস্পষ্ট উত্তর যুক্ত করেছে।
ওয়েন ওয়ার্নার 21

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

তুমি বোঝাতে চাইলে অন্য দেবগণেরও দরকার ... কি? পুনর্বাসনা নয় এবং মার্শে কেবল স্কোয়াশ? বা আপনার সহকর্মীদের গিট শৃঙ্খলার অভাব সম্পর্কে আপনি কেবল এই প্রশ্নটি পোস্ট করছেন?
ওয়েইন ওয়ার্নার 21

1
বেশ কয়েকটি বিকাশকারী যদি সেই বৈশিষ্ট্য শাখায় কাজ করে তবে নিয়মিতভাবে মুক্তি দেওয়া কার্যকর নয়।
পাওলো ইবারম্যান

-1

সংশোধন নিয়ন্ত্রণ হ'ল আবর্জনা-আবর্জনা বাইরে।

সমস্যাটি হ'ল বৈশিষ্ট্য শাখার কার্য-অগ্রগতিতে প্রচুর পরিমাণে "এটি চেষ্টা করা যাক ... এটি কাজ করে না, এর সাথে এটি প্রতিস্থাপন করুন" এবং চূড়ান্ত "যে" কেবলমাত্র শেষ হওয়া ব্যতীত সমস্ত কমিটগুলি থাকতে পারে অযথা ইতিহাস দূষিত করা।

শেষ পর্যন্ত, ইতিহাসটি রাখা উচিত (এর কিছু ভবিষ্যতে কিছু ব্যবহার হতে পারে) তবে কেবল একটি "ক্লিন কপি" একত্রিত করা উচিত।

গিটের সাহায্যে এটি বৈশিষ্ট্য শাখাটি প্রথমে শাখার মাধ্যমে করা যেতে পারে (সমস্ত ইতিহাস ধরে রাখার জন্য), তারপরে (ইন্টারেক্টিভভাবে) মাস্টার থেকে ফিচার ব্রাঞ্চের শাখাটি ছাড়িয়ে এবং তারপরে রিবেসড ব্রাঞ্চ মার্জ করে।


1
কেবল স্পষ্ট করে বলার জন্য: আপনি যা বলছেন তা হ'ল বৈশিষ্ট্য-শাখার (একটি অনুলিপি) ইতিহাস পুনরায় লেখার জন্য, সুতরাং এটি একটি সংক্ষিপ্ত, পরিষ্কার ইতিহাস পেয়েছে - প্রাথমিক বিকাশের সমস্ত পিছনে ফেলে দেয়। এবং তারপরে, নতুন করে লেখা শাখাকে মাস্টারে মার্জ করা সহজ এবং ক্লিনার। আমি কি আপনাকে সঠিকভাবে বুঝতে পেরেছি?
স্ট্যান্ডব্যাক

1
হ্যাঁ. এবং আপনি যখন মাস্টারে মার্জ হয়ে যাবেন এটি কেবলমাত্র একটি দ্রুত এগিয়ে থাকবে (ধরে নিলে আপনি মার্জ করার আগে আপনাকে পুনরায় সাজিয়ে তোলেন)।
ডিপ্রেশনডানিয়েল

তবে কীভাবে এই ইতিহাস রাখা হয়? আপনি কি মূল বৈশিষ্ট্যটির শাখাটি শুয়ে থাকতে দিচ্ছেন?
পাওলো ইবারম্যান

@ PaŭloEbermann বিঙ্গো
ডিপ্রেশনডানিয়েল

ঠিক আছে, অন্য কেউ যেমন একটি মন্তব্যে বলেছিলেন: শাখাগুলি কেবল ইতিহাসের গ্রাফের মধ্যে পয়েন্টার gitএবং সেগুলি স্থানীয়। fooএকটি রেপোতে যা নামকরণ করা হয়েছে তার নাম অন্য একটিতে দেওয়া যেতে পারে bar। এবং এগুলি অস্থায়ী হতে বোঝায়: ইতিহাস হারিয়ে যাওয়া এড়াতে আপনি হাজার হাজার বৈশিষ্ট্যযুক্ত শাখাগুলি দিয়ে আপনার রেপোকে বিশৃঙ্খলা করতে চান না। ইতিহাসের রেফারেন্স রাখার জন্য আপনাকে সেই শাখাগুলি রাখা দরকার কারণ gitঅবশেষে কোনও শাখা দ্বারা অ্যাক্সেসযোগ্য নয় এমন কোনও প্রতিশ্রুতি মুছে ফেলবে।
21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.