কিভাবে প্রাথমিক গিট কমিট ফিরিয়ে আনবেন?


357

আমি প্রথমবারের জন্য একটি গিটার সংগ্রহস্থলের প্রতিশ্রুতিবদ্ধ; আমি তখন প্রতিশ্রুতির জন্য আফসোস করি এবং এটি প্রত্যাহার করতে চাই। আমি চেষ্টা করি

# git reset --hard HEAD~1

আমি এই বার্তাটি পেয়েছি:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

এই প্রতিশ্রুতিটি সংগ্রহস্থলের প্রথম প্রতিশ্রুতি। গিটের প্রাথমিক প্রতিশ্রুতিটি কীভাবে পূর্বাবস্থাপন করবেন?

উত্তর:


565

আপনার যে শাখাটি চালু রয়েছে সেগুলি আপনাকে মুছতে হবে। git branch -Dএটি করার বিরুদ্ধে এটির নিরাপত্তা যাচাই করার কারণে আপনি ব্যবহার করতে পারবেন না । আপনি এটি করতে ব্যবহার করতে পারেন update-ref

git update-ref -d HEAD

না না ব্যবহার rm -rf .gitবা এই যেমন এই মত কিছু সম্পূর্ণরূপে অন্য সব শাখা এবং সেইসাথে শাখা যে আপনার রিসেট করার চেষ্টা করছেন সহ আপনার সমগ্র সংগ্রহস্থলের মুছা হবে।


1
রিবেসে থাকাকালীন এটি চেষ্টা করে - প্রথমে প্রথম প্রতিশ্রুতি বিভক্ত করতে চেয়েছিল - তারপর করেছিল git statusএবং আমার অবাক করে দিয়েছিল, গিট বলেছে fatal: Not a git repository (or any parent up to mount point ...)!
ম্যাট ফেনউইক

1
এটি আমার পক্ষে কাজ করে না। কিছু যে উপেক্ষা করা উচিত কিন্তু কোন সহ ফাইল করুন .gitignoregit add ., git commit -m "initial commit", git update-ref -D HEAD, একটি তৈরি .gitignore, বিজ্ঞপ্তি যে Git এখনও ফাইল আগেই যে উপেক্ষিত উচিত যোগ এইজন্য করা হয়। অন্য কথায় git update-ref -d HEADপ্রাথমিক অঙ্গীকারের আগে আমাকে আর রাজ্যে নিয়ে যায়নি।
gman

1
তবে এটি মূল প্রশ্নের মূল বিষয়। প্রাথমিক অঙ্গীকারের ঠিক আগে রাজ্যে ফিরে যাওয়া।
gman

2
git reset --hard HEAD~1অন্যান্য সমস্ত কমিটের জন্য যুক্ত ফাইলগুলি সরিয়ে ফেলবে। স্পষ্টতই প্রশ্নটি হল যে সেই আদেশটি অন্য যে কোনও ক্ষেত্রে যেমন কাজ করে তেমন একই স্থানে কীভাবে যায়। এই সমাধানটির প্রমাণটি দেখুন আপনার সমাধান কাজ করে না gist.github.com/greggman/522fa69a21d6cfb3ff0b
gman

11
জ্যামনের মন্তব্যে যে কেউ বিভ্রান্ত হয়ে পড়ে: আসলে প্রাথমিক প্রতিশ্রুতি প্রত্যাহার git update-ref -d HEAD করে না, তবে পূর্বে করা সমস্ত পরিবর্তনগুলি সূচকে যুক্ত করে রাখে। আপনি যদি এই পরিবর্তনগুলিও সরাতে চান তবে কেবল একটি নিম্নলিখিতটি কার্যকর করুন git reset --hard। অসম্পূর্ণ হলেও, এই উত্তরটি প্রকৃতপক্ষে সেরা, সুতরাং ব্যবহার করা এড়িয়ে চলুন rm -fr .git(যদি না আপনি জানেন যে কী করছেন)।
আরএসএনএ

62

আপনি হেড মুছতে পারেন এবং আপনার ভান্ডারটিকে নতুন অবস্থায় ফিরিয়ে দিতে পারেন, যেখানে আপনি একটি নতুন প্রাথমিক প্রতিশ্রুতি তৈরি করতে পারেন:

git update-ref -d HEAD

আপনি একটি নতুন প্রতিশ্রুতি তৈরি করার পরে, আপনি যদি ইতিমধ্যে দূরবর্তী দিকে ঠেলাঠেলি করে থাকেন তবে পূর্ববর্তী প্রাথমিক প্রতিশ্রুতিটি মুছে ফেলার জন্য আপনাকে এটি রিমোটে বাধ্য করতে হবে:

git push --force origin

1
লক্ষ্য করা যায় না ... এটি সঠিক কমান্ড তবে এটি হেডকে মুছে দেয় না ... এটি রেফটি মুছে দেয় (.git \ refs \ মাথার নীচে অবস্থিত) .git \ HEAD ফাইল যাচাই করেছে। এই কমান্ডটি চালনার পরেও আপনি মুছে ফেলা রেফার্স / হেডস << নাম> ফাইলের দিকে ইঙ্গিত করে HEAD ফাইলটি খুঁজে পেতে পারেন তবে আপনি যদি সেই পথটি অনুসরণ করেন তবে দেখতে পাবেন যে মাথাগুলি রেফ নেই।
ড্যানেকে

15

এই প্রশ্নটি এই ব্লগ পোস্ট থেকে যুক্ত করা হয়েছিল এবং গিটের নতুন সংস্করণগুলির জন্য একটি বিকল্প সমাধান প্রস্তাব করা হয়েছিল:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

