একটি গিট মার্জ কমিটিকে মুক্তি দেওয়া


183

নিম্নলিখিত ক্ষেত্রে নিন:

আমার একটি টপিক শাখায় কিছু কাজ আছে এবং এখন আমি আবার মাস্টারের সাথে একীভূত হতে প্রস্তুত:

* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/  
* 38abeae 1

আমি মাস্টার থেকে মার্জ সম্পাদন করি, দ্বন্দ্বগুলি সমাধান করি এবং এখন আমার কাছে রয়েছে:

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/  
* 38abeae 1

এখন, মার্জটি আমাকে কিছুটা সময় নিয়েছে তাই আমি আরও একটি আনয়ন করি এবং লক্ষ্য করেছি যে রিমোট মাস্টার শাখায় নতুন পরিবর্তন হয়েছে:

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

আমি যদি মাস্টারের কাছ থেকে 'গিট রিবেস আদি / মাস্টার' চেষ্টা করি তবে আমি সমস্ত দ্বন্দ্ব পুনরায় সমাধান করতে বাধ্য হই এবং আমি একীভূত প্রতিশ্রুতিও হারিয়ে ফেলি:

* d4de423 2       [master]
* e7affba 4       [origin/master]
* eb3b733 3
| * b62cae6 2     [topic]
|/  
* 38abeae 1

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

*   51984c7 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | e7affba 4                     [origin/master]
* | eb3b733 3
|/  
* 38abeae 1

74
টিএল; ডিআর:git rebase --preserve-merges origin/master
ইলিয়া কে।

6
দ্বন্দ্বগুলি পুনরায় সমাধানের বিষয়ে সম্মানের সাথে, আপনি গিটারের পুনর্বিবেচনাগুলি একবার দেখে নিতে পারেন ।
পার্কার কোটস

git config --global pull.rebase preserve একটি রিবেস চলাকালীন সর্বদা মার্জ
কমিটিকে

4
সতর্কতা: গিট 2.18 দিয়ে শুরু (5 বছর পরে Q2 2018), git --rebase-mergesশেষ পর্যন্ত পুরানোটিকে প্রতিস্থাপন করবে git --preserve-mergesrebase --preserve-merges
গিতের

1
--preserve-mergesঅবচয় করা হয়। ব্যবহারgit rebase --rebase-merges origin/master
অর্জুন শ্রীধরন

উত্তর:


126

এখানে দুটি বিকল্প রয়েছে।

একটি হ'ল একটি ইন্টারেক্টিভ রিবেস করা এবং মার্জ কমিট সম্পাদনা করা, ম্যানুয়ালি ম্যানুয়ালি পুনরায় করা এবং রিবেসটি চালিয়ে যাওয়া।

অপরটি হ'ল --rebase-mergesঅপশনটি ব্যবহার করা git rebase, যা ম্যানুয়াল থেকে নিম্নলিখিত হিসাবে বর্ণিত হয়েছে: "ডিফল্টরূপে, একটি রিবেসটি কেবলমাত্র টোডো তালিকা থেকে মার্জ কমিটগুলি বাদ দেবে, এবং রিবেসড কমিটসকে একটি একক, রৈখিক শাখায় রাখবে rerebase- সহ সংশ্লেষ, পুনর্বাসনের পরিবর্তে মার্জ কমিটি পুনর্নির্মাণের মাধ্যমে পুনর্বাসনের জন্য করা কমিটগুলির মধ্যে শাখা কাঠামো সংরক্ষণের চেষ্টা করবে these এই সংযুক্তি সংক্রান্ত যে কোনও সংশোধিত সংঘাত বা ম্যানুয়াল সংশোধনগুলি ম্যানুয়ালি সমাধান করতে হবে / পুনরায় প্রয়োগ করতে হবে। "


16
আমি -p বিকল্পটি চেষ্টা করেছিলাম, এবং এটি আমার ইচ্ছা মতো কমিটের ইতিহাস ছেড়ে দেয়, তবে এটি আমাকে দ্বন্দ্বগুলি আবারও সমাধান করতে বাধ্য করে, এমনকি এমন ফাইলগুলিতেও যা উত্স / মাস্টার সম্পাদিত হয়নি। আপনার প্রথম পরামর্শ হিসাবে, কমান্ডের যথাযথ ক্রম হবে?
jipumarino

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

2
ধন্যবাদ। আমি রিরেজ সক্ষম করেছিলাম এবং রিবেস-পি দিয়ে চেষ্টা করেছি এবং এটি যেমনটি করা উচিত তেমন কাজ করছে।
jipumarino

