গিতে একটি উল্টানো মার্জ পুনরায় করণ


231

আমি এখানে কিছুটা সমস্যার সমাধান করেছি: 28sগিটে আমার একটি সমস্যা-সম্পর্কিত শাখা ছিল, আমি সাধারণ developশাখায় একীভূত হয়েছি । দেখা যাচ্ছে আমি এটি খুব দ্রুত করেছিলাম তাই আমি মার্জটি পূর্বাবস্থায় ফিরতে গিট-রিভার্ট ব্যবহার করেছি। এখন অবশ্য সময় একত্রীকরণ এসেছে 28sমধ্যে developকিন্তু Git-একত্রীকরণ কমান্ড মূল একত্রীকরণ দেখেন এবং সুখে ঘোষণা সব ঠিক এবং শাখা ইতিমধ্যে হয়েছে মার্জ যে। আমি এখন কী করব? একটি 'রিভার্ট "রিভার্ট" 28 এস তৈরি করুন -> বিকাশ "" "কমিট? এটি করার ভাল উপায় বলে মনে হয় না, তবে আমি এই মুহূর্তে অন্য কোনও কল্পনা করতে পারি না।

গাছের কাঠামোর চেহারা কেমন:

গিট লগ আউটপুট


4
এটি গিটএক্স ( gitx.frim.nl )।
টমস মিকোস

উত্তর:


169

আপনাকে "রিভার্টটি ফিরতে হবে"। আপনার উপর নির্ভর করে আসলটি কীভাবে ফিরে গেছে, এটি যতটা শোনাচ্ছে তত সহজ নয়। তাকান এই বিষয়ে সরকারী নথি

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

অনুমতি দিতে:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

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

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

যদি যথাসম্ভব সম্ভব হয়, উদাহরণস্বরূপ, আপনি যদি এমন কোনও সমস্যা খুঁজে পান যা মুল গাছের সাথে একত্রীভূত হয়ে মার্জটিকে পরিবর্তিত করার পরিবর্তে সত্য করে নিন তবে :

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

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


10
ভাল লিঙ্ক (+1)। পাঠকদের এই ক্ষেত্রে প্রাসঙ্গিক বিকল্পগুলি অবিলম্বে দেখার অনুমতি দেওয়ার জন্য আমি আপনার উত্তরে নথির কিছু অংশ অনুলিপি করার স্বাধীনতা নিয়েছি। আপনি যদি একমত না হন তবে নির্দ্বিধায় ফিরে যান।
ভনসি

5
আমরা সবেমাত্র এমন একটি ক্ষেত্রে ছুঁড়েছি যেখানে আমাদের এটি করার দরকার হয়েছিল এবং আমরা দেখতে পেয়েছি যে মজা এখানে থামবে না। এটি একটি দীর্ঘ চলমান শাখা যা একত্রীকরণ করা হয়েছিল, সুতরাং আমাদের এটি আপডেট করা চালিয়ে যাওয়া দরকার। এখানে আমার পদ্ধতির: tech.patientslikeme.com/2010/09/29/…
jdwyah

আমি @ jdwyah এর ব্লগ পোস্ট অনুসরণ করেছি এবং এটি গৌরবময় ছিল (গম্ভীরভাবে, এটি সবেমাত্র কার্যকর হয়েছিল তা দুর্দান্ত ছিল)।
হেল্লাতান

2
@jdwyah যা ভাঙা লিঙ্ক বলে মনে হচ্ছে, তবে এটি একটি আকর্ষণীয় পঠনের মতো মনে হচ্ছে। এখানে একটি আর্কাইভ.org আয়না রয়েছে তবে এটি চিত্রগুলি নিখোঁজ রয়েছে: web.archive.org/web/20111229193713/http://…
অ্যালেক্স কীস্মিত

15
ব্লগ পোস্টটি পুনরুত্থিত হয়েছে, ধন্যবাদ: blog.jdwyah.com/2015/07/dealing-with-git-
विस

53

আসুন ধরে নেওয়া যাক আপনার যেমন ইতিহাস আছে

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

