আমি কীভাবে একটি গিট পুশকে সঠিকভাবে জোর করব?


1271

আমি একটি দূরবর্তী নন-বেয়ার "মেইন" রেপো সেট আপ করেছি এবং এটি আমার কম্পিউটারে ক্লোন করেছি। আমি কিছু স্থানীয় পরিবর্তন করেছি, আমার স্থানীয় সংগ্রহস্থল আপডেট করেছি এবং পরিবর্তনগুলি আমার দূরবর্তী রেপোতে ঠেলে দিয়েছি। বিষয়গুলি এখনও পর্যন্ত ঠিক ছিল।

এখন, আমি দূরবর্তী রেপোতে কিছু পরিবর্তন করতে হয়েছিল। তারপরে আমি আমার স্থানীয় রেপোতে কিছু পরিবর্তন করেছি। আমি বুঝতে পেরেছিলাম যে রিমোট রেপোতে পরিবর্তন দরকার নেই। তাই আমি git pushআমার স্থানীয় রেপো থেকে আমার দূরবর্তী রেপোতে চেষ্টা করেছি, তবে আমি এর মতো একটি ত্রুটি পেয়েছি:

ইতিহাস হারিয়ে যাওয়ার হাত থেকে রক্ষা পেতে, দ্রুত-অগ্রসর হওয়া আপডেটগুলি প্রত্যাখ্যান করা হয়েছিল আবার চাপ দেওয়ার আগে দূরবর্তী পরিবর্তনগুলি মার্জ করুন। বিশদটির জন্য 'ফাস্ট-ফরওয়ার্ডগুলি সম্পর্কে নোট' বিভাগটি git push --helpদেখুন।

আমি ভেবেছিলাম সম্ভবত এ

git push --force

আমার স্থানীয় অনুলিপিটিকে দূরবর্তী অঞ্চলে পরিবর্তনগুলিতে চাপ দিতে এবং এটি একইরকম করতে বাধ্য করবে। এটি আপডেটটিকে জোর করে , কিন্তু আমি যখন রিমোট রেপোতে ফিরে যাই এবং কোন অঙ্গীকার করি তখন আমি লক্ষ্য করব যে ফাইলগুলিতে পুরানো পরিবর্তন রয়েছে (মূল রিমোট রেপো যা পূর্বে ছিল) contain

যেমন আমি উত্তরের একটিতে মন্তব্যে উল্লেখ করেছি :

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

আমি কীভাবে এই সমস্যাটি সমাধান করতে পারি?


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


6
আমার নিজের উত্তরে আমি যেমন বিবরণ দিয়েছি , git push --forceঅবশ্যই ধাক্কা দেওয়ার জন্য আরও একটি বৈধ উপায়, এবং শাখাগুলি ঠিক git push origin master --forceতেমনই গিটের ডিফল্টর সাথে ধাক্কা দেবে push.default config settings, যদিও শাখাগুলি নির্দিষ্টভাবে 2.0 এর পরে বনাম 2.0 এর আগে গিট সংস্করণগুলির মধ্যে পৃথক হয়।

2
git push --forceএই দিনগুলিতে দুর্দান্ত কাজ করে,
এফডাব্লুআইডাব্লু

