কীভাবে ভুল গিট শাখায় প্রতিশ্রুতিবদ্ধতা ঠিক করবেন?


621

আমি ঠিক ভুল শাখায় পুরোপুরি ভাল প্রতিশ্রুতিবদ্ধ করেছি। আমি কীভাবে আমার মাস্টার শাখায় শেষ প্রতিশ্রুতি পূর্বাবস্থায় ফিরিয়ে আনতে পারি এবং তারপরে সেই একই পরিবর্তনগুলি নিয়ে তা আমার আপগ্রেড শাখায় নিয়ে যেতে পারি?

উত্তর:


975

আপনি যদি এখনও নিজের পরিবর্তনগুলি না ঠেকেন তবে আপনি একটি সফট রিসেটও করতে পারেন:

git reset --soft HEAD^

এটি প্রতিশ্রুতি ফিরিয়ে দেবে, তবে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি আপনার সূচীতে ফিরিয়ে দেবে। একে একে একে একে শাখা তুলনামূলকভাবে আপ-টু-ডেট রয়েছে বলে ধরে নেওয়া, গিট আপনাকে অন্য শাখায় একটি চেকআউট করতে দেবে, যার পরে আপনি কেবল প্রতিশ্রুতিবদ্ধ করতে পারেন:

git checkout branch
git commit

অসুবিধাটি হ'ল আপনার প্রতিশ্রুতি বার্তাটি পুনরায় প্রবেশ করা দরকার।


10
নোট রিসেট আপনার পরিবর্তনগুলি পর্যায়ক্রমে এবং প্রতিশ্রুতিবদ্ধ প্রস্তুত রাখুন নোট করুন। যখন আমার আইডিই ফাইলগুলি নরম পুনরায় সেট করার পরে পরিবর্তিত অবস্থায় ফিরে আসে না তখন আমাকে কিছুটা বিভ্রান্ত করে তোলে।
mtjhax

9
নিখুঁত ফিক্স, আসলে একটি দম্পতি কাজ করেছিল তাই করলো AD এবং বাম সব কাক্সিক্ষত
পাবলো

8
ধন্যবাদ। এটি আমাকে দু'বার বাঁচিয়েছে। যদি শাখাগুলি কিছুটা আলাদা হয়, পুনরায় সেট করার পরে এবং চেকআউট করার আগে আপনাকে অন্য কোনও শাখা চেকআউট করার আগে আপনাকে নিজের পরিবর্তনগুলি আটকে রাখতে হতে পারে। পুনরায় আবেদন চেকআউট লুকোবার জায়গা পর
কারবি

17
জেডএস ব্যবহারকারীগণ: আপনার পছন্দ হতে পারে ^ এর মতো:git reset --soft HEAD\^
স্টিফেন ফুহরি

54
আরও কিছু পেলে? আপনার উইন্ডোজ কমান্ড লাইনে, হেডকে ঘিরার জন্য কোটগুলি ব্যবহার করুন - যেমন: গিট রিসেট
কুক

140

এই বিষয়ে 4 বছর দেরি হলেও এটি কারও পক্ষে সহায়ক হতে পারে।

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

git stash                       # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop                   # skip if all changes were committed

এখন আপনার কাছে মাস্টার শাখা সমান origin/masterএবং সমস্ত নতুন কমিট শুরু my_feature। দ্রষ্টব্য যে my_featureএকটি স্থানীয় শাখা, কোনও দূরবর্তী শাখা নয়।


উত্তরের জন্য ধন্যবাদ. এখন আমি উদাহরণ ব্যবহার করছি এবং আমি ভাবছি যে আমি নিম্নলিখিতগুলি করে একই জিনিসটি সম্পাদন করতে পারি: 1) বর্তমান 'মাস্টার' কে 'মাই_ফাইচার' এ নামকরণ করুন। ২) 'উত্স / মাস্টার' থেকে স্থানীয় 'মাস্টার' পুনরুদ্ধার করুন। আমি নিশ্চিত না যে এই ক্রিয়াকলাপগুলির জন্য ইডিট কীভাবে কাজ করছে তবে এটি একটি কার্যকর সমাধান বলে মনে হচ্ছে
mjj1409

