একটি নির্দিষ্ট প্রতিশ্রুতিতে রিমোট রিসেট করা


709

প্রতিশ্রুতিবদ্ধতার পরে করা সমস্ত পরিবর্তনগুলি আমি বাতিল করতে চাই <commit-hash>। তাই আমি:

git reset --hard <commit-hash>

এখন আমি আমার রিমোট দিয়েও একই কাজ করতে চাই। কিভাবে আমি এটি করতে পারব? আমি পরে কিছু কমিট (এবং ঠেলাঠেলি) <commit-hash>করেছি এবং আমি কেবল সেগুলি বাতিল করতে চাই। কিছু গিয়েছিলাম ভয়ঙ্কর ভাবে ভুল এবং আমি তুলনায় এটি আগে থেকেই এটা খারাপ করতে চাই না। ; (

আমি মূলত আমার রিভাইন্ড origin/masterকরতে চাই<commit-hash>


3
আপনি কি নিশ্চিত যে origin/masterঅন্য ব্যবহারকারীরা আপনাকে টেনে এনে ধাক্কা দেয়নি? জনসাধারণের (যেমন অ-স্থানীয়) সংগ্রহস্থলের ইতিহাসের পরিবর্তন হ'ল এমন কিছু যা আপনি সর্বদা এড়াতে চান।
vindia

উত্তর:


1250

ধরে নিই যে আপনার শাখাটি masterএখানে এবং দূরবর্তীভাবে উভয়ই বলা হয় এবং আপনার রিমোটকে বলা originযেতে পারে আপনি এটি করতে পারেন:

 git reset --hard <commit-hash>
 git push -f origin master

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

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

যেহেতু আপনার প্রশ্ন থেকে এটি স্পষ্ট হয়েছে যে আপনি ইতিমধ্যে git reset --hardআপনার masterশাখাটি পুনরায় সেট করতে ব্যবহার করেছেন git reset --hard ORIG_HEAD, আপনার শাখাটি যেখানে আগে ছিল সেখানে ফিরিয়ে নিয়ে যেতে শুরু করার প্রয়োজন হতে পারে । (সর্বদা হিসাবে সঙ্গে git reset --hard, নিশ্চিত করুন যে git statusপরিচ্ছন্ন হয়, যে আপনি সঠিক শাখা আছি এবং যে আপনার হয় সচেতন git reflogযেমন দৃশ্যত হারিয়ে করে পুনরুদ্ধার করতে একটি হাতিয়ার।) এছাড়াও, আপনি এখানে পরীক্ষা করা উচিত ORIG_HEADপয়েন্ট অধিকার কমিট সঙ্গে git show ORIG_HEAD

সমস্যা সমাধান:

যদি আপনি " ! [রিমোট প্রত্যাখ্যান] a60f7d85 -> মাস্টার (প্রাক রিসিভ হুক প্রত্যাখ্যানিত) " এর মতো কোনও বার্তা পান তবে

তারপরে আপনাকে নির্দিষ্ট শাখার জন্য শাখার ইতিহাস পুনরায় লেখার অনুমতি দিতে হবে। বিটবকেটে উদাহরণস্বরূপ এটি বলেছে "শাখার ইতিহাসের পুনর্লিখন অনুমোদিত নয়"। একটি চেকবক্স রয়েছে Allow rewriting branch historyযা আপনাকে যাচাই করতে হবে।


21
বিপদ বিপদ: এই রিসেটটি ধরে নিচ্ছে যে সম্পর্কিত ( ট্র্যাকিং ) শাখাটি বর্তমানে চেক আউট হয়ে গেছে এবং আপনি রাখতে চান এমন কোনও আপত্তিহীন পরিবর্তন নেই। পরিবর্তে ব্যবহার করুনgit update-refreset --hard ; এটা আপনার একটি চালু গাছ করেও একই কাজ করার অনুমতি দেবে / শাখা চেক আউট
sehe

3
আমি দেখি. এটি অন্যদের দ্বারা ঠেলা এবং পরিবর্তন করা হয়েছে। সুতরাং আমার ব্যবহার করা উচিত revert তবে আমি বলি যে আমি অতীত 4 টি প্রতিশ্রুতি ফিরিয়ে দিতে চাই যাতে আমার করা উচিত git revert comit1; git push; git revert comit2; git push; ...বা সহজভাবে করা উচিত git revert commit4; git push?
nacho4d

1
@ নাচো ৪ ডি: আপনার প্রত্যেকটি উল্টে যাওয়ার পরে চাপ দেওয়ার দরকার নেই - জাকুব নরবস্কির এই উত্তরে কী করতে হবে তার একটি সুন্দর বর্ণনা রয়েছে । আপনার প্রতিটি প্রতিশ্রুতি পিছনের দিকে ফিরে যাওয়া দরকার - কেবল করা git revert commit4একটি নতুন প্রতিশ্রুতি তৈরি করে যা কেবলমাত্র চালু হওয়া পরিবর্তনগুলিকেই বাতিল করে দেয় commit4। উত্তর হিসাবে আমি পয়েন্ট আউট সংযুক্ত, যদিও, আপনি এই একক প্রতিশ্রুতি রোল করতে পারেন।
লংগায়ার

1
@ মার্ক আমি ইতিমধ্যে দৌড়েছি git reset --hardকিন্তু আমি আমার স্থানীয় মুছে ফেলেছি এবং আবার উত্স থেকে টানাছি তাই এখন আমার সন্দেহটি করতে সক্ষম git revert ...হ'ল: আমাকে কি প্রতিটি প্রতিশ্রুতি ফিরিয়ে দিতে হবে এবং একের পর এক ধাক্কা দিতে হবে বা কেবল প্রথম প্রতিশ্রুতি ফিরিয়ে দিতে হবে? ঠিক কি প্রতিশ্রুতিবদ্ধ?
nacho4d

1
@ সেহ: এটি ব্যবহার করা কঠিন কারণ আপনার পুরো রেফ নামটি ব্যবহার করা দরকার, এবং তাই লোকেরা তাদের .gitডিরেক্টরিটি রেফারেট দিয়ে ফাঁসানো সহজ যে তারা তৈরি করতে চাইছিল না। যদিও আমি বলছিলাম ভুল ছিল না যে সুরক্ষা চেক নেই। গিট ম্যান পৃষ্ঠায় আপনি "নদীর গভীরতানির্ণয়" এবং "চীনামাটির বাসন" কমান্ডগুলিতে শ্রেণিবিন্যাসটি পেতে পারেন ।
লংগায়ার

123

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

যদি আপনি কেবল রিমোট ম্যাচটিকে আপনার স্থানীয় রেপোর যে কোনও জায়গায় প্রতিশ্রুতিবদ্ধ করতে চান:

  1. কোনও রিসেট করবেন না
  2. git logআপনি যে রিমোটটিতে থাকতে চান তা সন্ধান করতে ব্যবহার করুন । git log -pপরিবর্তনগুলি দেখতে, বা git log --graph --all --oneline --decorateএকটি কমপ্যাক্ট ট্রি দেখতে।
  3. কমিটের হ্যাশ বা তার ট্যাগ, বা এর শাখার নাম টিপ দিলে অনুলিপি করুন।
  4. একটি কমান্ড চালান:

    git push --force <remote> <commit-ish>:<the remote branch>
    

    যেমন

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    

    অথবা

    git push --force staging v2.4.0b2:releases
    

আমি git goদ্বিতীয় ধাপ হিসাবে ইতিহাস দেখার জন্য সুবিধাজনক উপনাম ( ) ব্যবহার করি , যা এর মতো যুক্ত করা যেতে পারে:

    git config --global alias.go 'log --graph --all --decorate --oneline'`

3
গ্রাফটি খুব সুন্দর একটি টিপ ছিল, আমি কেবল সর্বশেষ এন কমিটগুলি পেতে -5 যুক্ত করেছি, এটি অন্য বিশাল গাছ ছিল। এছাড়াও রিসেটটি এড়িয়ে যাওয়া আমি যা খুজছিলাম। দুর্দান্ত
আলেকজান্ডার

@ আলেকজান্দার ডি আপনি নিজের শেলের চেয়ে গিটে উপনামটি যুক্ত করতে পারেন, তাই এটি সর্বত্র কার্যকর হয়। গিট সেই সমস্ত উপকরণগুলি বুঝতে পারে এবং সম্পূর্ণ কমান্ড থেকে ট্যাব-সম্পূর্ণ হয় যাতে আপনি যুক্তি যুক্ত করতে পারেন। git config --global alias.graph 'log --graph --all --decorate --oneline'কম অগোছালো এবং আপনি এখনও এটি সীমাবদ্ধ করতে পারেন, যেমন:git graph -5
ওয়াল্ফ

এটি নিখুঁত। আমি সবসময় আমার লোকাল জড়ান। দুর্ঘটনাক্রমে আমার মঞ্চকে বেঁচে থাকার জন্য চাপ দেওয়ার পরে আমার ঠিক এটি দরকার ছিল :( ধন্যবাদ!
জ্যাক

1
উইন্ডোজে qগিট লগ থেকে প্রস্থান করতে প্রবেশ করুন । 2 মিনিট আমি আর ফিরে আসব না।
dst3p

1
@ dst3p এটি প্রতিটি প্ল্যাটফর্মের, সাথী। পেজার প্রোগ্রামটি সাধারণত হয় lessএবং qএটি থেকে প্রস্থান করার স্বাভাবিক উপায়। গিট ব্যাশ একটি * নিক্স টার্মিনালের মতো।
ওয়ালফ


13

GitLab, আপনি আপনার শাখা স্থাপন করতে হতে পারে অরক্ষিত এই কাজ করার আগে। আপনি [repo]> সেটিংস> সংগ্রহস্থল> সুরক্ষিত শাখায় এটি করতে পারেন। তারপরে মার্কের উত্তর থেকে পদ্ধতিটি কাজ করে।

git reset --hard <commit-hash>
git push -f origin master

10

আপনি যদি ফাইলটির আগের সংস্করণ চান তবে আমি গিট চেকআউট ব্যবহার করার পরামর্শ দেব।

git checkout <commit-hash>

এটি করা আপনাকে সময়মতো ফিরে পাঠাবে, এটি আপনার প্রকল্পের বর্তমান অবস্থাকে প্রভাবিত করবে না, আপনি মেইনলাইন গিট চেকআউট মূলধারায় আসতে পারেন

তবে আপনি যখন যুক্তিতে কোনও ফাইল যুক্ত করেন, সেই ফাইলটি আপনার আগের প্রকল্প থেকে আপনার বর্তমান প্রকল্পের সময় হিসাবে ফিরিয়ে আনা হয়, অর্থাৎ আপনার বর্তমান প্রকল্পটি পরিবর্তিত হয়ে প্রতিশ্রুতিবদ্ধ হওয়া দরকার।

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

এর সুবিধাটি হ'ল এটি ইতিহাস মুছবে না এবং কোনও নির্দিষ্ট কোড পরিবর্তনও ফিরিয়ে দেবে না (গিট রিভার্ট)

এখানে আরও দেখুন https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout


এটি একটি দুর্দান্ত উত্তর: এটি কাজ করে, সময়কাল এবং খুব নিরাপদ; আপনি যদি গোলযোগ করেন তবে ফিরে যাওয়া সহজ।
বব

8

পূর্বের উত্তরগুলিতে আমার দুটি সেন্ট: যদি

git push --force <remote> <the-hash>:<the remote branch>

এখনও কাজ করে না, আপনি <your-remote-repo>.git/configফাইলের প্রাপ্ত বিভাগটি সম্পাদনা করতে চাইতে পারেন :

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false

বেশিরভাগ উত্তরগুলি গিথুব বা বিটবাকেটের মতো একটি দূরবর্তী পরিষেবা অনুমান করে বলে মনে হয় যে দ্রুত-ফরোয়ার্ডকে ধাক্কা দেওয়ার জন্য একটি রিমোটকে কীভাবে কনফিগার করতে হয় তা জেনে রাখা সহায়ক।
দৃb়বাটগুড

2

যদি আপনার শাখাটি উন্নয়ন বা উত্পাদন না হয় তবে এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল স্থানীয়ভাবে একটি নির্দিষ্ট প্রতিশ্রুতিতে পুনরায় সেট করা এবং সেখান থেকে একটি নতুন শাখা তৈরি করা। তুমি ব্যবহার করতে পার:

গিট চেকআউট 000000

আপনার সমস্যাযুক্ত শাখায় (যেখানে আপনি যেতে চান সেখানে 000000 হল কমিট আইডি) এবং তারপরে কেবল একটি নতুন শাখা তৈরি করুন:

গিট রিমোট অ্যাড [নাম_আপনি_আপনার_মোট]

তারপরে আপনি একটি নতুন পিআর তৈরি করতে পারেন এবং সমস্ত ভাল কাজ করবে!


1

একটি কাজ করুন, কমিটের এসএইচএ নম্বর পান। যেমন 87c9808 এবং তারপরে,

  1. নিজেকে সরিয়ে নিন, এটিই আপনার নির্দিষ্ট প্রতিশ্রুতিতে শীর্ষস্থানীয় (গিট রিসেট করে --হার্ড 89cef43 // আপনার নম্বরটি এখানে উল্লেখ করুন)
  2. এর পরে একটি এলোমেলো ফাইলের কিছু পরিবর্তন করুন, যাতে গিট আপনাকে স্থানীয়ভাবে এবং তারপরে দূরবর্তী অবস্থান থেকে এটি করতে বলবে, সুতরাং এখন আপনার যা করা দরকার তা হল। পরিবর্তন গিট কমিট-এ-এম "ট্রায়াল কমিট" প্রয়োগ করার পরে
  3. গিট পুশ অরিজিন মাস্টার দ্বারা নিম্নলিখিত প্রতিশ্রুতি (যদি এটি স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ হয় তবে) চাপুন
  4. এখন গিট আপনার কাছ থেকে যা চাইবে তা হ'ল

ত্রুটি: ' https://github.com/YOURREPOSITORY/AndroidExperiments.git ' ইঙ্গিতটির জন্য কিছু রেফ পুশ করতে ব্যর্থ হয়েছে : আপডেটগুলি প্রত্যাখ্যান করা হয়েছে কারণ আপনার বর্তমান শাখার টিপটি ইঙ্গিতটির পিছনে রয়েছে: এর দূরবর্তী অংশটি। আবার চাপ দেওয়ার আগে দূরবর্তী পরিবর্তনগুলি (যেমন: ইঙ্গিত: 'গিট টান ...') একীভূত করুন * **

  1. সুতরাং এখন আপনি কি করতে পারেন

git push --force origin master

  1. এবং এইভাবে, আমি আশা করি এটি কার্যকর হয় :)

1

সোর্সট্রি: একটি নির্দিষ্ট প্রতিশ্রুতিতে রিমোটটি পুনরায় সেট করা

  1. যদি আপনি নীচের ছবির মতো আপনার দূরবর্তী (উত্স / বৈশিষ্ট্য / 1337_মাইআউইউজফিজ ফিচার) এর জন্য খারাপ প্রতিশ্রুতি দেন

রিমোটেস এ যান

  1. রিমোটগুলি> উত্স> বৈশিষ্ট্য> 1337_মাইআউইউজফিজ ফিচারে যান
  2. ডান ক্লিক করুন এবং "উত্স / বৈশিষ্ট্য মুছুন / 1337_মাইআউইউইজফাইচার" নির্বাচন করুন (বা যদি আপনি ব্যাকআপ চান এবং এর নাম পরিবর্তন করুন এবং পদক্ষেপ 4 এড়িয়ে যান)
  3. "ফোর্স ডিলিট" এবং "ওকে" ক্লিক করুন।

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

  1. আপনার পুরানো প্রতিশ্রুতি নির্বাচন করুন এবং "এই প্রতিশ্রুতিতে বর্তমান শাখাটি পুনরায় সেট করুন" নির্বাচন করুন
  2. আপনি কোন মোডটি রাখতে চান তা চয়ন করুন (আপনি যদি আপনার শেষ পরিবর্তনগুলি না চান তবে হার্ড) এবং "ঠিক আছে"।

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

  1. এই প্রতিশ্রুতিটি কোনও নতুন উত্স / বৈশিষ্ট্য / 1337_মাইআউইউজফিজ ফিচারে পুশ করুন এখানে চিত্র বর্ণনা লিখুন

  2. আপনার স্থানীয় বৈশিষ্ট্য শাখা এবং আপনার দূরবর্তী বৈশিষ্ট্য শাখা এখন পূর্ববর্তী (আপনার পছন্দের) প্রতিশ্রুতিতে রয়েছে এখানে চিত্র বর্ণনা লিখুন

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