git push --force-with-leaseআরও ভাল কাজ করে :), এটি আপনার প্রত্যাশা করা রাজ্য না হলে এটি কোনও শাখা আপডেট করতে অস্বীকার করবে। (দেখুন ডেভেলপার.এলটিশিয়ান.
com

উত্তর:


2303

শুধু কর:

git push origin <your_branch_name> --force

অথবা আপনার যদি একটি নির্দিষ্ট রেপো থাকে:

git push https://git.... --force

এটি আপনার পূর্ববর্তী প্রতিশ্রুতিগুলি মুছে ফেলবে এবং আপনার বর্তমানটিকে ধাক্কা দেবে।

এটি যথাযথ নাও হতে পারে তবে এই পৃষ্ঠায় কেউ যদি হোঁচট খায় তবে তারা ভেবেছিল যে তারা একটি সহজ সমাধান চান ...

সংক্ষিপ্ত পতাকা

এছাড়াও নোট যে -fসংক্ষিপ্ত --force, তাই

git push origin <your_branch_name> -f

কাজ করবে।


58
git push origin +masterপরিবর্তে আপনি ব্যবহার করতে পারেন , যা আপনাকে সমস্ত কিছু বাধ্য না করে একাধিক রেসপেস্কগুলিকে চাপ দিতে দেয়।
নিকগ্রিম

5
সচেতন থাকুন, যদি আপনি দুর্ঘটনাক্রমে ন্যায়বিচারটি করেন তবে আপনি git push --forceসম্ভবত আপনার মাস্টার শাখাটিকে
জবাবদিহি

9
@ জিউইজগুলি গিট সংস্করণ ২.০ দিয়ে শুরু হচ্ছে, এর ডিফল্ট আচরণটি git push --forceহ'ল বর্তমানে চেক করা আউট শাখাকে তার দূরবর্তী-কাউন্টার অংশে চাপিয়ে দেওয়া, সুতরাং যদি আপনার মাস্টার শাখাটি চেক আউট করে থাকে তবে এটি সাদৃশ্য git push origin master --force। আপনি যদি matchingসেটিংস ব্যবহার করেন তবে এটি ভিন্ন হবে push.default, যা 2.0 এর আগে গিট সংস্করণগুলির জন্য ডিফল্ট। matchingপাহাড় জমে সব দূরবর্তী বেশী নাম একই যে স্থানীয়দের শাখা, তাই বল তারপর ঠেলাঠেলি স্পষ্টভাবে হতে পারে না আপনি কি করতে ... চান

@ জিভিজ তবে গিট ২.০ সহ ডিফল্টটি নিরাপদ, বা কমপক্ষে এটি এর চেয়ে বিপজ্জনক আর কোনও নয় git push origin master --force

2
পুশ-এফ ভাল তবে মাস্টারের জন্য পুনরুদ্ধারযোগ্য নয় কারণ বেশিরভাগ কর্পোরেট সংগ্রহস্থল মাস্টারের জন্য -f অক্ষম রয়েছে। merge -s oursআমার জন্য কাজ
Mihai

247

এবং যদি push --forceকাজ না করে তবে আপনি করতে পারেন push --delete। এই উদাহরণে 2 তম লাইনটি দেখুন:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

তবে সাবধান ...

কখনই পাবলিক গিট ইতিহাসে ফিরে যাবেন না!

অন্য কথায়:

  • কখনই forceকোনও পাবলিক স্টোরের উপরে চাপ দেবেন না ।
  • এটি বা এমন কিছু করবেন না যা কারওর ক্ষতি করতে পারে pull
  • কখনও resetবা rewriteইতিহাসে কোনও রেপোতে ইতিমধ্যে কেউ টানতে পারে।

অবশ্যই এই নিয়মের ব্যতিক্রমী ব্যতিক্রমগুলিও রয়েছে, তবে বেশিরভাগ ক্ষেত্রে এটি করার প্রয়োজন হয় না এবং এটি অন্য সবার জন্য সমস্যা তৈরি করে।

পরিবর্তে একটি প্রত্যাবর্তন করুন।

এবং আপনি সর্বজনীন রেপোতে কী চাপছেন তা সম্পর্কে সর্বদা সতর্ক থাকুন । প্রত্যাবর্তন করা হচ্ছে:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

বস্তুতপক্ষে, উভয় উৎপত্তি Heads (থেকে প্রত্যাবর্তন থেকে মন্দ রিসেট ) একই ফাইল উপস্থিত থাকবে।


আশেপাশে আপডেট হওয়া তথ্য এবং আরও যুক্তি যুক্ত করতে সম্পাদনা করুন push --force

পুশের পরিবর্তে ইজারা দিয়ে বল চাপানো বিবেচনা করুন, তবে তবুও প্রত্যাবর্তনকে পছন্দ করুন

আর কিছু সমস্যা push --forceহতে পারে যখন আপনি করার আগে কেউ কিছু ধাক্কা দেয় তবে আপনি ইতিমধ্যে আনার পরে। যদি আপনি এখন আপনার রিজেড সংস্করণকে জোর করে চাপান তবে আপনি অন্যের কাছ থেকে কাজ প্রতিস্থাপন করবেন ।

git push --force-with-leaseচালু Git 1.8.5 ( @VonC ধন্যবাদ প্রশ্নে মন্তব্য) এই নির্দিষ্ট সমস্যার সমাধান করার চেষ্টা করে। মূলত, এটি একটি ত্রুটি আনবে এবং আপনার সর্বশেষ আনার পর থেকে রিমোটটি সংশোধন করা হয়েছে কিনা তা চাপবে না।

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

এবং যেহেতু আমরা git --pushউদাহরণগুলির কথা বলছি ...

কেন কেউ চাপ দিতে বাধ্য করবে?

@ লিঙ্কাইজ মন্তব্যগুলিতে একটি ভাল ধাক্কা শক্তির উদাহরণ এনেছে: সংবেদনশীল ডেটা । আপনি ভুলভাবে ডেটা ফাঁস করেছেন যা ধাক্কা দেওয়া উচিত নয়। আপনি যদি পর্যাপ্ত দ্রুত হন তবে আপনি উপরে চাপ দিতে বাধ্য করে এটি "ঠিক" করতে পারেন *

*ডেটা এখনও দূরবর্তী হবে যদি না আপনি একটি কি সংগ্রহ আবর্জনা , অথবা এটা একরকম পরিষ্কার । এটি ইতিমধ্যে এড়ানো অন্যদের দ্বারা এটি ছড়িয়ে দেওয়ার স্পষ্ট সম্ভাবনাও রয়েছে তবে আপনি ধারণাটি পেয়ে যান get


1
@ আরগারডপ্যাক সমস্যাটি যদি সক্ষম হয় তবে তা নয়। এটাই. তবে এটি একটি বড় বিপর্যয়ের সমষ্টি হতে পারে। কেউ যত বেশি এটি করেন (জোর ধাক্কা) এবং আপনি সর্বদা পাবলিক রেপো থেকে আপডেট (টান) আপডেট করবেন তত বেশি বিপর্যয়। আপনি জানেন যে এটি বিশ্বকে ধ্বংস করতে পারে! 111 কমপক্ষে that নির্দিষ্ট সংগ্রহস্থল নিয়ে গঠিত বিশ্ব।
ক্রেগোক্স

3
আপনার যদি সংবেদনশীল ডেটা থাকে তবে জোর করে
চাপুন

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

3
git push origin master --delete # do a very very bad bad thing git push origin master # regular pushএটি আসলে আমার সমস্যাটিকে পুরোপুরি সমাধান করেছে (কেবলমাত্র আমি এবং আমার বন্ধুবান্ধব একটি রেপোতে)। পাবলিক রেপোসের জন্য এটি ভুল হতে পারে তবে একটি ব্যক্তিগত ক্ষেত্রে এটি জীবন রক্ষাকারী।
পোয়েরাজোলু

1
এটি কিছু রেপো ম্যানেজারগুলির সাথে স্বয়ংক্রিয়ভাবে ঘটে, ওরফে অটো-স্কোয়াশ ইত্যাদির মাধ্যমে কমার জন্য কোনও বৈশিষ্ট্য শাখা শেষ করার পরে চাপ দেওয়া সাধারণ এবং প্রত্যাশিত।
ফ্ল্যাওয়ারস্কেপ

18

প্রথমত, আমি সরাসরি "প্রধান" রেপোতে কোনও পরিবর্তন করব না। আপনি যদি সত্যিই একটি "প্রধান" রেপো রাখতে চান তবে আপনার কেবল এটির দিকে চাপ দেওয়া উচিত, কখনও এটিকে সরাসরি পরিবর্তন করবেন না।

আপনি যে ত্রুটিটি পাচ্ছেন তার বিষয়ে, আপনি কি git pullআপনার স্থানীয় রেপো থেকে চেষ্টা করেছেন এবং তারপরে git pushমূল রেপোতে? আপনি বর্তমানে যা করছেন (যদি আমি এটি ভালভাবে বুঝতে পারি) চাপ দেওয়ার জন্য চাপ দিচ্ছে এবং তারপরে "মেইন" রেপোতে আপনার পরিবর্তনগুলি হারাচ্ছে। আপনার স্থানীয় পরিবর্তনগুলি প্রথমে মার্জ করা উচিত।


হ্যাঁ আমি একটি টান চেষ্টা করেছি কিন্তু আমি সেই টানার কারণে ডেটা হারাতে চাইছি। আমি মূল থেকে প্রথম আপডেট না করেই আমার স্থানীয় রেপোগুলিকে আমার স্থানীয় হিসাবে তৈরি করতে চাই।
স্পাইরোস

1
git push -fসেক্ষেত্রে ব্যবহার করুন , তবে তারপরে আপনি যদি আবার আপনার মূল রেপো পরিবর্তন করেন তবে আপনাকে আপনার স্থানীয় রেপোতে ফিরে যেতে হবে এবং git pullএটি সর্বশেষ পরিবর্তনগুলির সাথে সুসংগত হয়। তারপরে আপনি আপনার কাজটি করতে পারেন এবং আবার চাপ দিন। আপনি যদি এই "পুশ-পুল" ওয়ার্কফ্লো অনুসরণ করেন তবে আপনি যে ধরণের ত্রুটি সম্পর্কে অভিযোগ করেছিলেন তা পাবেন না।
ইউবিক

হ্যাঁ, আমি বুঝতে পারি যে এটি আমার দোষ ছিল: / আমি চেষ্টা করব এবং কিছুক্ষণের মধ্যে থেক্স থেকে ফিরে আসব
স্পাইরোস

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

17

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

git push --force origin B:C

2
আমি জানতে পেরেছিলাম যে এমনকি আমি আমার স্থানীয় শাখা বিতে আছি, এখনও আমার করা দরকার git push --force origin B:C। আমার ক্ষেত্রে এটি মনে হয় যে git push --force origin Cআমি বর্তমানে কোন শাখায় আছি তা নির্বিশেষে কেবল স্থানীয় মাস্টার থেকে দূরবর্তী সি শাখায় চাপ দেবে। git version 2.3.8 (Apple Git-58)
ওয়েশি জেং

12

নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

git push -f origin master

1
এই উত্তরটি কেন অন্যগুলির চেয়ে বেশি পছন্দযোগ্য এবং এটি কী আলাদা করে তোলে সে সম্পর্কে আরও কিছু ব্যাখ্যা দিন।
আদম

ওহ, অসুবিধার জন্য দুঃখিত, আমার একই সমস্যা ছিল এবং এই আদেশটি এটি সমাধান করে, আমি ভেবেছিলাম আমার এটি ভাগ করা উচিত।
মোস্তফা এলসায়েদ

12
এটি অন্যদের মতোই, আপনি কেবল -fপতাকাটির অবস্থান পরিবর্তন করেছেন ...
স্বেল্যান্ডিয়াগ

11

আমি সত্যিই সুপারিশ করব:

অন্য কথায়, মূল সার্ভার এবং স্থানীয় কম্পিউটার উভয় থেকে একটি বেয়ার রেপো অ্যাক্সেসযোগ্য রাখুন, যাতে / থেকে টান / টানতে কোনও একক প্রবাহের রেপো থাকতে পারে।


5

ইতিহাস বজায় রেখে কর্পোরেট গিটহাবের সংগ্রহস্থলে মাস্টার প্রতিস্থাপনের জন্য এটি ছিল আমাদের সমাধান।

push -fকর্পোরেট সংগ্রহস্থলগুলিতে আয়ত্ত করতে শাখার ইতিহাস বজায় রাখতে প্রায়শই অক্ষম থাকে। এই সমাধানটি আমাদের পক্ষে কাজ করেছিল।

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

আপনার শাখায় চাপ দিন desiredOriginএবং একটি PR তৈরি করুন


3

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

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