আমি কীভাবে গিতে হারানো প্রতিশ্রুতি পুনরুদ্ধার করতে পারি?


258

প্রথমে "আপনার শাখাটি 3 টি কমিটের মাধ্যমে উত্স / মাস্টারের চেয়ে এগিয়ে" পেয়েছে তারপরে আমার অ্যাপ্লিকেশনটি পূর্বের পরিবর্তনগুলির সাথে পূর্ববর্তী সময়ে ফিরে গেছে।

আমি শেষ 11 ঘন্টা ব্যয় করে কীভাবে ফিরে পেতে পারি?


উত্তর:


585

git reflogতোমার বন্ধু. আপনি যে তালিকায় থাকতে চান সেই প্রতিশ্রুতিটি সন্ধান করুন এবং আপনি এটিতে পুনরায় সেট করতে পারেন (উদাহরণস্বরূপ git reset --hard e870e41:)।

(যদি আপনি নিজের পরিবর্তনগুলি না করেন ... আপনি সমস্যায় পড়তে পারেন - তাড়াতাড়ি প্রতিশ্রুতি দিন এবং প্রায়শই প্রতিশ্রুতি দিন!)


5
একবার দেখুন git log HEAD@{1}। এটি যদি কমিটের সঠিক সিরিজের মতো মনে হয় তবে আপনি এটি করতে পারেন git reset HEAD@{1}
আম্বর

4
কোডগুলি মঞ্চস্থ করা হলে (গিট অ্যাড ব্যবহার করে), সেগুলি গিটে রাখা হয় এবং পছন্দ মতো কমান্ড ব্যবহার করে সহজেই ফিরে পাওয়া যায় git fsck --lost-found
ল্যান্ডিস

2
দুর্ঘটনাক্রমে রিবাইজ করার সময় আমার একটি প্রতিশ্রুতি রাখা উচিত ছিল। এটি আমাকে কয়েক ঘন্টা মূল্যমানের কাজটি পুনরায় করা থেকে সম্পূর্ণ রক্ষা করেছিল saved
josephting

27
এটি আমার জীবন বাঁচিয়েছিল।
লুটোয়া হুযাইফাহ ইদ্রিস

6
এটি আমার বিচক্ষণতা বাঁচিয়েছে: ডি
ফ্র্যাঙ্ক ফাজার্দো

117

উত্তর দেওয়ার আগে আসুন এটি কী তা ব্যাখ্যা করে কিছু পটভূমি যুক্ত করা যাক 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

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


2
আপনি একজন বীর, স্যার
dylanh724

4
এটি আমার বেশ কয়েক ঘন্টা কাজ বাঁচিয়েছে। আমি প্রতিটি গেমের প্রবেশের তারিখ / সময় দেখতে "git reflog --date = iso" ব্যবহার করেছি যেহেতু টাইমস্ট্যাম্প ব্যতীত আমি নিশ্চিত করে বলতে পারি না।
মেটালমাইকস্টার

1
আমার জন্য, কাজ git reset --hard <commit_id>, অপসারণ HEAD! গ্রাফিকাল উপস্থাপনা জন্য +1 !!
reverie_ss

কেবল উল্লেখ করার জন্য: আপনি যদি শাখার নাম জানেন: git reflog <branchname>বেশ কার্যকর হতে পারে, যেহেতু আপনি কেবল একটি শাখার পরিবর্তনগুলি দেখেন।
মার্কাস শ্রেইবার

35

মুছে ফেলা কমিট করার আরও একটি উপায় হ'ল git fsckকমান্ডটি দিয়ে।

git fsck --lost-found

এটি শেষ লাইনে এমন কিছু আউটপুট দেবে:

dangling commit xyz

reflogঅন্যান্য জবাব হিসাবে প্রস্তাবিত হিসাবে আমরা এটি একই প্রতিশ্রুতিবদ্ধ তা পরীক্ষা করতে পারি । এখন আমরা একটি করতে পারিgit merge

git merge xyz

দ্রষ্টব্য:
আমরা fsckযদি ইতিমধ্যে একটি git gcকমান্ড চালিয়েছি যা ঝুঁকিপূর্ণ অঙ্গীকারের রেফারেন্সটি সরিয়ে ফেলবে তবে আমরা প্রতিশ্রুতি ফিরে পেতে পারি না ।


3
এটিই কেবলমাত্র উত্তর যা যদি আপনি সম্প্রতি প্রশ্নে প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি না দিয়ে থাকেন তবে যেমন আপনি যখন কোন শাখা আনেন এবং ঘটনাক্রমে সেই শাখাটি অন্য কোথাও পুনরায় সেট করে works
তামাম্যাকগ্লিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.