কেন একীভূত? আপনি সরাসরি শাখা তৈরি করতে পারেন master, তারপরে পুনরায় সেট masterকরুন origin/master
সিজারসোল

1
এটি সবচেয়ে আকর্ষণীয় অংশ: আপনার অনেকগুলি কমিটের দরকার নেই, কারণ origin/masterইতিমধ্যে যে প্রতিশ্রুতিতে আপনি পুনরায় সেট করতে চান তা ইতিমধ্যে! টিপটির
সিজারসোল

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সরল, সুস্পষ্ট, সোজাসাপ্টা, কমিটের সংখ্যা নির্বিশেষে এবং শুধুমাত্র বেসিক গিট কার্যকারিতা ব্যবহার করে works আমি এই পদক্ষেপগুলি টর্টোজাইজিটের সাথে করেছি। ধন্যবাদ! :)
ইয়ান গ্রেঞ্জার

1
আমি ভেবেছিলাম এটি সেরা উত্তর, তবে এটির একটি সীমাবদ্ধতা রয়েছে। আপনি সম্প্রতি দূরবর্তী থেকে টানলে এটি কেবল সহায়তা করে। এবং এটি ধরে নিয়েছে যে আপনার সাথে শুরু করার জন্য একটি রিমোট রয়েছে। আপনার যদি কেবল স্থানীয় শাখা "মাস্টার" এবং আপনার নতুন বৈশিষ্ট্য ঠিক করা থাকে তবে একমাত্র সঠিক উত্তর হ'ল মাস্টার একটি নির্দিষ্ট সংখ্যক কমিট গণনা করার জন্য শক্ত রিসেট।
pauljohn32

111

যদি আপনার একটি পরিষ্কার (অ-সংশোধিত) কার্যকরী অনুলিপি থাকে

একটি প্রতিশ্রুতি রোলব্যাক করতে (নিশ্চিত করুন যে আপনি পরবর্তী পদক্ষেপের জন্য কমিটের হ্যাশটি নোট করেছেন):

git reset --hard HEAD^

সেই প্রতিশ্রুতিটি অন্য একটি শাখায় টানতে:

git checkout other-branch
git cherry-pick COMMIT-HASH

আপনি যদি সংশোধিত বা অনিবন্ধিত পরিবর্তনগুলি করেন

এছাড়াও নোট করুন যে আপনার হতে পারে যে কোনও অনিবন্ধিত এবং সংশোধিত পরিবর্তনগুলিকে হত্যাgit reset --hard করবে , সুতরাং আপনার যদি পছন্দ হয় তবে:

git reset HEAD^
git checkout .

git rev-parse BRANCH_NAMEশা পেতে।
উইলহেমটেল

12
আপনি যদি প্রথমে হ্যাশটি নোট করতে ভুলে যান তবে কেবল ব্যবহার করুন git reflog show <branch>!
ক্যাসকেবেল

2
@ জেফ্রমি আমি এক মিনিটের জন্য সেখানে ভয় পেয়েছিলাম।
ইয়ান হান্টার

13
অতিরিক্ত সুরক্ষিত অনুভূতির জন্য, প্রথমে সঠিক শাখায় চেরি-পিকটি সম্পাদন করুন এবং তারপরেই ভুল শাখাটি পুনরায় সেট করুন।
বয়স মোইজ

1
এছাড়াও untracked পরিবর্তনের ক্ষেত্রে, এক করতে পারেন git stashপুনরায় সেট করুন এবং ব্যবহারের পূর্বে git stash popপরে তাদের পূর্বাবস্থায় ফিরিয়ে আনুন, তাই ভয় করার কোন প্রয়োজন --hardঅংশ
ক্লেমেন্স ক্লেইন-Robbenhaar

20

আপনি যদি ইতিমধ্যে আপনার পরিবর্তনগুলিকে ধাক্কা দিয়ে থাকেন তবে আপনাকে হেডটি পুনরায় সেট করার পরে আপনার পরবর্তী ধাক্কা চাপতে হবে।

git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force

সতর্কতা: একটি হার্ড রিসেট আপনার কার্যকরী অনুলিপিতে যে কোনও অনির্দিষ্ট পরিবর্তনকে পূর্বাবস্থায় ফিরিয়ে আনবে, অন্যদিকে একটি ফোর্স পুশ স্থানীয় শাখার বর্তমান অবস্থার সাথে দূরবর্তী শাখার অবস্থা সম্পূর্ণরূপে ওভাররাইট করবে।

