গিট একীভূতিকে পূর্বাবস্থায় ফেলার সেরা উপায় কী যা রেপো থেকে ফাইলগুলি মুছে দেয়?


13

সুতরাং নিম্নলিখিত ঘটনাগুলি কল্পনা করুন (এবং আমরা সকলেই সোর্স ট্রি ব্যবহার করছি):

  1. আমরা সবাই আদি / বিকাশ বন্ধ রেখে কাজ করছি।
  2. আমি এক সপ্তাহের জন্য ছুটিতে যাই।
  3. আমার সহকর্মী তার স্থানীয় বিকাশ শাখায় ফিরে আসার / বিকাশ না করে স্থানীয় বেশ কয়েকদিন ধরে স্থানীয়ভাবে কাজ করছেন।
  4. সে একটি ধাক্কা দেওয়ার চেষ্টা করে, তাকে বলে যে তাকে প্রথমে মার্জ করতে হবে এবং তারপরে একটি টান পড়ে।
  5. তিনি একটি দ্বন্দ্ব পান, প্রক্রিয়া-পরে-এক-মার্জ-এর পরে স্বয়ংক্রিয় প্রতিশ্রুতি বন্ধ করে ping
  6. গিতটি এসভিএন-এর মতো বলে মনে করে, আমার সহকর্মী তার কার্যকরী অনুলিপিতে "নতুন" ফাইলগুলি ত্যাগ করেন এবং তারপরে সংযুক্তির প্রতিশ্রুতি দেয় - উত্স / বিকাশের প্রধান থেকে সেই "নতুন" ফাইলগুলি মুছে ফেলা হয়।
  7. এই সংশোধনীর শীর্ষে এক সপ্তাহের মূল্যমানের দেব কাজ চলছে।
  8. আমি ছুটি থেকে ফিরে এসে জানতে পারি যে বেশ কয়েকটি দিন আমার কাজ অনুপস্থিত।

আমরা সকলেই গিতের কাছে খুব নতুন (এটি আমাদের প্রথম প্রকল্প এটি ব্যবহার করে) তবে এটি ঠিক করার জন্য আমি যা করেছি তা হ'ল:

  1. "বিকাশ" কে "বিকাশ_পরে" নামকরণ করুন।
  2. বিকাশ_লোকটিকে একটি নতুন শাখায় "বিকাশ_ নতুন" এ মার্জ করুন।
  3. খারাপ একীভূত হওয়ার আগে শেষ প্রতিশ্রুতিতে বিকাশ_ নতুন শাখাটি পুনরায় সেট করুন।
  4. চেরি তখন থেকে প্রতিটি প্রতিশ্রুতি বাছাই করুন, একে একে একে হাতে কলহের সমাধান।
  5. উত্স পর্যন্ত বিকাশ_লোক এবং বিকাশ_কে পুশ করুন।

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

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


1
আপনি কি গিট গাছের স্ক্রিন শট পোস্ট করতে পারেন (যথাযথভাবে redacted) বা git logবিভিন্ন কমিটে কী ঘটেছে তা সম্পর্কে উপযুক্ত টীকা সহ আপনার প্রিয় ফর্ম্যাটটির আউটপুট ? (আমি রেড্যাক্ট / টিকা লিখতে git log --graph --pretty=oneline --abbrev-commitএবং সেখান থেকে যেতে চাই )

1
আপনার জন্য এটি খুব দেরী, কিন্তু ইউনিট পরীক্ষাগুলি এটি ধরা পড়ে যেত।
স্পষ্টভাবে

1
@ নেপলি: খারাপ সংশ্লেষ ইউনিট পরীক্ষাগুলি মোছা না হলে নয়।
অ্যারোনআট

বাহ, এটি সত্যিই প্রতারণামূলক দুর্ভাগ্য।
স্পষ্টভাবে

উত্তর:


6

আমি যদি সঠিকভাবে বুঝতে পারি তবে এটি আপনার অবস্থা:

    ,-c--c--c--c--M--a--a--X ← develop
o--o--y--y--y--y-´

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

git reset --hard develop M^2
git branch coworker M^1

আপনার গ্রাফটি খারাপ একীভূত হওয়ার আগে ঠিক দেখতে দেখতে:

    ,-c--c--c--c ← coworker
o--o--y--y--y--y ← develop

একটি ভাল মার্জ (জি) করুন:

git checkout develop
git merge coworker

ফলাফল এতে:

    ,-c--c--c--c-、
o--o--y--y--y--y--G ← develop

এখন অতিরিক্ত কমিটগুলি প্রতিস্থাপন করুন:

git reset --hard X
git rebase --onto G M develop

এটি চূড়ান্ত ফলাফল দেয়:

    ,-c--c--c--c-、
o--o--y--y--y--y--G--a--a--X ← develop

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

পিএস: অবশ্যই আপনার প্রতিস্থাপন করা উচিত G, Mএবং Xআপনার কম্যান্ডে সংশ্লিষ্ট কমিট আইডি দ্বারা।


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

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

1

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

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

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

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


আমি সম্মত হই, যদি পুরানো ফাইলগুলিতে ইতিহাসের বিষয়ে চিন্তা না করা হয় তবে পুরো ফাইলগুলি যদি এক জিনিস হয়ে যায় তবে আপনি যা করতে পারেন তা হ'ল: বর্তমানে বিশৃঙ্খল শাখা থেকে একটি নতুন শাখা তৈরি করুন। ২. খারাপ শাখায় ফিরে যান এবং আপনার নতুন উদ্ধার শাখা হ'ল নতুন একটি শাখা তৈরি করুন 3.. আপনার উদ্ধার শাখা থেকে ব্যর্থ প্রতিশ্রুতি দেওয়ার আগে কমিটে ফিরে যান। 4. মুছে ফেলা ফাইলগুলি গিটের বাইরে কোথাও অনুলিপি করুন 5. অন্যান্য নতুন শাখায় স্যুইচ করুন। The. মুছে ফেলা ফাইলগুলির নতুন সংস্করণটি নতুন শাখায় অনুলিপি করুন এবং প্রতিশ্রুতিবদ্ধ। ইতিহাস সংরক্ষণের আরও জটিল উপায় রয়েছে যা লিনাস টি
এলিন

1
প্রকৃতপক্ষে এটি দেখায় যে আপনি কীভাবে চেকআউটটি ব্যবহার করতে পারেন jasonrudolph.com/blog/2009/02/25/… এটি অনেক সুন্দর।
এলিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.