গিট: মুছে ফেলা (রিমোট) শাখাটি পুনরুদ্ধার করুন


95

আমাকে দুটি গিট শাখা পুনরুদ্ধার করতে হবে যা আমি এক ধাক্কার সময় একরকম মুছে ফেলেছিলাম।

এই দুটি শাখা একটি পৃথক সিস্টেমে তৈরি করা হয়েছিল এবং তারপরে আমার "শেয়ারড" (গিথুব) সংগ্রহস্থলে ঠেলাঠেলি করা হয়।

আমার সিস্টেমে, আমি (স্পষ্টতই) আনার সময় শাখাগুলি পুনরুদ্ধার করেছি:

~/myfolder> git fetch
remote: Counting objects: 105, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 62 (delta 29), reused 0 (delta 0)
Unpacking objects: 100% (62/62), done.
From github.com:mygiturl
 * [new branch]      contact_page -> origin/contact_page
   731d1bb..e8b68cc  homepage   -> origin/homepage
 * [new branch]      new_pictures -> origin/new_pictures

এর ঠিক পরে আমি আমার স্থানীয় পরিবর্তনগুলি কেন্দ্রীয় রেপোতে প্রেরণের জন্য এক ধাক্কা দিয়েছিলাম। কিছু কারণে এই শাখাগুলি আমার স্থানীয় সিস্টেম এবং কেন্দ্রীয় রেপো উভয় থেকে মুছে ফেলা হয়েছে:

~/myfolder> git push
Counting objects: 71, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (43/43), done.
Writing objects: 100% (49/49), 4.99 KiB, done.
Total 49 (delta 33), reused 0 (delta 0)
To git@github.com:mygiturl.git
 - [deleted]         contact_page
 + e8b68cc...731d1bb homepage -> homepage (forced update)
   bb7e9f2..e0d061c  master -> master
 - [deleted]         new_pictures
   e38ac2e..bb7e9f2  origin/HEAD -> origin/HEAD
   731d1bb..e8b68cc  origin/homepage -> origin/homepage
   e38ac2e..bb7e9f2  origin/master -> origin/master
 * [new branch]      origin/contact_page -> origin/contact_page
 * [new branch]      origin/new_pictures -> origin/new_pictures

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

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

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

সম্পাদনা: অনুরোধ অনুসারে, আমার রেপো কনফিগারেশনটি এখানে