কেবলমাত্র উইন্ডোজে (উইন্ডোজ কমান্ড লাইনটি ব্যবহার করে, ব্যাশ নয়) এটি আসলে ^^^^একের পরিবর্তে চারটি , তাই এটি

git reset --hard HEAD^^^^

6
মনে রাখবেন যে অন্য শাখাগুলি একেবারে প্রয়োজনীয় না হলে ব্যবহার করা এমন শাখায় আপনাকে জোর করে চাপ দেওয়া উচিত নয় - অন্যথায় তারা পুনরায় শোধ না করা পর্যন্ত তারা চাপ দিতে অক্ষম হবে। আপনি যদি গিট ব্যবহার করে একমাত্র বিকাশকারী হন তবে এটি ঠিক আছে।
ব্লেয়ার হলোয়ে

2
অথবা অন্য কেউ ভ্রান্ত কমান্ডগুলি টানার আগে আপনি যদি দ্রুত যথেষ্ট উপলব্ধি না করেন unless
মাইকেল মায়ার

যদি আপনার একাধিক প্রতিশ্রুতি বন্ধ হয় তবে আপনি যে git reset --hard COMMIT_HASH git push --force
কমিটগুলি

17

আমি সম্প্রতি একই জিনিস করেছি, যেখানে আমি দুর্ঘটনাক্রমে মাস্টার পরিবর্তনের প্রতিশ্রুতি দিয়েছিলাম, যখন আমার অন্য শাখায় প্রতিশ্রুতিবদ্ধ হওয়া উচিত ছিল। তবে আমি কিছুই ঠেকালাম না।

আপনি যদি কেবলমাত্র ভুল শাখায় প্রতিশ্রুতিবদ্ধ থাকেন এবং এর পর থেকে কোনও কিছু পরিবর্তন করেননি এবং রেপোতে ঠেলাঠেলি করেন না, তবে আপনি নিম্নলিখিতটি করতে পারেন:

// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes. 
git reset HEAD~1 

// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash

// create other-branch (if the other branch doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// take the temporary commit you created, and apply all of those changes to the new branch. 
//This also deletes the temporary commit from the stack of temp commits.
git stash pop

// add the changes you want with git add...

// re-commit your changes onto other-branch
git commit -m "some message..."

দ্রষ্টব্য: উপরের উদাহরণে, আমি গিট রিসেট হেড ~ 1 এর সাথে 1 টি প্রতিশ্রুতি রিভাইন্ড করছিলাম। তবে আপনি যদি কমিটিকে রিওয়াইন্ড করতে চান, তবে আপনি গিট রিসেট করতে পারেন হেড ~ n।

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

// save the not-ready-to-commit work you're in the middle of
git stash 

// rewind n commits
git reset HEAD~n 

// stash the committed changes as a single temp commit onto the stack. 
git stash 

// create other-branch (if it doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// apply all the committed changes to the new branch
git stash pop

// add the changes you want with git add...

// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."

// pop the changes you were in the middle of and continue coding
git stash pop

দ্রষ্টব্য: আমি এই ওয়েবসাইটটি একটি রেফারেন্স হিসাবে ব্যবহার করেছি https://www.clearvision-cm.com/blog/ কি- to- do- when- you- commit-to- the- wrong- git- branch/


আমার সাথেও একই ঘটনা ঘটেছিল, আমি মাস্টারে কিছু পরিবর্তন করেছি, তবে নতুন শাখায় আমার পিআর পাঠানো উচিত ছিল, আমি git checkout -b new_branchসেখান থেকে ঠিক করণ শেষ করেছিলাম , প্রতিশ্রুতি অক্ষত ছিল, কেবল ঠেলাঠেলি করছিল, আর পিআর তৈরি করল না, ' আবার কমিট করতে হবে না।
নিশচল গৌতম

11

সুতরাং যদি আপনার পরিস্থিতি যদি আপনি প্রতিশ্রুতিবদ্ধ হন masterতবে প্রতিশ্রুতিবদ্ধ হন another-branch(যা ইতিমধ্যে উপস্থিত থাকতে পারে এবং নাও থাকতে পারে) তবে আপনি এখনও ঠেলাঠেলি করেন নি, এটি ঠিক করা খুব সহজ।

