কীভাবে আমি হেডকে আগের জায়গায় ফিরে যেতে পারি? (বিচ্ছিন্ন মাথা) এবং পূর্বাবস্থায় ফিরে যান


179

গিতে, আমি squash commitঅন্য একটি শাখায় মার্জ করে এবং তারপরে HEADপূর্ববর্তী স্থানে পুনরায় সেট করে একটি করার চেষ্টা করছিলাম :

git reset origin/master

তবে আমার এ থেকে বের হওয়া দরকার। কীভাবে আমি হেডকে আগের জায়গায় ফিরে যেতে পারি?

আমার 23b6772যে প্রতিশ্রুতিটি এটিকে সরানো দরকার সেটির SHA-1 টুকরা ( ) রয়েছে। আমি কীভাবে এই প্রতিশ্রুতিতে ফিরে যেতে পারি?


11
হেড আপনার বর্তমান অবস্থানের জন্য কেবলমাত্র পয়েন্টার (বা সংশোধন সুনির্দিষ্ট হওয়ার জন্য)। git checkout 23b6772করা উচিত.
ইয়ারোস্লাভ অ্যাডমিন


1
@ ইয়ারোস্লাভ অ্যাডমিন এটি করা উচিত নয় । কোনও প্রতিশ্রুতি প্রত্যক্ষভাবে চেক করা হ'ল বিচ্ছিন্ন হেড স্টেটটি ঘটেছিল (যেহেতু রিমোট ট্র্যাকিং শাখাগুলি তাদের চেক আউট করা যায় না এবং আপনি ওপি-র মতো করার চেষ্টা করার সময় তারা যে প্রতিশ্রুতি দেখায় তা স্বয়ংক্রিয়ভাবে পিছিয়ে যায় না) এছাড়াও, নেক্রোমেটিকের জন্য দুঃখিত মন্তব্য :-) আমি ধরণের আশা করি প্রাথমিক সমস্যাটি ইতিমধ্যে সমাধান হয়ে গেছে ...
রোমানভ্যালারি

উত্তর:


393

উত্তর দেওয়ার আগে আসুন এটি কী তা ব্যাখ্যা করে কিছু পটভূমি যুক্ত করা যাক HEAD

First of all what is HEAD?

HEADকেবলমাত্র বর্তমান শাখায় বর্তমান প্রতিশ্রুতি (সর্বশেষ) এর একটি উল্লেখ। যে কোনও সময়
কেবলমাত্র একা HEADথাকতে পারে (বাদে git worktree)।

এর সামগ্রীটি HEADভিতরে সঞ্চিত .git/HEADরয়েছে এবং এতে বর্তমান প্রতিশ্রুতিতে 40 বাইট এসএইএ -1 রয়েছে।


detached HEAD

আপনার উপর না হন, তাহলে সর্বশেষ কমিট - অর্থ যে HEADএকটি পূর্বে নির্দেশ করা হয় ইতিহাস বলা হচ্ছে এ কমিট detached HEAD

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

কমান্ড লাইনে এটি দেখতে এইরকম হবে - শাখার নামের পরিবর্তে SHA-1 যেহেতু HEADবর্তমান শাখার অগ্রভাগের দিকে ইশারা করছে না:

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

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


বিচ্ছিন্ন হেড থেকে কীভাবে পুনরুদ্ধার করবেন সে সম্পর্কে কয়েকটি বিকল্প:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

এটি পছন্দসই প্রতিশ্রুতি নির্দেশ করে নতুন শাখাটি চেকআউট করবে।
এই আদেশটি প্রদত্ত প্রতিশ্রুতিতে চেকআউট করবে।
এই মুহুর্তে, আপনি একটি শাখা তৈরি করতে পারেন এবং এই বিন্দু থেকে কাজ শুরু করতে পারেন।

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

আপনি সর্বদা reflogপাশাপাশি ব্যবহার করতে পারেন ।
git reflog আপডেট হওয়া যে কোনও পরিবর্তন প্রদর্শন করবে HEADএবং কাঙ্ক্ষিত রিফ্লগ এন্ট্রি চেক HEADকরা এই প্রতিশ্রুতিতে ফিরে আসবে।

যতবারই হেডের সংশোধন করা হয় সেখানে একটি নতুন প্রবেশ থাকবে reflog

