গিটের অন্য শাখার উপর ভিত্তি করে নির্দিষ্ট কমিটগুলি কীভাবে সরিয়ে নেওয়া যায়?


381

পরিস্থিতি:

  • মাস্টার এক্স এ
  • কুইকফিক্স 1 এক্স + 2 কমিটে রয়েছে

যেমন যে:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

তারপরে আমি কুইকফিক্স 2-এ কাজ শুরু করেছিলাম, তবে দুর্ঘটনাক্রমে কুইকফিক্স 1টি মাস্টার হিসাবে নয়, অনুলিপি করার জন্য উত্স শাখা হিসাবে নিয়েছে। এখন কুইকফিক্স 2 এক্স + 2 কমিট + 2 প্রাসঙ্গিক কমিটে রয়েছে

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

এখন আমি কুইকফিক্স 2 সহ একটি শাখা রাখতে চাই, তবে কুইকফিক্স 1 এর সাথে সম্পর্কিত 2 টি কমিট ছাড়াই।

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

আমি কুইকফিক্স 2 এ একটি নির্দিষ্ট সংশোধন থেকে একটি প্যাচ তৈরি করার চেষ্টা করেছি, কিন্তু প্যাচ কমিটের ইতিহাস সংরক্ষণ করে না। আমার প্রতিশ্রুতিবদ্ধ ইতিহাস সংরক্ষণ করার উপায় আছে কি, তবে কুইকফিক্স 1 এ পরিবর্তন ছাড়াই একটি শাখা আছে?



8
@ কেভিন এই প্রশ্নটিতে কেবল এক শাখা থেকে অন্য শাখায় কমিটগুলি সরিয়ে নেওয়ার বিষয়ে জিজ্ঞাসা করা হয়েছে, এটির কমিটগুলি অন্তর্ভুক্ত না করার অতিরিক্ত প্রয়োজনীয়তা রয়েছে quickfix1। (উত্তরের পার্থক্যের বিষয়টিও নোট করুন))
— স্কট ওয়েলডন

উত্তর:


372

এটি একটি সর্বোত্তম ক্ষেত্রে rebase --onto:

 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2 

সুতরাং আপনি থেকে যাওয়া উচিত

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

প্রতি:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

এটি সর্বোত্তমভাবে পরিষ্কার পরিচ্ছন্ন গাছে করা হয়।
দেখুনgit config --global rebase.autostash true , বিশেষত গিট ২.১০ এর পরে ।


24
সাবধান হন যে এই পদক্ষেপগুলি কুইকফিক্স 2 এর ইতিহাসকে সংশোধন করবে, সুতরাং আপনি ইতিমধ্যে শাখাটি ভাগ করে নিলে পরিবর্তে চেরি-পিকিং ব্যবহার করুন (নিম্নলিখিত উত্তরগুলি দেখুন)।
— সর্বোচ্চ চের্নিয়াক

শুধু রেকর্ডের জন্য: SmartGit এর লগ শুধু ড্র্যাগ সঙ্গে q2aসম্মুখের Xনির্বাচন রি-বেসের ফলে 2 করে ঘটছে ডায়ালগের অপশন থেকে।
— টমাস এস

1
@ThomasS। মজাদার. এটি একটি এর একটি দুর্দান্ত জিইউআই বাস্তবায়ন git rebase --onto।
— ভোনসি

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

1
@ কোসাইন সম্মত। rebase.autostashকনফিগারেশনে রেফারেন্স যুক্ত করার জন্য আমি আমার উত্তর সম্পাদনা করেছি : যা রিবেস করার সময় কাজের গাছের কোনও অগ্রগতিতে কোনও ক্ষতি হ্রাস পাবে।
— ভোনসি

155

আপনি git cherry-pickযে প্রতিশ্রুতি অনুলিপি করতে চান তা চয়ন করতে আপনি ব্যবহার করতে পারেন ।

সম্ভবত সবচেয়ে ভাল উপায় হ'ল মাস্টার থেকে শাখা তৈরি করা, তারপরে সেই শাখায় git cherry-pickআপনি চাইলে কুইকফিক্স 2 থেকে কমিট করেন।


আপনি যদি কেবল একটি প্রতিশ্রুতি সরিয়ে নিতে চান তবে এটি সেরা বিকল্প is ধন্যবাদ।
— অ্যালেক্স

142

সবচেয়ে সহজ জিনিসটি আপনি করতে পারেন চেরি একটি ব্যাপ্তি বাছাই। এটি একইর মতো করে rebase --ontoতবে চোখের জন্য সহজ :)

git cherry-pick quickfix1..quickfix2

6
এছাড়াও, এটি আইওইউসি-র মূল প্রতিশ্রুতিগুলি হারাবে না, সুতরাং আমার মতো "প্লে-ইট-সেফস" এর চেয়ে ভাল বলে মনে হয়;) বা rebase --ontoমূল পরিবর্তনগুলিও সংরক্ষণ করে?
— উকভেল

6
উভয়ই rebaseএবং cherry-pickআপনাকে নতুন এসএএএ কী দেয়। এটি কারণ প্রতিটি প্রতিশ্রুতি সংগ্রহস্থলের একটি অনন্য স্ন্যাপশট।
— ক্রিস্টোফ

6
কি বোঝানো @akavel যে চেরি-বাছুন তাদের শাখায় মূল করে যা সত্য রাখা হবে
— Mr_and_Mrs_D

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

3
git checkoutএখানে গুরুত্বপূর্ণ। আপনার মাথা কি :)?
— সাওওমির লেনার্ট

28

আমি বিশ্বাস করি এটি:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2

3
cherry-pickকমিট হ্যাশ দিয়ে কাজ করে তাই, আপনি যদি কেবল কোথাও থেকে কোনও প্রতিশ্রুতি গ্রহণ করতে এবং এটি অন্য কোথাও রাখতে চান তবে এই উপায়। আপনি checkout <branch>প্রথমে সঠিক শাখার কাজটি নিশ্চিত করেছেন তা নিশ্চিত করুন ।
— জন লিডেগ্রেন

-1
// on your branch that holds the commit you want to pass
$ git log
// copy the commit hash found
$ git checkout [branch that will copy the commit]
$ git reset --hard [hash of the commit you want to copy from the other branch]
// remove the [brackets]

ব্যাখ্যা সহ এখানে আরও দরকারী কমান্ড: গিট গাইড

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