যেখানে A, B ব্যর্থ হয়েছে এবং ডাব্লু - এম এর বিপরীতে রয়েছে

সুতরাং আমি সমস্যাগুলি সমাধান করা শুরু করার আগে আমি আমার শাখায় ডাব্লু কমিটের চেরি-পিক করি

git cherry-pick -x W

তারপরে আমি আমার শাখায় ডাব্লু কমিট ফিরিয়ে দিই

git revert W 

আমি ফিক্সিং চালিয়ে যেতে পারেন পরে।

চূড়ান্ত ইতিহাসটি দেখতে পারে:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

আমি যখন জনসংযোগ প্রেরণ করি তখন এটি স্পষ্টভাবে দেখায় যে পিআর পূর্বাবস্থায় ফিরে আসে এবং কিছু নতুন কমিট যোগ করে।


3
দেখে মনে হচ্ছে এটি সহায়ক হতে পারে তবে বিশদ বিবরণে এত কম স্পর্শকাতর (শেষ চিত্রটিতে সি, ডি কী) এটি
দরকারীের

4
@ আইসোক্রোনাস সি এবং ডি কমিট বলে মনে হচ্ছে যা এ এবং বি দ্বারা প্রবর্তিত সমস্যাগুলির সমাধান করে
টমাস


এটি ভাল যে আপনি এই বারে একটি PR ব্যবহার করে হাইলাইট করেছেন কারণ এটি মাস্টারটিতে ফিরে যাওয়ার আগে একটি চূড়ান্ত 'স্যানিটি চেক' সরবরাহ করতে পারে।
উইলেম ভ্যান কেটভিচ 5'19

আপনি কেন ডাব্লু থেকে আপনার শাখাটি পুনরায় চালু করবেন? যেমন, আপনার বিষয় ডাব্লু থেকে চালিয়ে দেওয়া যাক, ডাব্লু এর সাথে সি এবং ডি অনুসরণ করবে? এটি কিছু সদৃশ অপসারণ করে
এরিক কারস্টেনসেন

12

আপনার কর্মপ্রবাহকে খুব বেশি স্ক্রু না করে পুনঃস্থাপনের জন্য:

  • বিকাশের স্থানীয় ট্র্যাশ কপি তৈরি করুন
  • বিকাশের স্থানীয় অনুলিপিতে রিভার্ট কমিট রিভার্ট করুন
  • আপনার বৈশিষ্ট্য শাখায় সেই অনুলিপিটি মার্জ করুন এবং আপনার বৈশিষ্ট্য শাখাটিকে আপনার গিট সার্ভারে ঠেলাবেন।

আপনার বৈশিষ্ট্য শাখাটি এখন আপনি যখন প্রস্তুত থাকেন তখন স্বাভাবিক হিসাবে মার্জ করতে সক্ষম হওয়া উচিত। এখানে কেবলমাত্র খারাপ দিকটিই হ'ল আপনার ইতিহাসে কয়েকটি অতিরিক্ত সংযুক্তি / ফেরতের প্রতিশ্রুতি থাকতে হবে।


আর কোনও মিশ্রণগুলি প্রতিরোধ করার জন্য আমি আমার বৈশিষ্ট্য শাখার একটি 'আবর্জনা' অনুলিপিও তৈরি করেছিলাম এবং এতে রূপান্তরিত বিকাশকে একত্রিত করেছিলাম।
jhhwilliams

ধন্যবাদ! এটিই হ'ল একমাত্র উত্তর যা আপনাকে এটি করা উচিত নয় পরিবর্তে এটি কীভাবে করবেন তা ব্যাখ্যা করে explains সত্যিই সহায়ক।
এমি

আপনাকে ধন্যবাদ, এটি সত্যই আমাকে সাহায্য করেছিল। :)
ড্যানিয়েল স্ট্রাকাবোস্কো

11

জিআইটিতে কোনও প্রত্যাবর্তন ফিরিয়ে আনতে:

git revert <commit-hash-of-previous-revert>

