আমি কীভাবে গিট বেয়ার স্টোরের মধ্যে শেষ প্রতিশ্রুতিটি বাতিল করতে পারি?


94

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

git reset --hard HEAD^ 

এই জাতীয় সংগ্রহস্থলের সর্বশেষ পরিবর্তনটি সমাধান করার সমাধান নয়।

ইন্টারনেটের মাধ্যমে অনুসন্ধান করা, এই বিষয়টির সাথে আমি যা খুঁজে পেতে পারি তা হ'ল এটি , যার মধ্যে আমি এটি করার তিনটি উপায় উপস্থাপন করেছি:
1. "রেফারিকে ম্যানুয়ালি আপডেট করুন (যার মধ্যে প্লাম্বিং জড়িত)";
2. " git push -fএকটি নন-বেয়ার স্টোর থেকে";
3. " git branch -f this $that"।

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


8
@ লাভিনিয়া-গারব্রেইলা ডব্রভল নীচে জটিল জিনিস ব্যবহার করবেন না। আপনি হেডকে একটি পৃথক প্রতিশ্রুতিতে স্থানান্তরিত করার চেষ্টা করছেন এবং গিট রিসেটের জন্য, এমনকি একটি খালি রেপোতেও। নীচে আমার উত্তর অনুসারে, ব্যবহার করুন: গিট রিসেট - এসফ্ট <কমিট> - সাফ্টের সাহায্যে আপনি একটি কার্যকারী বৃক্ষ এবং যে সূচি নেই তা পরিবর্তনের চেষ্টা করবেন না, তাই গিট আপনাকে রিসেটটি কোনও সমস্যা করতে দেয়।
হাজোক

উত্তর:


133

আপনি git update-refকমান্ডটি ব্যবহার করতে পারেন । শেষ প্রতিশ্রুতি অপসারণ করতে, আপনি ব্যবহার করবেন:

$ git update-ref HEAD HEAD^

বা আপনি যদি সেই শাখায় না থেকে থাকেন যেখানে আপনি শেষ প্রতিশ্রুতিটি সরাতে পারবেন না:

$ git update-ref refs/heads/branch-name branch-name^

আপনি চাইলে আপনি একটি শ 1 পাসও করতে পারেন:

$ git update-ref refs/heads/branch-name a12d48e2

গিট-আপডেট-রেফ কমান্ডের ডকুমেন্টেশন দেখুন ।


@ লাভিনিয়া-গ্যাব্রিয়েলা ডব্রোভোলসি: ঠিক, আমি সঠিক বাক্য গঠনের সাথে পরিচিত ছিলাম না।
ভোনসি

@ ভনসি আপনি git update-ref <ref> <newvalue>উদাহরণস্বরূপ, হেডের পরিবর্তে " রেফ / হেড / মাস্টার" এর মতো ডান শাখা হতে <ref> নির্দিষ্ট করতে পারেন । আমি আশা করি আপনার প্রশ্নটি আমি ভুল বুঝতে পারিনি।
ল্যাভিনিয়া-গ্যাব্রিয়েলা ডব্রোভোলসি

@ সিলভাইন: +1 ভাল সম্পাদনা। @ লাভিনিয়া-গ্যাব্রিয়েলা ডব্রোভলসচি নির্ভুলতার জন্য আপনাকে ধন্যবাদ। এটি অনেক বেশি ব্যবহারিক (যদি আপনার রিমোট সার্ভারে সরাসরি প্রবেশ থাকে তবে আমি অনুমান করি)।
ভোনসি

4
উদাহরণগুলি branch-nameআর্গুমেন্টের সাথে বিভ্রান্তিকর । update-refএকটি "শাখা" ব্যবহার করার সময় আপনাকে অবশ্যই শাখার পুরো রেফ নামটি নির্দিষ্ট করতে হবে (অর্থাত্ refs/heads/সংক্ষিপ্ত শাখার সাধারণ নামটি প্রিপেন্ড করুন )। আপনি যদি সংক্ষিপ্ত নামটি ব্যবহার করেন তবে আপনি $GIT_DIR/branch-nameপরিবর্তে তৈরি / আপডেট করা শেষ করবেন $GIT_DIR/refs/heads/branch-name। উভয়ের অস্তিত্ব branch-nameএবং refs/heads/branch-name"পুনর্নামকরণ ... দ্ব্যর্থহীন" সতর্কবার্তা সৃষ্টি করবে।
ক্রিস জনসন