git reflog
git checkout HEAD@{...}

এটি আপনাকে আপনার কাঙ্ক্ষিত প্রতিশ্রুতিতে ফিরিয়ে আনবে

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


git reset --hard <commit_id>

আপনার হেডকে পছন্দসই প্রতিশ্রুতিতে "সরান"।

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • দ্রষ্টব্য: ( গিট ২.7 থেকে ) আপনি এটিও ব্যবহার করতে পারেন git rebase --no-autostash

git revert <sha-1>

প্রদত্ত প্রতিশ্রুতি বা প্রতিশ্রুতি ব্যাপ্তি "পূর্বাবস্থায় ফিরিয়ে দিন"।
রিসেট কমান্ড প্রদত্ত প্রতিশ্রুতিতে যে কোনও পরিবর্তন "পূর্বাবস্থায়" ফেলবে।
পূর্বাবস্থার প্যাচ নিয়ে একটি নতুন প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ হবে যখন মূল প্রতিশ্রুতি ইতিহাসেও থাকবে।

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

এই স্কিমাটি বোঝায় যে কোন আদেশটি কী করে।
আপনি যেহেতু দেখতে পাচ্ছেন, reset && checkoutপরিবর্তন করুন HEAD

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


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

আপনি আলাদা হেডে থাকতে পারেন এবং একই সাথে এই শাখার হেডের মতো একই প্রতিশ্রুতি সহ একটি শাখা থাকতে পারে। আমি আপনার মন্তব্যটি বুঝতে পারি না
উইজার্ড

3
শিরোনামগুলির জন্য আপনার ইনলাইন-কোড মার্কআপ ব্যবহার নিয়ে আমার সমস্যা আছে :)
jub0bs

এটির উপর জোর দেওয়ার আরও ভাল কোনও উপায় খুঁজে পাওয়া যায়নি। সম্পাদনা করতে নির্দ্বিধায়। আপনি স্বাগত অপেক্ষা আরও বেশি
উইজার্ড

22

ডু

git reset 23b6772

আপনি সঠিক অবস্থানে আছেন কিনা তা দেখতে:

git status

আপনি কিছু দেখতে পাবেন

শাখা মাস্টারে আপনার শাখা 17 টি কমিট দ্বারা 'উত্স / মাস্টার' এর পিছনে রয়েছে এবং দ্রুত অগ্রসর হতে পারে।

তারপরে পরিবর্তনটি প্রতিফলিত করতে আপনার রিমোটে ইতিহাসটি পুনরায় লিখুন:

git push --force-with-lease // a useful command @oktober mentions in comments

1
এর সাথে চূড়ান্তভাবে সতর্কতা অবলম্বন করুন git push --force। অনেক পরিস্থিতিতে এটি আপনাকে অল্প সময়ের জন্য দলের সবচেয়ে কম জনপ্রিয় ব্যক্তি হিসাবে গড়ে তুলবে ....
কে ভি ভি

উপরের নোটটি যুক্ত করার জন্য, আমি এই দাবীটি সম্পর্কে কেবলমাত্র . gitlab.com/blog/2014/11/26/keeping-your-code- সুরক্ষিতএসেছি এবং এটি যুক্ত করতে হয়েছিল: "একক গিট পুশ - ফোর্স কমান্ড অনেক লোকের জন্য খুব সহজেই দিনটি নষ্ট করতে পারে: [186 জেনকিনস] সংগ্রহস্থলগুলি তাদের শাখা প্রধানকে পুরানো কমান্ডগুলির দিকে ইঙ্গিত করার জন্য পুনরায় বানানো হয়েছে এবং ফলস্বরূপ খারাপ গিট-পুশের পরে নতুন কমিটগুলি ভুল জায়গায় প্রতিস্থাপন করা হয়েছিল। " - প্রত্যেক অপ্রিয় জনপ্রিয় বিকাশকারী ....
কে ভি

2
@KayV কটাক্ষপাত করা git push --force-with-lease: (Thoughtbot নিবন্ধ thoughtbot.com/blog/git-push-force-with-lease )
অক্টোবর