1
আমার কাজের শাখায় এটি ব্যবহার করে রিভার্টটি ফিরিয়ে আনতে হবে, তারপরে নতুন পিআর বিকাশ করতে হবে। পূর্ববর্তী পিআর-এ ফিরিয়ে দেওয়া সমস্ত পরিবর্তন এখন গিট দেখায়। ধন্যবাদ।
ডানস্তান

3

ব্যবহার git-revertনা করে আপনি এই কমান্ডটি develশাখায় ব্যবহার করতে পারতেন ভুল সংযুক্তি প্রতিশ্রুতি (কেবলমাত্র এটি পুনরায় পরিবর্তনের পরিবর্তে) ফেলে দিতে (পূর্বাবস্থায় ফেরা)।

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

এটি সেই অনুযায়ী কার্যকরী ডিরেক্টরিতে থাকা সামগ্রীগুলিও সামঞ্জস্য করবে। সাবধান :

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

আমি git-resetচেষ্টা করার আগে ম্যান-পৃষ্ঠা সাবধানে অধ্যয়ন করার পরামর্শ দিই ।

এখন, রিসেটের পরে আপনি নিজের পরিবর্তনগুলি আবার প্রয়োগ করতে পারেন develএবং তারপরেও করতে পারেন

git checkout devel
git merge 28s

এটি প্রাথমিকের মতো (যা এখন গিটের ইতিহাস থেকে মুছে ফেলা হয়) এর মতো হয়ে 28sউঠতে পারে adevel


8
যে কেউ গিটের সাথে অতি পরিচিত নয় এবং এই নির্দেশাবলীটি অনুসরণ করতে চাইতে পারেন: সংমিশ্রণের সাথে যত্নবান reset --hardএবং push origin। এছাড়াও সচেতন থাকুন উত্সের দিকে এগিয়ে আসা কোনও শক্তি গিটহাবের ওপেন পিআরএসকে সত্যই আপ করতে পারে।
21

একটি বেসরকারী গিট সার্ভারে কিছু সংহত ইস্যু সমাধানের জন্য খুব সহায়ক। ধন্যবাদ!
মিশন

1
এই কৌশলটির জন্য +1। সম্ভাব্য ধ্বংসাত্মক, তবে যুক্তিযুক্তভাবে প্রয়োগ করা গেলে আপনাকে প্রচুর মাথা ব্যাথা (এবং একটি ম্যাঙ্গেলড ইতিহাস) বাঁচাতে পারে।
সিলিকনরোক স্টার

1

একই সমস্যার মুখোমুখি হয়ে আমি এই পোস্টটি সন্ধান করেছি। আমি পুনরায় হার্ডগুলি ইত্যাদি করতে ভীতি প্রদর্শন করার উপক্রম করেছি I'll

পরিবর্তে আমি প্রতিশ্রুতিটি পরীক্ষা করে দেখেছি আমি শাখাটি উদাহরণস্বরূপ ফিরে যেতে চাই git checkout 123466t7632723। তারপরে একটি শাখায় রূপান্তরিত git checkout my-new-branch। আমি তখন আর শাখাটি মুছতে চাইনি। অবশ্যই এটি কেবল তখনই কাজ করবে যদি আপনি যে শাখাটি গোলযোগ করেছিলেন তা ফেলে দিতে সক্ষম হন।


1
git reflogআপনি পরে আপনি হারিয়ে করে প্রয়োজন আবিষ্কার ক্ষেত্রে কয়েক মাস জন্য একটি হার্ড রিসেট আপনাকে সুরক্ষিত রাখতে হবে। রিফ্লোগটি আপনার স্থানীয় রেপো সীমাবদ্ধ।
টড

1

আমি আপনাকে একটি রিভার্ট ফিরিয়ে আনতে নীচের পদক্ষেপগুলি অনুসরণ করার পরামর্শ দিচ্ছি, এসএএএ 1 বলুন।

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

এখন শাখার জন্য পিআর তৈরি করুন users/yourname/revertOfSHA1


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

এই মুহুর্তে আপনার একটি পরিষ্কার 'বিকাশ' শাখা থাকবে যাতে আপনি নিয়মিত করার মতো করে আপনার বৈশিষ্ট্য ব্র্যাচটি মার্জ করতে পারেন।


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