3
এই সঠিক পরিস্থিতিটি বর্ণনা করার জন্য এখানে একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে:
গিটে

1
রিয়ার সমাধান নয়, কারণ আপনাকে এখনও প্রথমবারের মতো ম্যানুয়ালি ম্যানুয়ালি সমাধান করতে হবে।
ফ্লিম্ম

29

ঠিক আছে, এটি একটি পুরানো প্রশ্ন এবং এটি ইতিমধ্যে উত্তর গ্রহণ করেছে @siride, তবে উত্তরটি আমার ক্ষেত্রে যথেষ্ট ছিল না, কারণ --preserve-mergesআপনাকে দ্বিতীয়বার সমস্ত দ্বন্দ্ব সমাধান করতে বাধ্য করে। আমার সমাধানটি ধারণাটির উপর ভিত্তি করে @Tobi Bকিন্তু সঠিক ধাপে ধাপে কমান্ড সহ

সুতরাং আমরা প্রশ্নের মধ্যে উদাহরণের ভিত্তিতে এই জাতীয় অবস্থা শুরু করব:

*   8101fe3 Merge branch 'topic'  [HEAD -> master]
|\  
| * b62cae6 2                     [topic]
| |
| | * f5a7ca8 5                   [origin/master]
| | * e7affba 4
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

মনে রাখবেন যে আমাদের কাছে মাস্টার্সের 2 জন এগিয়ে রয়েছে তাই চেরি-পিক কাজ করবে না।

  1. প্রথমত, আসুন আমরা চাই সঠিক ইতিহাস তৈরি করুন:

    git checkout -b correct-history # create new branch to save master for future
    git rebase --strategy=ours --preserve-merges origin/master
    

    আমরা --preserve-mergesইতিহাসে আমাদের মার্জ কমিটিকে সংরক্ষণ করতে ব্যবহার করি । আমরা --strategy=oursসমস্ত মার্জ সংঘাত উপেক্ষা করার জন্য ব্যবহার করি কারণ আমরা এই মার্জ কমিটে কী কী বিষয়বস্তু থাকবে তা নিয়ে চিন্তা করি না, আমাদের কেবল এখনই সুন্দর ইতিহাস প্রয়োজন।

    ইতিহাস এর মতো দেখায় (মাস্টারকে উপেক্ষা করে):

    *   51984c7 Merge branch 'topic'  [HEAD -> correct-history]
    |\  
    | * b62cae6 2                     [topic]
    * | f5a7ca8 5                     [origin/master]
    * | e7affba 4
    * | eb3b733 3
    |/  
    * 38abeae 1
    
  2. আসুন এখন সঠিক সূচী পাওয়া যাক।

    git checkout master # return to our master branch
    git merge origin/master # merge origin/master on top of our master
    

    আমরা কিছু অতিরিক্ত একত্রীকরণ এখানে সঙ্ঘাত পেতে পারেন, কিন্তু যে একমাত্র মধ্যে পরিবর্তিত ফাইল থেকে দ্বন্দ্ব হবে 8101fe3এবং f5a7ca8, কিন্তু না ইতিমধ্যে থেকে দ্বন্দ্ব মীমাংসা অন্তর্ভুক্তtopic

    ইতিহাস এর মতো দেখাবে (সঠিক ইতিহাস উপেক্ষা করে):

    *   94f1484 Merge branch 'origin/master'  [HEAD -> master]
    |\  
    * | f5a7ca8 5                   [origin/master]
    * | e7affba 4
    | *   8101fe3 Merge branch 'topic'
    | |\  
    | | * b62cae6 2                     [topic]
    |/ /
    * / eb3b733 3
    |/  
    * 38abeae 1
    
  3. শেষ পর্যায়টি হ'ল আমাদের শাখাকে সঠিক ইতিহাসের সাথে এবং সঠিক সূচকের সাথে শাখাটি একত্রিত করা

    git reset --soft correct-history
    git commit --amend
    

    আমরা reset --softআমাদের শাখা (এবং ইতিহাস )টিকে সঠিক-ইতিহাসে পুনরায় সেট করতে ব্যবহার করি , তবে সূচক এবং কার্যক্ষম গাছটি তেমন রেখে দেই । তারপরে আমরা commit --amendআমাদের মার্জ কমিটিকে নতুন করে লিখতে ব্যবহার করি , যা মাস্টারের কাছ থেকে আমাদের ভাল সূচক সহ ভুল সূচক ছিল।

    শেষ পর্যন্ত আমাদের এ জাতীয় অবস্থা থাকবে (শীর্ষ প্রতিশ্রুতির আরেকটি আইডি নোট করুন):

    *   13e6d03 Merge branch 'topic'  [HEAD -> master]
    |\  
    | * b62cae6 2                     [topic]
    * | f5a7ca8 5                     [origin/master]
    * | e7affba 4
    * | eb3b733 3
    |/  
    * 38abeae 1
    