1
দরকারী পতাকা, @ অক্টবার এবং একটি ভাল নিবন্ধ। এটি এখানে যুক্ত করার জন্য এবং এটি সম্পর্কে আমার পিঙ্ক করার জন্য ধন্যবাদ।
কে ভি ভি

1
ধন্যবাদ! এটি আমাকে খারাপ একীভূত করতে অন-করতে সহায়তা করেছে। যেহেতু মার্জগুলি কমিটের মতো একইভাবে প্রতিক্রিয়া দেখায় না revertআমি নিজেকে একটি অবিশ্বাস্যরকম কঠিন পরিস্থিতিতে দেখতে পেলাম। force-with-leaseঅন্যান্য লোকের কাজকে প্রভাবিত না করে শাখার গিট ইতিহাস পুনরায় লেখার জন্য আমাকে আত্মবিশ্বাস দিয়েছিল। সাবাস!
anon58192932

11

দ্রুততম সমাধান (মাত্র 1 ধাপ)

ব্যবহার git checkout -

আপনি দেখতে পাবেন Switched to branch <branch_name>। আপনি যে শাখাটি চান তা নিশ্চিত করুন।


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


স্মৃতিচারণকারী: এই পদ্ধতিটি cd -আপনার আগের পরিদর্শন করা ডিরেক্টরিতে ফিরে আসতে ব্যবহার করার মতো । সিনট্যাক্স এবং প্রযোজ্য কেসগুলি হ'ল একটি দুর্দান্ত মিল eg (উদাহরণস্বরূপ এটি কার্যকর যখন আপনি চাইবেন যেখানে হেডটি যেখানে ছিল সেখানে ফিরে যেতে হবে)।


আরও পদ্ধতিগত সমাধান (২-পদক্ষেপ, তবে স্মরণীয়)

দ্রুত পদ্ধতির মাধ্যমে ওপির প্রশ্নটির সমাধান হয়। তবে আপনার পরিস্থিতি কিছুটা আলাদা হলে কী বলুন: আপনি বাশকে পুনরায় চালু করেছেন তবে নিজেকে হেডের বিচ্ছিন্নতার সাথে খুঁজে পেয়েছেন। সেক্ষেত্রে এখানে 2 টি সহজ, সহজেই মনে রাখা পদক্ষেপ রয়েছে।

1. আপনার প্রয়োজনীয় শাখাটি বেছে নিন

ব্যবহার git branch -v

আপনি বিদ্যমান স্থানীয় শাখার একটি তালিকা দেখতে পাবেন। আপনার প্রয়োজন অনুসারে শাখার নামটি ধরুন।

2. এটিতে মাথা সরান

ব্যবহার git checkout <branch_name>

আপনি দেখতে পাবেন Switched to branch <branch_name>। সফল!


ফলাফল

উভয়ই পদ্ধতিতে আপনি এখন আগের মতো আপনার কাজ যুক্ত করা এবং প্রতিশ্রুতিবদ্ধ করতে পারেন: আপনার পরবর্তী পরিবর্তনগুলি ট্র্যাক করা হবে <branch_name>

নোট উভয় git checkout -এবং git checkout <branch_name>আপনি অঙ্গীকারবদ্ধ পরিবর্তন আছে যখন মস্তক বিচ্ছিন্ন করা হয়েছিল অতিরিক্ত নির্দেশাবলী দেব।


এই কাজ না করে তবে আমি কি কারণ (অভিমানী 8acc968 হয় যে মাথা ~ 2) git checkout 8acc968তারপর git branch -vরয়েছে MyBranchনিচে ... তালিকায় কিন্তু তারপর git checkout MyBranchআমার মন্তব্য মুছে ফেলা হবে।
amular

হাই @ অ্যামুলিয়ার - git checkout 8acc968একটি শাখা নয়, একটি প্রতিশ্রুতি পরীক্ষা করবে। যদি MyBranchআপনি চান কমিটস থাকে, চেষ্টা করুন git checkout MyBranch। যদি এটিতে প্রতিশ্রুতি 8acc968 এর পরিবর্তনগুলি না থাকে তবে আপনাকে শাখাটি পরীক্ষা করে দেখার পরে এই পরিবর্তনগুলি মার্জ করতে হবে।
কে ভি