এই সমাধানটি ধরে নেয় যে:

  1. আপনার masterশাখায় আপনার কেবল একটি অঙ্গীকার রয়েছে
  2. কোনও শাখা নেই old_masterতাই আমি নামটি ব্যবহার করতে পারছি না

এটি বিদ্যমান শাখার নাম পরিবর্তন করে old_masterএকটি নতুন, অনাথ, শাখা master তৈরি করবে (এটি নতুন ভাণ্ডারের জন্য তৈরি করা হয়েছে) যার পরে আপনি নির্দ্বিধায় মুছতে পারবেন old_master... না। আপনার উপর

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


11

প্রশ্নে বর্ণিত শর্তগুলির মধ্যে:

  • প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ মধ্যে প্রথম প্রতিশ্রুতিবদ্ধ।
  • যার অর্থ খুব কম কমান্ড কার্যকর করা হয়েছে:
    • একটি git init,
    • সম্ভবত কিছু git addঅপারেশন,
    • এবং একটি git commit,
    • এবং যে সব!

যদি এই পূর্বশর্তগুলি পূরণ হয়, তবে প্রাথমিক প্রতিশ্রুতি পূর্বাবস্থায় ফেলার সহজ উপায় হ'ল:

rm -fr .git

আপনি যে ডিরেক্টরিটি করেছিলেন সেখানে থেকে git init। এরপরে আপনি git initগিট সংগ্রহস্থলটি পুনরায় তৈরি করতে এবং পুনরায় সম্পাদন করতে পারবেন এবং যে পরিবর্তনগুলি বোধগম্য তার সাথে সংযোজনগুলি পুনরায় করতে পারবেন যা আপনি প্রথমবার না করার জন্য আফসোস করেছেন এবং প্রাথমিক প্রতিশ্রুতি পুনরায় করুন।

বিপদ! এটি গিট সংগ্রহস্থল ডিরেক্টরিটি সরিয়ে দেয়।

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

অযাচিত ক্লোনড সংগ্রহস্থল সরানোর জন্য এটি করা নিরাপদ; এটি যে ক্লোনিস থেকে ক্লোন করা হয়েছিল তাতে কোনও ক্ষতি করে না। এটি আপনার অনুলিপিতে যা কিছু করেছে তা দূরে সরিয়ে দেয় তবে অন্যথায় আসল সংগ্রহস্থলকে প্রভাবিত করে না।

সাবধানতা অবলম্বন করুন, তবে পূর্বশর্তগুলি পূরণ করার সময় এটি নিরাপদ এবং কার্যকর।

আপনি যদি আপনার সংরক্ষণাগার দিয়ে অন্য জিনিসগুলি সংরক্ষণ করে রাখতে চান তবে এটি উপযুক্ত কৌশল নয় - আপনার সংগ্রহস্থলটি যথাযথ হওয়ার জন্য পূর্ব শর্তগুলি পূরণ করে না।


9
এটা খারাপ পরামর্শ। রেপোর অন্যান্য জিনিসগুলি যা আপনি হারাতে চান না তা হলে কী হবে?
ম্যাট ফেনউইক

5
তাহলে এটি প্রাথমিক প্রতিশ্রুতি হবে না, এটি করবে। প্রাথমিক একমাত্র প্রতিশ্রুতি আছে।
জোনাথন লেফলার

9
"তাহলে এটি প্রাথমিক প্রতিশ্রুতি হবে না" - আসলে, হ্যাঁ এটি হবে। আপনি একাধিক শাখার খুব সাধারণ ক্ষেত্রে অবহেলা করছেন। চার্লসের উত্তর দেখুন।
ম্যাট ফেনউইক

2
সহায়ক, তবে একটি সতর্কতা সহ আসা উচিত।
সাইমন বেঙ্গস্টসন

5
এটি আসলে কাজ করে। গৃহীত উত্তর দেয় না। মন্তব্য দেখুন
gman


3

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

আপনি বর্তমানে ডান শাখায় রয়েছেন তা নিশ্চিত করুন।

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

এটি সমস্যার সমাধান করতে সক্ষম হয়েছিল।

গুরুত্বপূর্ণ

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


1

আমি অবাক হই যে কেন "সংশোধন" প্রস্তাবিত নয় এবং @ ডামক্র্যাট দ্বারা অতিক্রম করা হয়েছে, কারণ সংশোধনটি আমার কাছে ভুল প্রতিশ্রুতি সংশোধনের সবচেয়ে কার্যকরভাবে অন্তর্নিহিত সমস্যা সমাধানের সঠিক উপায় হিসাবে দেখা যাচ্ছে কারণ কোনও প্রাথমিক থাকার কোনও উদ্দেশ্য নেই। কমিট। কেউ কেউ জোর দিয়ে বলেছে যে কেউ যদি আপনার রেপো ক্লোন না করে থাকে তবে আপনাকে কেবলমাত্র "পাবলিক" শাখাকে মাস্টারের মতো পরিবর্তন করতে হবে ...

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"


0

গিট রিসেট - পরিবর্তন করুন, তারপর করবেন

git add -A
git commit --amend --no-edit 

অথবা

git add -A
git commit --amend -m "commit_message"

এবং তারপর

git push origin master --force

- ফোর্স পুনরায় লেখবে যে প্রতিশ্রুতি আপনি প্রথম পদক্ষেপে পুনরায় সেট করেছেন।

এটি করবেন না, কারণ আপনি ভিসিএস সিস্টেম এবং বিশেষত গিটের পুরো ধারণাটির বিরুদ্ধে যাচ্ছেন। একমাত্র ভাল পদ্ধতি হ'ল নতুন তৈরি করা এবং অনিবদ্ধ শাখা মুছে ফেলা। তথ্যের git help branchজন্য দেখুন ।


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