আমি কীভাবে একটি ক্ষতিকারক গিট পুশ-ফ উত্সের মাস্টার থেকে পুনরুদ্ধার করতে পারি?


93

আমি কেবল --forceবিকল্পটি ব্যবহার করে আমার প্রকল্পের জন্য ভুল উত্স প্রতিশ্রুতিবদ্ধ ।

ফিরে যাওয়া কি সম্ভব? আমি বুঝতে পারি যে পূর্ববর্তী সমস্ত শাখাগুলি -fবিকল্প ব্যবহার করে ওভাররাইট করা হয়েছে , তাই আমি আমার পূর্ববর্তী সংশোধনগুলি ভুল করে দিতে পারি।


উত্তর:


55

গিট সাধারণত কিছু ফেলে দেয় না, তবে এ থেকে পুনরুদ্ধার করা এখনও জটিল।

আপনার যদি সঠিক উত্স থাকে তবে --forceবিকল্পটি দিয়ে আপনি কেবল এটি দূরবর্তী অঞ্চলে ঠেলাতে পারবেন। গিট কোনও শাখা মুছে ফেলবে না যদি না আপনি এটি না বলেন। আপনি যদি কমিটগুলি হারিয়ে ফেলে থাকেন তবে কমিটগুলি পুনরুদ্ধার করার জন্য এই দরকারী গাইডটি দেখুন । আপনি যদি চান যে কমিটগুলির SHA-1 জেনে থাকেন তবে সম্ভবত আপনি ঠিক আছেন।

করণীয় সেরা: সমস্ত কিছু ব্যাক আপ করুন এবং দেখুন আপনার স্থানীয় ভাণ্ডারে এখনও কী রয়েছে। সম্ভব হলে রিমোটেও একই কাজ করুন। git fsckআপনি জিনিসগুলি পুনরুদ্ধার করতে পারেন কিনা এবং সর্বোপরি চালাবেন নাgit gc তা দেখতে ব্যবহার করুন ।

সর্বোপরি, --forceবিকল্পটি কখনও ব্যবহার করবেন না যদি না আপনি সত্যই সত্যই তা বোঝেন।


66
দূরবর্তী শাখাটি মূলত কোথায় ছিল তা নির্ধারণ করার জন্য আপনি খুব সম্ভবত রিফ্লোগগুলিতে সন্ধান করতে পারেন। উদাহরণস্বরূপ git reflog show remotes/origin/master,। আপনি সেখানে আপনার ধাক্কা দেখতে সক্ষম হবেন; পূর্ববর্তী লাইনে প্রতিশ্রুতিবদ্ধতা হ'ল এটির আগে আপনি এটি গোলমাল করেছিলেন। তারপরে আপনি কেবল সেই সংশোধনটিকে উত্সাহিত করতে (সহ --force) টিপতে পারেন এবং আপনি যেখানে ছিলেন সেখানে ফিরে আসতে পারেন!
ক্যাসাবেল

@ ডেভিড: ওহ আপনি আপনার প্রশ্নে উল্লেখ করেন নি যে আপনার কাছে রেপো নেই। (এটি অবশ্যই এমন কিছু যা আপনি কখনই করতে চান না)) যদি আপনি যেখানে ফাইল সিস্টেমের অ্যাক্সেস পেয়ে থাকেন তবে যেখানে আপনি এগিয়ে এসেছেন সেখানে আপনি এখনও এই সমস্ত কিছু করতে পারেন।
ক্যাসকেবেল

4
@ ডেভিড: হাই এই ধরণের জিনিস এড়াতে আপনার প্রম্পটের অংশ হিসাবে আপনার বর্তমান ডিরেক্টরিটি রাখা সর্বদা ভাল।
ক্যাসকেবেল

4
@ জেফ্রোমি আমি মনে করি আপনি যা বলেছেন সেখানে আসল অ্যানওয়ার রয়েছে: এমনকি একটি পুরানো সংস্করণ ( git fetchদীর্ঘকাল এড না হওয়া) দিয়েও আপনি গিটহাবের পাশের রিফলোগটি প্রদর্শন করতে পারেন এবং পুনরুদ্ধার করতে পারবেন!
এনএইচ 2