user.name=Craig Walker
user.email=github@softcraft.ca
alias.unadd=reset HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=git@github.com:MyGitURL.git
remote.origin.mirror=true
branch.master.remote=origin
branch.master.merge=refs/heads/master
alias.undo=reset --hard
alias.test=push -f ci HEAD:master
alias.st=status
alias.ci=commit
alias.br=branch
alias.co=checkout
alias.ch=checkout
alias.df=diff
alias.lg=log -p
alias.who=shortlog -s --
remote.ci.url=ContinuousIntegrationGitURL
remote.ci.fetch=+refs/heads/*:refs/remotes/ci/*
branch.photo.remote=origin
branch.photo.merge=refs/heads/photos
remote.foo.url=FooGitURL
remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/*
branch.homepage.remote=origin
branch.homepage.merge=refs/heads/homepage

দেখে মনে হচ্ছে আপনার কাছে একটি 'অস্বাভাবিক' বা মিল নেই এবং আনতে হবে এবং ধাক্কা কনফিগারেশন। git config -lস্থানীয় সংগ্রহস্থলের জন্য কী দেখায়?
সিবি বেইলি

বেশ সম্ভবত; আমি এটি পোস্ট করেছি।
ক্রেগ ওয়াকার

4
আপনার remote.origin.fetchরেস্পপ্যাকটি ব্যবহারের জন্য উপযুক্ত নয় remote.origin.mirror = true। আপনি কি মিরর করতে চান বা আপনি গিটহাব রেপোটিকে একটি সাধারণ রিমোট হিসাবে ব্যবহার করতে চান? আমার উত্তরে আপনার যেভাবেই প্রয়োজন আদেশগুলি থাকা উচিত।
ক্রিস জনসন

আমি অনুমান করছি যে ২ য় ভাণ্ডারের সাহায্যে, মিররিংয়ের কোনও বিকল্প নেই (এটি সম্ভবত প্রথম স্থানে মুছার কারণ হয়ে দাঁড়িয়েছে)।
ক্রেগ ওয়াকার

উত্তর:


103

আমি বিশেষজ্ঞ নই। তবে আপনি চেষ্টা করতে পারেন

git fsck --full --no-reflogs | grep commit

মুছে ফেলা শাখার হেড প্রতিশ্রুতি সন্ধান এবং তাদের ফিরে পেতে।


আমি আগে এফএসসি চেষ্টা করেছি; আপনি কি জানেন যে কোন প্রতিশ্রুতিটি সঠিকটি কী তা খুঁজে বের করতে হবে? আমি 20 চেষ্টা করেছি।
ক্রেগ ওয়াকার

4
এটি এটি করেছে; একবার আমি প্রতিশ্রুতিবদ্ধ বার্তা git branch <uid>পেয়েছিলাম, তাদের ফিরে পেয়েছি। ধন্যবাদ!
ক্রেগ ওয়াকার

শুনে ভাল লাগলো. আপনার remotes.origin.mirrorএবং remotes.origin.fetchসেটিংসের মধ্যে দ্বন্দ্বকেও সমাধান করার বিষয়টি নিশ্চিত করুন , অন্যথায় আপনি আবার সমস্যার দিকে চালিত হতে বাধ্য (বা অনিচ্ছাকৃতভাবে ক্লোবারটি অন্য ভাণ্ডার থেকে ধাক্কা খায়)।
ক্রিস জনসন

@ ক্রেইগ: সহায়ক হতে পেরে আনন্দিত :)
iamama

4
আমি আজ একটি মুক্তির প্রার্থী শাখা হারিয়েছি। কমিট আইডি জানতাম না। এটি ব্যবহার করে এটি পুনরুদ্ধার হয়েছে:git fsck --full --no-reflogs | cut -d' ' -f3 | xargs -P8 git log --oneline | grep 'Release 2.60.0.157'
স্পিজিফ্যান্ট

23

মাত্র দুটি আদেশ আমার জীবন বাঁচায়

1. এটি সমস্ত পূর্ববর্তী প্রধানদের তালিকাভুক্ত করবে

git reflog

২. এটি আপনি মুছে ফেলা প্রতিশ্রুতিবদ্ধ করতে এটি হেডকে ফিরিয়ে দেবে।

git reset --hard <your deleted commit>
ex. git reset --hard b4b2c02

4
আমি স্থানীয়ভাবে কখনই শাখায় চেক করে নিই যাতে আমার হেড কখনও হয় নি, তাই আমি কমিট আইডিটি খুঁজে পাচ্ছি না git reflog। আমি চেষ্টা করতে পারেন অন্য কিছু আছে?
zy

4
@Zyy এর মতোই প্রতিশ্রুতিটি অন্য দলের সদস্যরা রিমোটে মুছে ফেলেছে, তাই আমাকে এটি আমার স্থানীয় মেশিনে ফিরিয়ে আনতে হবে (স্থানীয়ভাবে আমার কখনই এই প্রতিশ্রুতি ছিল না) এবং এটিকে পিছনে ঠেলে দিতে হবে ...
ওমগনেশ

11

তোমার মোছা শাখা হারিয়ে যায় না, তারা মধ্যে কপি করা হয়েছে মূল / contact_page এবং উৎপত্তি / new_pictures "দূরবর্তী ট্র্যাকিং শাখা" আনা আপনাকে দেখিয়েছি দ্বারা (তারা ধাক্কা আপনাকে দেখিয়েছি দ্বারা পুশব্যাক করা হয়েছে, কিন্তু তারা refs / রিমোটের মধ্যে push করা হয় / উত্স / পরিবর্তে রেফ / মাথা /)। পরীক্ষা করে দেখুন git log origin/contact_pageএবং git log origin/new_picturesআপনার স্থানীয় অনুলিপি যাই হোক না কেন আপনি কি মনে করেন সেখানে উচিত "আপ টু ডেট" আছে কিনা তা দেখতে। যদি কোনও নতুন প্রতিশ্রুতিগুলি সেই শাখাগুলিতে (অন্য কোনও রেপো থেকে) আনা হয় এবং যে ধাপটি আপনি দেখিয়েছিলেন তার মধ্যে চাপ দেওয়া হয় তবে আপনি সেগুলি "হারিয়ে" ফেলতে পারেন (তবে সম্ভবত আপনি সম্ভবত সেগুলি অন্য রেপোগুলিতে খুঁজে পেয়েছিলেন যা সম্প্রতি এই শাখাগুলিকে ঠেলে দিয়েছে) ।

আনুন / ধাক্কা দ্বন্দ্ব

দেখে মনে হচ্ছে আপনি একটি সাধারণ, 'রিমোট মোডে' আনছেন (রিমোট রেফ / হেডস / স্থানীয়ভাবে রেফ / রিমোটস / উত্স /) এ সংরক্ষণ করা হয়েছে, তবে 'মিরর মোডে' চাপছেন (স্থানীয় রেফগুলি / রিমোট রেফগুলিতে চাপানো হয়েছে) । আপনার .git / কনফিগারটি পরীক্ষা করুন remote.origin.fetchএবং remote.origin.pushসেটিংসটি পুনরায় মিল করুন ।

একটি ব্যাকআপ করুন

কোনও পরিবর্তন করার চেষ্টা করার আগে, একটি সাধারণ টার বা জিপ সংরক্ষণাগার বা আপনার সম্পূর্ণ স্থানীয় রেপো তৈরি করুন। এইভাবে, যদি আপনার পছন্দ না হয় তবে আপনি পুনরুদ্ধারকৃত রেপো থেকে আবার চেষ্টা করতে পারেন।

বিকল্প একটি: মিরর হিসাবে পুনরায় কনফিগার করুন

যদি আপনি আপনার স্থানীয় একের আয়না হিসাবে আপনার রিমোট রেপো ব্যবহার করতে চান, এটি করুন:

git branch contact_page origin/contact_page &&
git branch new_pictures origin/new_pictures &&
git config remote.origin.fetch '+refs/*:refs/*' &&
git config --unset remote.origin.push &&
git config remote.origin.mirror true

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

বিকল্প বি: একটি সাধারণ রিমোট হিসাবে পুনরায় কনফিগার করুন

তবে যেহেতু মনে হচ্ছে আপনি এই দূরবর্তী রেপোটিকে একাধিক "ওয়ার্ক" রেপো ব্যবহার করছেন, আপনি সম্ভবত আয়না মোড ব্যবহার করতে চান না। আপনি এটি চেষ্টা করতে পারেন:

git config push.default tracking &&
git config --unset remote.origin.push
git config --unset remote.origin.mirror

তারপর, আপনি অবশেষে আপনার রিমোটের রেপো তে বাজে refs / রিমোটের / উৎপত্তি refs মুছে ফেলতে চান হবে: git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures …

পরীক্ষা ধাক্কা

দূরবর্তী রেপোতে কোনও পরিবর্তন না করে এটি git push --dry-runকী করবে git pushতা দেখার চেষ্টা করুন । এটি যা করতে চলেছে যা বলছে তা যদি আপনি পছন্দ না করেন তবে আপনার ব্যাকআপ (টার / জিপ) থেকে পুনরুদ্ধার করুন এবং অন্য বিকল্পটি ব্যবহার করে দেখুন।


4
আমি মনে করি না যে রিমোট ট্র্যাকিং শাখাগুলি রাখা হয়েছিল, যদি সেগুলি একেবারেই অনুলিপি করা হয়। 'গিট শাখা -a' এগুলি প্রদর্শন করে না এবং আমি .git dir- তে এই নামের সাথে কোনও ফাইল খুঁজে পাই না। শেষ অবধি, "গিট লগ" কমান্ডগুলি আপনাকে "মারাত্মক: দ্বিধাহীন যুক্তি 'উত্স / পরিচিতি_পৃষ্ঠা': অজানা সংশোধন বা কার্যকারী গাছের পথে নয়": - though ধন্যবাদ যদিও।
ক্রেগ ওয়াকার

4
ঠিক আছে, সেই শাখাগুলি ছিল, আপনার ধাক্কা লগ এটি দেখায়। .gitদির রেফার্স সন্ধান করার সময় , .git/packed_refsএছাড়াও ছাড়াও চেক করতে ভুলবেন না .git/refs/git show-refআপনার সমস্ত স্থানীয় রেফগুলি (প্যাকড বা 'আলগা') ফেলে দেবে। আপনি এখনও রেপোতে থাকা রেফগুলি সন্ধান করতে সক্ষম হবেন যা মূলত এগুলি আপনার গিটহাব রেপোতে ঠেকিয়েছিল (অন্য কোনও মেশিনে? অন্য কারও রেপো?)। যে ব্যর্থ, যতদিন আপনি একটি জিসি বা খেজুর না করে হিসাবে, আপনি করতে সক্ষম হওয়া উচিত git fsckআনত করে পরীক্ষা এবং তাদের সংযুক্ত করতে আউটপুট: git branch contact_page-recovered <SHA-1-of-dangling-commit>
ক্রিস জনসেন

প্যাকড_আরফগুলির কাছে এটি ছিল না। কমিটগুলি অবশ্যই ঝুঁকছে; কীভাবে তা ঘটেছিল জানিনা। তারপরও আপনার সাহায্যের জন্য ধন্যবাদ!
ক্রেগ ওয়াকার

8

যদি মুছুনটি যথেষ্ট সাম্প্রতিক হয় (ওহ-না-র মত!) আপনার এখনও একটি বার্তা থাকা উচিত:

Deleted branch <branch name> (was abcdefghi).

আপনি এখনও চালাতে পারেন:

git checkout abcdefghi

git checkout -b <some new branch name or the old one>


8
  1. Coimmit id খুঁজে বের করুন

    git reflog

  2. ভুল করে আপনি মুছে ফেলা স্থানীয় শাখা পুনরুদ্ধার করুন

    git branch need-recover-branch-name commitId

  3. আপনি খুব আগে রিমোট শাখা মুছে ফেললে আবারও পুনরুদ্ধার-শাখা-নাম ধাক্কা push

    git push origin need-recover-branch-name


4
এটি আমার পক্ষে কাজ করেছে। আমি গৃহীত উত্তরের চেয়ে বেশি পছন্দ করি কারণ এটি খুব কম পদক্ষেপ ছিল। আমি git reflogঅনুমান করার পরিবর্তে এবং থেকে আমার প্রতিশ্রুতিবদ্ধ বার্তাটি দেখতে সক্ষম হয়েছি git show
TheUideSide

3

গিথুবে ডেটা এখনও বিদ্যমান আছে, আপনি পুরানো ডেটা থেকে একটি নতুন শাখা তৈরি করতে পারেন:

git checkout origin/BranchName #get a readonly pointer to the old branch
git checkout –b BranchName #create a new branch from the old
git push origin BranchName #publish the new branch

1

আমি মনে করি যে 'ফেচ' এবং 'পুশ' এর জন্য আপনার কোনও মিল নেই তবে এটি ডিফল্ট আনয়ন / ধাক্কাটি সঠিকভাবে রাউন্ড ট্রিপ না করায় তৈরি করেছে। ভাগ্যক্রমে আপনি যে শাখাগুলি পরে মুছে ফেলেছেন সেগুলি আপনি এনেছেন যাতে আপনার স্পষ্টভাবে ধাক্কা দিয়ে পুনরায় তৈরি করতে সক্ষম হওয়া উচিত।

git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures

@ ক্রিস জনসনের কাছে আমার মন্তব্যের মতো, দেখা যাচ্ছে যে স্থানীয়ভাবে শাখাগুলি আর নেই (কখনও নয়?)। যখন আমি এটি git push origin origin/contact_page:contact_pageপেয়েছি: error: src refspec origin/contact_page does not match any
ক্রেগ ওয়াকার

ঠিক আছে, আমি মনে করি যা হয়েছে তা আমি দেখেছি (যদিও সম্পূর্ণ ত্রুটিটি সহায়ক হবে)। পুশ মুছে ফেলা শাখা আপডেট করেছে এবং স্থানীয়ভাবে রেফটিকে সরিয়েছে পাশাপাশি এটি একটি ট্র্যাকিং রেফও রয়েছে। কি git rev-parse refs/remotes/origin/origin/contact_pageবলে? বোগাস 'মিরর' কনফিগারেশনের কারণে, এখন আমার শাখাটি স্থানীয় সংগ্রহস্থলে রেফারেন্স করা হবে।
সিবি বেইলি

হাই চার্লস; যেহেতু আমি এটি লিখেছি আমি আমার কনফিগারটিকে মুগ্ধ করেছি (এবং স্থির করেছি) তাই আমি আর (আরটিভ) রিভ-পার্স আউটপুট আর পেতে পারি না। তবে, আমি মনে করি না যে রিমোটগুলিতে একটি দ্বি-নেস্টেড "উত্স" ডিরেক্টরি ছিল।
ক্রেগ ওয়াকার

0

যদি আপনার সংস্থাটি জিআইআরএ বা অন্য কোনও অনুরূপ সিস্টেম ব্যবহার করে যা গিটের সাথে আবদ্ধ থাকে তবে আপনি টিকিটে নিজেই তালিকাবদ্ধ কমিটগুলি খুঁজে পেতে পারেন এবং কোড পরিবর্তনের লিঙ্কগুলিতে ক্লিক করতে পারেন। গিথুব শাখাটি মুছে ফেলে তবে চেরি-বাছাইয়ের জন্য কমিটগুলি উপলব্ধ রয়েছে।


-1

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

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