// if your branch doesn't exist, then add the -b argument 
git checkout -b another-branch
git branch --force master origin/master

এখন সব আপনার করে করতে masterহবে another-branch

প্রেমে উত্সাহিত : http://haacked.com/archive/2015/06/29/git-migrate/


সর্বাধিক সরল পদ্ধতি বলে মনে হচ্ছে! নিশ্চিত না কেন এত কম ভালবাসা এবং উত্সাহগুলি
কেলিগিজাস

4
এটি আমার পক্ষে কাজ করবে বলে মনে হয় না। another-branchইতিমধ্যে বিদ্যমান। এই ক্ষেত্রে, এটি যে কমেটগুলিতে আমি আয়ত্ত করতে চাইছিলাম তা কেবল কমিয়ে দিয়েছে এবং সেগুলি চালিত করে নি another-branch
গিজেল সেরেট

6

সম্প্রসারিত করার এই উত্তর, যদি আপনি থেকে সরাতে, যেমন একাধিক বদ্ধ পরিকর developকরতে new_branch:

git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started

1
আমার কাছে ফিরে যাওয়ার তিনটি প্রতিশ্রুতি ছিল এবং এই প্রশ্নটি আমার গাধাটিকে আগুনের বাইরে টেনে নিয়ে গেছে। ধন্যবাদ!
হোল্ডেনওয়েব

3

আপনি যদি এই সমস্যাটিতে চলে যান এবং আপনার ভিজ্যুয়াল স্টুডিও থাকে তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

আপনার শাখায় ডান ক্লিক করুন এবং নির্বাচন করুন View History:

এখানে চিত্র বর্ণনা লিখুন

আপনি ফিরে যেতে চান প্রতিশ্রুতিতে ডান ক্লিক করুন। এবং রিভার্ট বা প্রয়োজন অনুসারে পুনরায় সেট করুন।

এখানে চিত্র বর্ণনা লিখুন


3

ভুল শাখায় একাধিক কমিটি করার জন্য

যদি আপনার জন্য, এটি প্রায় 1 টি প্রতিশ্রুতিবদ্ধ হয়, তবে আরও অনেক সহজ পুনরায় সেট করার সমাধান পাওয়া যায়। আমার জন্য, আমার প্রায় 10 টি কমিটস দুর্ঘটনাবশত এর masterপরিবর্তে করা হয়েছিল, আসুন আমরা এটি কল করিbranch_xyz এবং আমি প্রতিশ্রুতিবদ্ধ ইতিহাস হারাতে চাইনি।

আপনি কী করতে পারেন এবং আমাকে কী সংরক্ষণ করেছিল তা এই উত্তরটি একটি রেফারেন্স হিসাবে ব্যবহার করে 4 ধাপের প্রক্রিয়া ব্যবহার করে যা হ'ল -

  1. থেকে একটি নতুন অস্থায়ী শাখা তৈরি করুন master
  2. মূলত কমান্ডের উদ্দেশ্যে উদ্দিষ্ট শাখায় মার্জ করুন branch_xyz
  3. পূর্বাবস্থায় ফিরে যান master
  4. অস্থায়ী শাখা মুছুন।