4
@ জেফ্রমি এই উত্তরটি কোথায়? আমি এই মন্তব্য থ্রেডের বাইরে এই পৃষ্ঠায় উল্লিখিত ব্যবহারকারীটিকে দেখতে পাচ্ছি না।
ডন ম্যাককার্দি

47

যদি আপনি কমিট হ্যাশ জানেন, তবে এটি সহজ, কেবল আপনার শাখাটি পুনরায় তৈরি করুন ate

5794458...b459f069 master -> master (forced update)

দূরবর্তী শাখা মুছুন:

git push origin :master

তারপরে নিম্নলিখিত কমান্ডগুলি দিয়ে আপনার শাখাটি পুনরায় তৈরি করুন:

git checkout 5794458
git branch master
git push origin master

28

সমাধানটি ইতিমধ্যে এখানে উল্লেখ করা হয়েছে

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master

আপনাকে ধন্যবাদ, এটি আমার জন্য কাজ করেছে। মাস্টার মুছতে আমার অ্যাক্সেস নেই তাই অনুমোদিত মন্তব্য ব্যর্থ হয়েছিল।
Andi

হ্যাঁ, এবং git reflog show remotes/origin/masterযদি গিট রিফ্লোগের প্রয়োজন হয় (উপরে @ ক্যাসাবেল দ্বারা উল্লিখিত)
জোশিয়াহ

4
এটি সঠিক উত্তর, সঠিকটির সাথে লিঙ্ক দেওয়ার জন্য ধন্যবাদ।
নোটিডার্ট

6

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

  1. ইভেন্টগুলি তালিকাবদ্ধ করুন এবং প্রতিশ্রুতিবদ্ধ sha1 দীর্ঘ ফর্ম্যাটটি সন্ধান করুন

https://api.github.com/repos/apache/logging-log4j2/events

  1. হারানো প্রতিশ্রুতি ডাউনলোড করুন এবং সম্পর্কিত প্যাচটিকে জসন পথে পুনরুদ্ধার করুন f ফাইলস [] / প্যাচ

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. স্থানীয়ভাবে প্রয়োগ করুন এবং আবার চাপ দিন

গিট প্রয়োগ করুন প্যাচ.প্যাচ এবং অ্যান্ড গিট কমিট-এম "রিস্টোর কমিট" এবং& গিট পুশ অরিজিনাল মাস্টার


4

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

আপনার যদি এমন কোনও কাজ করেন যা প্রতিটি প্রতিশ্রুতি (বা ধারাবাহিক কমিটের ধারাবাহিক) পরে মাস্টার শাখা পরীক্ষা করে, যা আপনার হওয়া উচিত, আপনি একবারে এটি পরীক্ষা করে দেখতে পারেন। এটি আপনাকে পুনরুদ্ধার করতে হবে এমন প্রতিশ্রুতি।

সিআই মেশিন এমনকি রেপোর একটি স্থানীয় ক্লোন রাখতে পারে, যেখান থেকে আপনি এই পুনরুদ্ধার করতে সক্ষম হতে পারেন।

উত্স: সম্ভবত অবিচ্ছিন্ন ডেলিভারি: বিল্ড, টেস্ট এবং ডিপ্লোয়মেন্ট অটোমেশন (অ্যাডিসন-ওয়েসলি সিগনেচার সিরিজ (ফোলার)) এর মাধ্যমে নির্ভরযোগ্য সফ্টওয়্যার রিলিজ


3

হ্যাঁ আপনি কমিটগুলি পুনরুদ্ধার করতে পারেন git push -f your_branch

ডকের পাঠ্য :

নির্দিষ্ট সময়ের চেয়ে পুরানো এন্ট্রিগুলিকে ছাঁটাই করুন। এই বিকল্পটি নির্দিষ্ট না করা থাকলে, মেয়াদোত্তীকরণ সময়টি কনফিগারেশন সেটিং gc.reflogExpire থেকে নেওয়া হয়, যা 90 দিনের মধ্যে ডিফল্ট হয়। --expire = সমস্ত prunes এন্ট্রি তাদের বয়স নির্বিশেষে; --expire = অ্যাক্সেসযোগ্য এন্ট্রিগুলির ছাঁটাই কখনই বন্ধ করে না (তবে - এক্সপায়ার-অ্যাক্সেসযোগ্য দেখুন)।

সুতরাং আপনি এটি করতে পারেন:

1- git reflog

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

2- আপনি Head_Number চয়ন করেন আপনি কি পুনরুদ্ধার করতে চান git reset –hard HEAD@{HEAD-NUMBER}

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

3- আপনি এই মাথাতে সমস্ত কমিটগুলি দেখতে পাচ্ছেন git cherry -v branch_name

4- শেষ পর্যন্ত আপনি জোর করা উচিত git push -f branch_name

বা

1- আপনার জিআইটি ক্লায়েন্টের কাছ থেকে এসএএএর নম্বর পান (ইন্টারফেস)

git reset --hard commit_SHA

2- জোর ঠেলা

git push -f your_branch

আশাকরি এটা সাহায্য করবে


2

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

আমি যা করলাম তা হ'ল (স্পষ্টতই স্থানীয় রেপোর কয়েকটি কপি তৈরি করার পরে):

git add .
git status

(এটি বলেছে যে উত্স / মাস্টার 68 টি কমিট দ্বারা এগিয়ে ছিল, জরিমানা ... এগুলি আমি মুছে ফেলা সমস্ত কমিট ছিল)

git remote set-url origin <GIT_SSH_URL>
git push

আমি জোর করে ধাক্কা দেওয়ার আগে সবকিছু ঠিকঠাক হয়ে গেছে। সবচেয়ে গুরুত্বপূর্ণ বিষয়টি মনে রাখতে হবে কখনই গিট চেকআউট করা উচিত নয়। আপনি জোর করে ধাক্কা পরে। তবে সর্বোত্তম অনুশীলন হ'ল পুশ বিকল্পটি অক্ষম করা। আমি আর কখনও এটি ব্যবহার করি না। আমার পাঠ শিখেছি !!


1

আমার মতো সত্যই খারাপ পরিস্থিতিতে থাকা লোকদের জন্য (উদাহরণস্বরূপ, bad objectদৌড়ানোর সময় আপনি যদি ত্রুটি পেয়ে থাকেন git reset --hard):

আমি ট্রিসএভার নামে একটি স্ক্রিপ্ট লিখেছিলাম যা আপনার সমস্ত ফাইল গিটহাব এপিআই থেকে একটি শেষ অবলম্বন হিসাবে টেনে নেয়। এটি কীভাবে ব্যবহার করবেন তা এখানে:

  1. treesaverস্ক্রিপ্ট এবং cdএটি ক্লোন করুন ।
  2. এই SHAগাছ আপনি অ্যাক্সেস করার মাধ্যমে পুনঃস্থাপন করতে চাইছেন তার স্ট্রিং https://api.github.com/repos/<your_username_or_org>/<repo>/events
  3. ইন payloadসম্পত্তি আপনার ধাক্কা ঘটনা সংশ্লিষ্ট, খুঁজুন commitআপনি প্রত্যাবর্তন এবং তার উপর ক্লিক করুন চাই url
  4. অধীনে commit.tree, কপি tree'র url
  5. চালান python3 main.py <tree_url> <path_to_save_to>

উদাহরণস্বরূপ, আমার ক্ষেত্রে, আমি চালাতাম:

python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .

অবশ্যই, PRs স্বাগত জানায়।


0

এখানে আপনি সিদ্ধান্তগুলি https://evilmartians.com/chronicles/git-push---for-and-how-to-deal-with-it পড়তে পারেন

দ্বিতীয়টি আমাকে সাহায্য করেছিল। আমি এই আদেশগুলি ভুল করেছি

1) (some-branch) git pull -> correct command was git pull origin some-branch

2) (some-branch) git push -f origin some-branch

এই আদেশগুলির পরে আমি তিনটি কমিট হারিয়েছি। তাদের পুনরুদ্ধার করতে আমি টার্মিনালের দিকে চেয়েছিলাম যেখানে আমি ভুলভাবে 'গিট পুল' করেছি এবং সেখানে আউটপুট দেখতে পেয়েছি

60223bf ... 0b258eb কিছু-শাখা -> উত্স / কিছু-শাখা

দ্বিতীয় হ্যাশ 0 বি 258eb ঠিক আমার যা প্রয়োজন তা ছিল। সুতরাং, আমি এই হ্যাশটি নিয়েছি এবং কমান্ড তৈরি করছি

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