এই উত্তরটি আরও জটিল, তারপরে জাচ কী প্রস্তাব করেছিল। এবং তার সমাধান ভাল কাজ করে।
ক্রিস্টিয়ান

32

আপনি যদি খালি রেপোতে নিম্নলিখিতটি ব্যবহার করেন:

git reset --soft <commit>

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

git reset --soft HEAD^

করার দূরবর্তী রেপো উপর সুইচ শাখা করুন:

git symbolic-ref HEAD refs/heads/<branch_name>

বর্তমান নির্বাচিত শাখার ব্যবহার দেখতে:

git symbolic-ref HEAD

https://mirferences.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html


4
আপনি যে শাখাটি সরিয়ে নিতে চান তা কীভাবে নির্বাচন করবেন? আপনার উদাহরণ মাস্টারের ক্ষেত্রে দুর্দান্ত কাজ করে তবে git checkout other_branchখালি খালি কাজ করে না।
গৌথিয়ার

4
হুম ... আমি ভাবছি কে এই বিষয়ে আমাকে ভোট দিয়েছে। কোনও রিমোট রেপোতে শাখাগুলি কীভাবে স্যুইচ করা যায় তা প্রশ্ন করা হয়নি, এটি একটি বেয়ার রেপোতে কীভাবে রিসেট করবেন জিজ্ঞাসা করেছিল। রিমোট রেপোতে ডিফল্ট শাখা পরিবর্তন করতে, গিট সিম্বলিক-রেফ হেড রেফ / হেডস </ ফ্রেঞ্চ_নাম> ব্যবহার করুন।
হাজোক

7

git push -fসূক্ষ্ম কাজ করা উচিত:
যদি আপনি যে খালি রেপো ক্লোন, অপসারণ গত কমিট ( git reset --hard HEAD^হিসাবে আপনি উল্লেখ, কিন্তু একটি স্থানীয় অ খালি রেপো) ও ধাক্কা ফিরে ( -f):

  • আপনি অপসারণের আগে থাকা অন্যান্য প্রতিশ্রুতিগুলির জন্য কোনও SHA1 পরিবর্তন করবেন না।
  • আপনি নিশ্চিত যে অতিরিক্ত খোলার রেফার বিয়োগের যথাযথ সামগ্রীটিকে পিছনে ফেলে দিচ্ছেন (কারণ আপনি কেবল এটি প্রথমে ক্লোন করেছেন)।

@ ভনসি হাই ভন, আমি আপনাকে গিটের উপরে অনেক উত্তর দিতে দেখেছি যাতে আপনাকে জিজ্ঞাসা করতে চেয়েছিল ... আমি কৌতূহলী ছিলাম, কেন git reset --soft <sha1>নীচে আমার উত্তরে দেখানো হয়েছে যে খালি রেপোতে হেড হেড করার পরামর্শ দেওয়া অনুশীলন হবে না?
হাজোক

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

4
@ জাচ: খালি রেপোতে reset --softসরাসরি কাজ করা উচিত। আমি এই খুব কমই এরা হাশমত মুহুরির নাতিপুতি কারণ একটি খালি রেপো সাধারণত একটি হল সন্দেহ মূল প্রজেক্টের রেপো (অর্থাত একটি রেপো যার প্রতি তুমি ঠেলে দিচ্ছেন ডেটা), এবং অধিকাংশ সময়, আপনি না এটা একটি সরাসরি স্থানীয় এক্সেস আছে। তবে আপনি যদি তা করেন তবে অবশ্যই এটি ব্যবহারের আরও একটি ভাল উদাহরণ reset --soft(যেমন স্ট্যাকওভারফ্লো / প্রশ্ন / 5203535/… হিসাবে রয়েছে ) সুতরাং আপনার উত্তরটি +1 করুন।
ভোনসি

2

আপনি গিট রেফস্পেক সংকেত ব্যবহার করতে পারেন এবং এর মতো কিছু করতে পারেন:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

এই গন্তব্য শাখার আপডেট (রেফ দ্বারা চিহ্নিত হিসাবে) +<object ref>অংশ দ্বারা চিহ্নিত হিসাবে উত্স প্রতিশ্রুতিবদ্ধ ।


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