গিট রিসেট --হর এবং রিমোট রিপোজিটরিতে চাপ দিন


199

আমার একটি সংগ্রহশালা ছিল যা এর উপর কিছু খারাপ কমিট ছিল (এই উদাহরণের জন্য ডি, ই এবং এফ)।

এবিসিডিইএফ মাস্টার এবং উত্স / মাস্টার

আমি স্থানীয় সংগ্রহস্থলটি বিশেষত একটি দ্বারা সংশোধন করেছি git reset --hard। আমি রিসেটের আগে একটি শাখা নিয়েছি তাই এখন আমার কাছে এমন একটি রেপো রয়েছে যা দেখে মনে হচ্ছে:

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master

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

A-B-C-G-H master
     \ D-E-F old_master

এখন আমি এই অবস্থাটি দূরবর্তী রেপোতে ঠেলাতে চাই। তবে, আমি যখন git pushবিনীতভাবে গিট করার চেষ্টা করি তখন আমাকে ব্রাশটি বন্ধ করে দেয়:

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'  

স্থানীয় রেপোর বর্তমান অবস্থা নিতে আমি কীভাবে দূরবর্তী রেপো পেতে পারি?


2
এটি "আমি কীভাবে সংশোধিত ইতিহাসের প্রশ্নগুলিকে ধাক্কা দেব" এর বেশিরভাগেরই 'নকল', উদাহরণস্বরূপ উত্তরটি এখানে দেখুন stackoverflow.com/questions/253055/…
সিবি বেইলি

2
এটি সত্য এবং পোস্টের আগে আমি উত্তরের জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করেছি। তবে আমার অনুসন্ধানে কেবল উত্তরগুলি প্রত্যাবর্তন করা হয়েছিল যেখানে একটি গিট পুশ - ফোর্স বিষয়টি সমাধান করেছে। আপনার পোস্ট লিঙ্ক করার জন্য ধন্যবাদ :)
রবার্টপস্টিল

2
খুব শীঘ্রই আপনি (git1.8.5, Q4 ই 2013) করতে সক্ষম হবে একটি git push -forceসাবধানে আরো
ভনসি

উত্তর:


286

যদি কোনও চাপ দেওয়ার জন্য চাপ না দেয় (" git push --force origin" বা " git push --force origin master" যথেষ্ট হওয়া উচিত), এর অর্থ এই হতে পারে যে রিমোট সার্ভারটি অ্যাসিস্ট -ফরোয়ার্ডকে ধাক্কা দিয়ে প্রত্যাখ্যান করছে হয় get.denyNonFast ফরওয়ার্ড কনফিগারেশন ভেরিয়েবলের মাধ্যমে ( বর্ণনার জন্য গিট কনফিগারেশন ম্যানিপেজ), বা আপডেট / প্রাক-প্রাপ্ত হুকের মাধ্যমে।

পুরানো গিটের সাথে আপনি " git push origin :master" মুছে ফেলা (শাখার নামের আগে ':' দেখুন) এবং তারপরে git push origin masterপ্রদত্ত শাখাটি পুনরায় তৈরি করে সেই বিধিনিষেধের আশেপাশে কাজ করতে পারেন ।

আপনি যদি এটি পরিবর্তন করতে না পারেন তবে ডিইএফ-এ পরিবর্তিত প্রতিশ্রুতিবদ্ধ পরিবর্তন তৈরির ইতিহাস পুনর্লিখনের পরিবর্তে একমাত্র সমাধান হবে :

এবিসিডিইএফ - [(ডিএফএফ) ^ - 1] মাস্টার

এবিসিডিইএফ উত্স / মাস্টার

2
@ জাকুবনারাইবস্কি, ধন্যবাদ। get revert HEAD~Nসাহায্য করেছিল। Nকমিটের সংখ্যা। উদাহরণস্বরূপ, যদি আমার পূর্ববর্তী প্রতিশ্রুতিগুলির প্রয়োজন হয় তবে আমি ব্যবহার করবgit revert HEAD~1
মাকসিম দিমিত্রিভ

1
এবং সচেতন হন আপনি এটি করে স্থানীয় সবাইকে ভাঙ্গবেন।
টম ব্রিটো

24

জাকুবের উত্তরটি পরিপূরক করতে, আপনার যদি ssh- এ রিমোট গিট সার্ভারে অ্যাক্সেস থাকে তবে আপনি গিট দূরবর্তী ডিরেক্টরিতে গিয়ে সেট করতে পারেন:

user@remote$ git config receive.denyNonFastforwards false

তারপরে আপনার স্থানীয় রেপোতে ফিরে যান, আপনার প্রতিশ্রুতিবদ্ধতার সাথে আবার চেষ্টা করুন --force:

user@local$ git push origin +master:master --force

এবং পরিশেষে মূল সুরক্ষিত অবস্থায় সার্ভারের সেটিংসটি ফিরিয়ে দিন:

user@remote$ git config receive.denyNonFastforwards true

এটি সম্পর্কে সোর্সফোর্জে উপযুক্ত তথ্যের জন্য pete.akeo.ie/2011/02/denying-non-fast-forward-and.html দেখুন ।
hlovdal

অস্বীকার কিভাবে অক্ষম করবেন সে সম্পর্কে বিস্তারিত নির্দেশাবলী ব্যবহারের পূর্বে viএই এসও পোস্টে সরবরাহ করা হয়েছে:
stackoverflow.com/a/43721579/2073804

2

আপনার "মাস্টার" শাখাটি ঠিক করার পরিবর্তে, শাখাগুলির নাম পরিবর্তন করে আপনার "কাঙ্ক্ষিত-মাস্টার" দিয়ে এটিকে অদলবদল করা সহজ। Https://stackoverflow.com/a/2862606/2321594 দেখুন । আপনি একাধিক রিভার্ট লগের কোনও চিহ্নও ছাড়েন না।


1

পুরো গিটটি পুনরায় সেট করার ব্যবসাটি আমার জন্য জটিল দেখাচ্ছিল।

তাই আমি আমার কমিটগুলি আগে যে অবস্থায় ছিলাম তাতে আমার এসআরসি ফোল্ডারটি পেতে লাইন বরাবর কিছু করেছি

# reset the local state
git reset <somecommit> --hard 
# copy the relevant part e.g. src (exclude is only needed if you specify .)
tar cvfz /tmp/current.tgz --exclude .git  src
# get the current state of git
git pull
# remove what you don't like anymore
rm -rf src
# restore from the tar file
tar xvfz /tmp/current.tgz
# commit everything back to git
git commit -a
# now you can properly push
git push

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


0

গিটহাব ব্যবহারকারীদের জন্য, এটি আমার পক্ষে কাজ করেছে:

  1. কোনো শাখা সুরক্ষা বিধি যেখানে আপনি পরিবর্তন করতে চান যে, নিশ্চিত করুন বাহিনী push কর্মের অনুমতি দিন সক্রিয় করা হয়
  2. git reset --hard <full_hash_of_commit_to_reset_to>
  3. git push --force

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

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

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