বিশদে উপরোক্ত পদক্ষেপগুলি এখানে -

  1. এর থেকে একটি নতুন শাখা তৈরি করুন master(যেখানে আমি ঘটনাক্রমে অনেক পরিবর্তন করেছি)

    git checkout -b temp_branch_xyz
    

    নোট: -bপতাকা একটি নতুন শাখা তৈরি করতে ব্যবহার করা হয়
    যদি আমরা ঠিক শুধু যাচাই করার জন্য, আমি একটি দ্রুত করতে চাই git branchনিশ্চিত হয় করতে temp_branch_xyzশাখা এবং git logযদি আমরা করে ঠিক করো।

  2. অস্থায়ী শাখাটি মূলত কমিটের উদ্দেশ্যে তৈরি শাখায় মার্জ করুন branch_xyz
    প্রথমে মূল শাখায় স্যুইচ করুন branch_xyz( যেমন git fetchআপনার না থাকলে আপনার প্রয়োজন হতে পারে )

    git checkout branch_xyz
    

    দ্রষ্টব্য: -bপতাকা
    এখনই ব্যবহার করা হচ্ছে না , আসুন আমরা বর্তমানে চেকআউট করেছি সেই শাখায় অস্থায়ী শাখাটি মার্জ করুনbranch_xyz

    git merge temp_branch_xyz
    

    আপনার যদি এখানে কিছু বিবাদ দেখা দেয় তবে তার যত্ন নিতে হবে। সফলভাবে মার্জ হওয়ার পরে আপনি ধাক্কা (আমি চাই) বা পরবর্তী পদক্ষেপগুলিতে যেতে পারেন।

  3. এই উত্তরটি রেফারেন্স হিসাবে masterব্যবহার করতে দুর্ঘটনাকবলিত কমিটিকে পূর্বাবস্থায় ফিরিয়ে আনুন , প্রথমে এটিতে স্যুইচ করুনmaster

    git checkout master
    

    তারপরে রিমোটটি (বা যদি আপনি চান তবে নির্দিষ্ট প্রতিশ্রুতিবদ্ধ) এর সাথে মেলে সমস্ত পথে ফিরে যান

    git reset --hard origin/master
    

    আবারও, git logউদ্দেশ্য পরিবর্তনগুলি কার্যকর হয়েছে কিনা তা নিশ্চিত করার জন্য আমি আগে এবং পরে কিছু করব।

  4. প্রমাণ মুছে ফেলা, এটি অস্থায়ী শাখা মুছে ফেলছে। এর জন্য প্রথমে আপনাকে সেই শাখাটি যাচাই করা দরকার যে টেম্পটি একত্রীকরণ করা হয়েছিল, অর্থাৎ branch_xyz(যদি আপনি masterনীচে থেকে আদেশটি চালিয়ে যান এবং একটি পেতে error: The branch 'temp_branch_xyz' is not fully mergedপারেন), সুতরাং আসুন

    git checkout branch_xyz
    

    এবং তারপরে এই দুর্ঘটনার প্রমাণ মুছুন

    git branch -d temp_branch_xyz
    

এই নাও.


1

আপনি যে শাখায় আপনার পরিবর্তনগুলি প্রয়োগ করতে চেয়েছিলেন তা ইতিমধ্যে বিদ্যমান রয়েছে ( উদাহরণস্বরূপ, শাখা বিকাশ ) নীচে ফোটানাসের দ্বারা প্রদত্ত নির্দেশাবলী অনুসরণ করুন , তারপরে:

git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature

এবং অবশ্যই আপনি ব্যবহার করতে পারে tempbranch পরিবর্তে বা অন্য কোন শাখার নাম my_feature চাইলে আপনি ।

এছাড়াও, যদি প্রযোজ্য হয়, আপনি আপনার লক্ষ্য শাখায় মার্জ হওয়ার পরে স্ট্যাশ পপটি (প্রয়োগ করুন) বিলম্ব করুন।


আমি মনে করি প্রথম কমান্ড (চেকআউট বিকাশ) অপ্রয়োজনীয় ... রিবাজে "মাই_ ফিচার" এটি প্রথম কাজ হিসাবে চেকআউট করবে।
জোয়েলফ্যান

এছাড়াও আপনি "রিবাজে" কমান্ডের "মাই_ ফিচার" প্যারামিটারটি ছেড়ে দিতে পারেন (যেহেতু আপনি ইতিমধ্যে "মাই_ ফিচার" চেক করে ফেলেছেন)। আপনি "মার্জ" এর "বিকাশ" প্যারামিটারটিও ছেড়ে দিতে পারেন (যেহেতু আপনি ইতিমধ্যে "বিকাশ" চেকআউট করেছেন)
জোয়েলফ্যান

1

আমার জন্য, আমি যে প্রতিশ্রুতিটি ঠেলেছি তা ফিরিয়ে দিয়ে এটি সমাধান করা হয়েছিল, তারপরে চেরি-বাছাই যা অন্য শাখায় প্রতিশ্রুতিবদ্ধ।

git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH

আপনি git logসঠিক হ্যাশটি খুঁজে পেতে ব্যবহার করতে পারেন এবং আপনি যখনই চান এই পরিবর্তনগুলিকে ঠেলাতে পারেন!

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