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


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.