উত্তর করার জন্য ধন্যবাদ! আমি git checkoutপূর্বের প্রতিশ্রুতি দেখতে চেয়েছিলাম এবং সর্বশেষ প্রতিশ্রুতিতে ফিরে যেতে চেয়েছিলাম। তবে সর্বশেষ প্রতিশ্রুতিবদ্ধ হ্যাশ ব্যতীত আমি বেশ হারিয়েছি। এই সমাধানটি আমার পরিস্থিতির জন্য উপযুক্ত!
zyy

4

প্রশ্নটি পড়তে পারেন:

আমি HEADএট এ - 23b6772টাইপ করে বিচ্ছিন্ন অবস্থায় git reset origin/masterছিলাম (কারণ আমি স্কোয়াশ করতে চেয়েছিলাম)। এখন আমি আমার মন পরিবর্তন করেছি, কীভাবে আমি ফিরে যেতে পারি HEADহচ্ছে 23b6772?

সরল উত্তর হ'ল: git reset 23b6772

তবে আমি এই প্রশ্নটি আঘাত করেছি কারণ প্রতিবার আমি পূর্বের উল্লেখ করতে চাইলে টাইপিং (অনুলিপি এবং পেস্ট করা) হ্যাশ বা এর সংক্ষেপণে অসুস্থ হয়ে পড়েছিলাম HEADএবং কোনও ধরণের শর্টহ্যান্ড আছে কিনা তা দেখতে গুগলিং ছিল was

দেখা যাচ্ছে সেখানে আছে!

git reset -(বা আমার ক্ষেত্রে git cherry-pick -)

যা ঘটনাক্রমে cd -পূর্ববর্তী বর্তমান ডিরেক্টরিতে * নিক্সে ফিরে আসার সমান ! তাই হুড়ে, আমি একটি পাথর দিয়ে দুটি জিনিস শিখেছি।


0

আপনি যখন কমান্ডটি চালনা করেন git checkout commit_idতারপরে HEAD বিচ্ছিন্ন হয়ে যায় 13ca5593d(say commit-id)এবং শাখাটি আর পাওয়া যায়।

পূর্ববর্তী স্থানে ফিরে যান কমান্ডটি ধাপে চালিত করুন -

  1. git pull origin branch_name (মাস্টার বলুন)
  2. git checkout branch_name
  3. git pull origin branch_name

দূরবর্তী সংগ্রহস্থল থেকে আপডেট করা কমিটের সাহায্যে আপনি আগের অবস্থানে ফিরে আসবেন।


0

আজ, আমি ভুল করে একটি প্রতিশ্রুতিটি পরীক্ষা করে দেখেছি এবং এটিতে কাজ শুরু করেছিলাম, একটি বিচ্ছিন্ন হেড স্টেটের জন্য কিছু অঙ্গীকার করে। তারপরে আমি নিম্নোক্ত কমান্ডটি ব্যবহার করে দূরবর্তী শাখায় ঠেললাম

git push origin HEAD: <My-remote-branch>

তারপর

git checkout <My-remote-branch>

তারপর

git pull

অবশেষে আমি আমার শাখায় আমার সমস্ত পরিবর্তনগুলি পেয়েছি যা আমি হেডকে আলাদা করেছিলাম।


0

এটি কোনও প্রযুক্তিগত সমাধান নাও হতে পারে তবে এটি কাজ করে। (আপনার সতীর্থের কারও যদি স্থানীয়ভাবে একই শাখা থাকে)

আসুন আপনার শাখার নামটি শাখা-এক্সএক্সএক্সএক্স হিসাবে ধরে নেওয়া যাক ।

সমাধানের পদক্ষেপ:

  • আপডেট বা টান না - কিছুই না
  • একটি নতুন শাখা (তৈরি শাখা-yyy ) থেকে শাখা-XXX তার মেশিনে
  • এগুলি হ'ল , আপনার সমস্ত বিদ্যমান পরিবর্তনগুলি এই নতুন শাখায় ( শাখা-ইয়াই ) থাকবে। আপনি এই শাখাটি দিয়ে আপনার কাজ চালিয়ে যেতে পারেন।

দ্রষ্টব্য: আবার, এটি কোনও প্রযুক্তিগত সমাধান নয়, তবে এটি অবশ্যই সহায়তা করবে।

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