ভুল শাখার দিকে ধাক্কা


100

গিটের সাথে কাজ করা, কিছু 'কমিট' করার পরে এবং 'ধাক্কা' দেওয়ার পরে, আমি বুঝতে পারি যে ভুল শাখাটি ব্যবহার করছি!

এখন আমাকে কোনওভাবে ভুল_ব্রাঞ্চের আমার পরিবর্তনগুলি সরিয়ে ফেলতে হবে এবং ডান_ ব্র্যাঙ্কের পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করতে হবে এবং চাপ দিতে হবে

এটি করার সর্বোত্তম (এবং সহজ) উপায় কী?

ধন্যবাদ



ভাল প্রশ্ন @ টোকল্যান্ড: 99% রুবি বিকাশকারীরা গিট ব্যবহার করেন এবং আমি যে প্রকল্পটি নিয়ে কাজ করছি তা আরআর-তে রয়েছে ... তবে আমি জানি এটি ভাল অনুপ্রেরণা হতে পারে না
আলেসান্দ্রো ডি সিমোন

4
আমার দৃষ্টিকোণ থেকে, এটি অর্ধদান যে মন্তব্য করেছে তার সদৃশ নয়, কারণ এটি কেবল অপসারণ না করে অন্য শাখায় প্রতিশ্রুতিবদ্ধ হওয়া সম্পর্কেও।
ওলেঞ্জ

উত্তর:


146

এই শাখায় স্যুইচ করুন, যাচাই করুন git logএবং git revertস্বতন্ত্রভাবে কমিট করেন। এটি হয়ে গেলে, পছন্দসই শাখায় ফিরে যেতে পারেন এবং সেখানে আপনি git cherry-pickগিট রেফগুলি থেকে নির্দিষ্ট কমিটগুলি বেছে নিতে এবং ডান শাখায় মার্জ করতে পারেন।

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

যদি কমিটগুলি একসাথে গোষ্ঠীভুক্ত করা হয় এবং আপনার নোংরা প্রতিশ্রুতির পরে যদি কোনও কমিটস ঠেলাঠেলি না করে থাকে, আপনি এমনকি নিজের git resetভুল করার আগে এই ভুল শাখাটিকে একটি রাজ্যে নিয়ে যেতে পারেন এবং তারপরে git cherry-pickআপনার কমিটগুলি ডান শাখায় আনার জন্য আবার তা অনুসরণ করতে পারেন।

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

রিভার্ট + চেরি-পিক মাথা পুনরায় সেট করা এবং / অথবা রিবাজিং সম্পর্কিত অন্যান্য সম্ভাব্য পদ্ধতির চেয়ে অনেক সহজ বলে মনে হচ্ছে।
ChrisV 20'13

4
গিট চেরি-পিকের জন্য আপনি একক লাইনে একাধিক শে রাখতে পারেন, অর্থাত্‍ git cherry-pick commitsha1 commitsha2
থমাসডাব্লু

লাইফসেভার! এবং জটিল নয়। ধন্যবাদ!
ক্রেগ সিলভার

(যেমন বৈশিষ্ট্য / এক্স) কি (যেমন বিকাশ) right_branch মধ্যে ঘটে একত্রীকরণ wrong_branch যখন আপনি চান তারপর আপনি ফেরত্ পাওয়া যাবে তবে আপনি যে পরিবর্তনগুলি চেরি উত্পাটন করা পূর্বাবস্থায় ফিরিয়ে আনার পেতে।
timB33

revertresetআপনি যদি সত্যিই সংবেদনশীল কিছু (শংসাপত্রগুলি) মুছতে না চান তবে তার চেয়ে অনেক বেশি পরিচ্ছন্ন এবং কম নাটকীয়
প্রশ্নটি

3

সহজ উপায় ব্যবহার করা হয় git rebase। মনে করুন যে আপনার সেটিংস রয়েছে:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

আপনি পরিবর্তন সি 3, সি 4 ডান শাখায় স্থানান্তর করতে চান।

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

এখন সেটিং হয়

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

তারপরে আপনাকে আপনার ফলাফলগুলি জোর দিয়ে চাপতে হবে (যদি এখনও কেউ আপনার দূরবর্তী রেপোর সাথে সুসংগত না হয়ে থাকে):

git push -f remote:right_branch

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

4
পরিবর্তে git push -f, আরও ভাল ব্যবহার git push --force-with-lease। কমপক্ষে, এটি নিশ্চিত করে যে রিমোট রেফার শুধুমাত্র তখনই আপডেট করা হবে যদি কেউ আপনার কমিটের শীর্ষে অন্য প্রতিশ্রুতিগুলি ঠেলে না।
পিয়েরে-অলিভিয়ের ভারেস

2

ধ্রুব এর উত্তরে কিছুটা শর্টকাট যুক্ত করছে

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.