এটি দুর্দান্ত এবং অনেক সাহায্য! কিন্তু আমি প্রতিশ্রুতিবদ্ধ - তাত্পর্যপূর্ণ কৌশলটি পাইনি: আপনি কি এই বিষয়ে আরও তথ্য যুক্ত করতে পারেন? আপনি এটি চালানোর পরে ঠিক কী ঘটেছিল - আমি লক্ষ্য করেছি কমিটের এসএএএ বদলে গেছে - তবে কেন? বা আপনি যদি এটি চালনা না করেন তবে কী ঘটে?
জেনজে

1
@ জেনজে git commit --amendসর্বশেষ প্রতিশ্রুতি (শিরোনাম, এই ক্ষেত্রে মার্জ কমিট) এর পরিবর্তনগুলি যুক্ত করে। প্রতিশ্রুতিবদ্ধ সামগ্রী পরিবর্তিত হওয়ায় হ্যাশ আপডেট হয়েছে updated
শুকনো স্টেইলেন্স

1
দ্বন্দ্ব সংশোধন করার আগে যাদের 'পুনরায়' সক্ষম করা হয়নি তাদের পক্ষে, এই সমাধানটি দুর্দান্ত কারণ এটি আপনাকে পুনরায় সংঘাতের সমাধান থেকে বাঁচায়। ধন্যবাদ!
শ্যাকলফোর্ড

6

প্রদত্ত যে আমি এইটা বের করার চেষ্টা করে মাত্র একটি দিন হারিয়েছি এবং সহকর্মীর সাহায্যে আসলে একটি সমাধান পেয়েছি, আমি ভেবেছিলাম আমার চিমটি দেওয়া উচিত।

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

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

সুতরাং আমার "মার্জ" আমার "পুনরায়" করা দরকার।

অবশেষে আমরা এটি কীভাবে করেছি:

1) এসএএএ নোট করুন। প্রাক্তন .: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

git log -1

2) সঠিক ইতিহাস তৈরি করুন তবে এটি একীভূত হয়ে যাবে।

git rebase -s ours --preserve-merges origin/master

3) এসএএএ নোট করুন। প্রাক্তন .: 29dd8101d78

git log -1

4) এখন আপনি যেখানে ছিলেন সেখানে পুনরায় সেট করুন

git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard

৫) এখনকার মাস্টারকে আপনার ওয়ার্কিং শাখায় মার্জ করুন

git merge origin/master
git mergetool
git commit -m"correct files

)) এখন আপনার কাছে সঠিক ফাইল রয়েছে তবে ভুল ইতিহাস রয়েছে, আপনার পরিবর্তনের শীর্ষে সঠিক ইতিহাসটি এর সাথে পান:

git reset 29dd8101d78 --soft

)) এবং তারপরে - ফলাফলগুলি আপনার মূল সংশ্লেষের প্রতিশ্রুতিবদ্ধ করে

git commit --amend

ভাল খবর!


1

দেখে মনে হচ্ছে আপনি যা করতে চান তা হ'ল আপনার প্রথম মার্জটি সরান। আপনি নিম্নলিখিত পদ্ধতি অনুসরণ করতে পারেন:

git checkout master      # Let's make sure we are on master branch
git reset --hard master~ # Let's get back to master before the merge
git pull                 # or git merge remote/master
git merge topic

যা আপনি চান আপনি দিতে হবে।


4
পুনরায় সক্ষম সহ, এটি স্যারাইডের দ্বারা উপরে প্রদত্ত রিবাজে-পি সমাধানের মতো একই ফলাফল দেয় বলে মনে হয়।
jipumarino

0
  • আপনার মার্জ কমিট থেকে
  • চেরি-বেছে নিন নতুন পরিবর্তন যা সহজ হওয়া উচিত
  • আপনার জিনিসগুলি অনুলিপি করুন
  • আপনার স্থানীয় অনুলিপি থেকে কেবল ফাইলগুলি অনুলিপি করে মার্জটি পুনরায় করুন এবং বিরোধগুলি সমাধান করুন;)

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