রিমোট ফাইলগুলি ওভাররাইট করতে "গিট পুশ" চাপুন


766

আমি আমার স্থানীয় ফাইলগুলি ধাক্কা দিতে চাই এবং একত্রীকরণ দ্বন্দ্ব মোকাবেলা না করে এগুলি একটি রিমোট রেপোতে রাখতে চাই। আমি কেবল আমার স্থানীয় সংস্করণটি দূরবর্তী সংস্করণের চেয়ে অগ্রাধিকার পেতে চাই।

গিট দিয়ে আমি কীভাবে এটি করতে পারি?


106
আপনার git push origin --forceজন্য কাজ করে না?


আপনি কেবল .git ফাইল বা সম্পর্কিত ওয়ার্কিং অনুলিপি ওভাররাইড করতে চান কিনা তা অস্পষ্ট। যদি এটি গিট সংগ্রহস্থল হয় তবে গিট পুশই এর উত্তর। আপনি যদি রিমোট ওয়ার্কিং কপিটি আপডেট করতে চান তবে আপনাকে পোস্ট-রিসিভ হুক ব্যবহার করতে হবে
পিয়েরে-অলিভিয়ার ভ্যারেস

@ মাইক যে কোনও কারণে আমার পক্ষে কাজ করে ... অবাক করে দেখুন ওপি

ফোর্স পুশ কাজ করে না এমন একটি সম্ভাব্য কারণ হ'ল এটি দূরবর্তী রেপোতে স্পষ্টভাবে অক্ষম হয়ে থাকতে পারে (বোকা এবং / অথবা অবদানকারীদের কারণে কোনও কিছুই হারাতে না পারে তা নিশ্চিত করার জন্য): config receive.denyNonFastforwardsখুঁজে বের করতে ব্যবহার করুন ।
ফ্রাঙ্ক নোক্কে

উত্তর:


1084

আপনি ব্যবহার করে আপনার স্থানীয় পুনর্বিবেচনা দূরবর্তী রেপোতে বাধ্য করতে সক্ষম হবেন

git push -f <remote> <branch>

(যেমন git push -f origin master) ছেড়ে যাওয়া <remote>এবং <branch>সেট করা সমস্ত স্থানীয় শাখা চাপতে বাধ্য করবে --set-upstream

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

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

আপডেট 2 : দর্শকের ক্রমবর্ধমান সংখ্যার কারণে আমি যখন আপনার করণীয় তখন কিছু অতিরিক্ত তথ্য যুক্ত করতে চাইupstream কোন চাপের চাপ দেয় ।

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

            ডি ---- ই বিষয়
           /
এ ---- বি ---- সি বিকাশ

তবে পরে developmentশাখাটি একটি দ্বারা আঘাত করা হয় rebase, যা আমি যখন চালাই তখন আমাকে ত্রুটিযুক্ত হতে পারে git pull:

বস্তাগুলি আনপ্যাক করা হচ্ছে: 100% (3/3), সম্পন্ন হয়েছে।
<রিপো-লোকেশন> থেকে
 * শাখা উন্নয়ন -> FETCH_HEAD
স্বয়ংক্রিয়ভাবে মার্জ করা <ফাইলগুলি>
কনফ্লিক্ট (বিষয়বস্তু): <লোকেশন> এ সংঘাতটি মার্জ করুন
স্বয়ংক্রিয় সংহত ব্যর্থ হয়েছে; দ্বন্দ্ব সংশোধন করুন এবং তারপরে ফলাফলটি প্রতিশ্রুতিবদ্ধ।

এখানে আমি দ্বন্দ্বগুলি সংশোধন করতে পারলাম এবং commitতবে এটি আমাকে সত্যই কুৎসিত প্রতিশ্রুতিবদ্ধ ইতিহাস দিয়ে চলে যাবে:

       সি ---- ডি ---- ই ---- এফ বিষয়
      / /
এ ---- বি -------------- সি 'বিকাশ

এটি ব্যবহার করতে লোভনীয় লাগছে git pull --forceতবে সাবধান থাকুন কারণ এটি আপনাকে আটকা পড়ে থাকতে পারে:

            ডি ---- ই বিষয়

এ ---- বি ---- সি 'বিকাশ

সুতরাং সম্ভবত সেরা বিকল্পটি একটি হয় git pull --rebase। এটির জন্য আমার আগের মতো যে কোনও দ্বন্দ্ব সমাধানের প্রয়োজন হবে তবে প্রতিশ্রুতির পরিবর্তে আমি ব্যবহার করব git rebase --continue। শেষ অবধি কমিটের ইতিহাস আরও ভাল দেখাবে:

            ডি '--- ই' বিষয়
           /
এ ---- বি ---- সি 'বিকাশ

আপডেট 3: আপনি --force-with-lease"নিরাপদ" বল ধাক্কা হিসাবে বিকল্পটিও ব্যবহার করতে পারেন , কাপ্যাক তার উত্তরে উল্লিখিত :

"ইজারা" দিয়ে জোর করে চাপ দেওয়ার ফলে আপনি যে রিমোটের প্রত্যাশা করেননি এমন নতুন কমিটস রয়েছে তবে (প্রযুক্তিগতভাবে, যদি আপনি তাদের এখনও আপনার রিমোট-ট্র্যাকিং শাখায় না নিয়ে থাকেন) জোর করে ধাক্কাটি ব্যর্থ করতে দেয়, যা কার্যকর যদি আপনি দুর্ঘটনাক্রমে অন্য কারওর কমান্ডগুলি ওভাররাইট করতে চান না যে আপনি এখনও জানেন না, এবং আপনি কেবল নিজের নিজের ওভাররাইট করতে চান:

git push <remote> <branch> --force-with-lease

নীচের যে কোনওটি পড়ে আপনি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও বিশদ জানতে পারবেন --force-with-lease:


5
যেহেতু এটি নির্বাচিত উত্তর, আমি এখানে মন্তব্য করব। নিজের দ্বারা কাজ করার সময় শক্তি ব্যবহার করা কোনও সমস্যা নয়। উদাহরণস্বরূপ, আমার মেঘ হোস্টটি এর নিজস্ব গিট দিয়ে শুরু হয়। যদি আমি স্থানীয়ভাবে কাজ করি এবং একটি প্রকল্প তৈরি করি এবং আমি এটি আমার ক্লাউড হোস্টে (ওপেনশিফ্ট) রাখতে চাই, আমার দুটি পৃথক গিট প্রকল্প রয়েছে। আমার স্থানীয় এবং আমার ওপেনশিফট। আমি আমার স্থানীয় যেমনটি পছন্দ করি ঠিক তেমনই এখন এটি আমার ওপেনশিফটে পূর্বরূপ দেখতে চাই। তারপরে আপনি -fপতাকা ব্যবহার করে প্রথমবার ওপেনশিফ্টে চাপ দিন । মূলত আপনার স্থানীয় গিটটি ওপেনশিফ্টের উপরে রাখছে।
ওয়েড

128

আপনি ধাক্কা জোর করতে চান

আপনি মূলত যা করতে চান তা হল আপনার স্থানীয় শাখাকে জোর করে চাপানো, যাতে রিমোটটি ওভাররাইট করা যায়।

আপনি যদি নীচের প্রতিটি আদেশের আরও বিশদ ব্যাখ্যা চান তবে নীচে আমার বিশদটি দেখুন। গিট দিয়ে চাপ দেওয়ার জন্য আপনার কাছে মূলত 4 টি আলাদা বিকল্প রয়েছে:

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

আপনি যদি প্রতিটি কমান্ডের আরও বিশদ ব্যাখ্যা চান তবে নীচে আমার দীর্ঘ উত্তর বিভাগটি দেখুন।

সতর্কতা: জোর ঠেলাঠেলি আপনি যে শাখার দিকে চাপ দিচ্ছেন তার স্থিতির সাথে দূরবর্তী শাখাটি ওভাররাইট করে। নিশ্চিত হয়ে নিন যে এটি ব্যবহার করার আগে আপনি এটিই করতে চান, অন্যথায় আপনি যে প্রতিশ্রুতি রাখতে চান তা ওভাররাইট করতে পারেন actually

জোর ধাক্কা বিশদ

রিমোট এবং শাখা নির্দিষ্ট করা

আপনি সম্পূর্ণ নির্দিষ্ট শাখা এবং একটি রিমোট নির্দিষ্ট করে দিতে পারেন can -fপতাকার সংক্ষিপ্ত সংস্করণ--force

git push <remote> <branch> --force
git push <remote> <branch> -f

শাখা ছাড়ছে

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

git push <remote> --force

2.0 এর পূর্বে, একাধিক স্থানীয় শাখাগুলি ঠেকাতে নতুন রেপোর ডিফল্ট সেটিংস থাকবে। প্রশ্নের মধ্যে থাকা সেটিংস হ'ল সেটিংস remote.<remote>.pushএবং push.defaultসেটিংস (নীচে দেখুন)।

রিমোট এবং শাখা ছাড়ছে

রিমোট এবং শাখা উভয় বাদ দেওয়া হলে, ন্যায়সঙ্গত আচরণটি git push --forceআপনার push.defaultগিট কনফিগারেশন সেটিংস দ্বারা নির্ধারিত হয় :

git push --force
  • গিট ২.০ হিসাবে, ডিফল্ট সেটিংটি simpleমূলত আপনার বর্তমান শাখাটিকে তার প্রবাহের দূরবর্তী পাল্টা অংশে চাপ দেবে। রিমোটটি শাখার branch.<remote>.remoteসেটিংস দ্বারা নির্ধারিত হয় এবং অন্যথায় উত্সের রেপোতে ডিফল্ট হয়।

  • গিট সংস্করণ ২.০ এর আগে, ডিফল্ট সেটিংস matchingমূলত আপনার স্থানীয় সমস্ত শাখাগুলিকে কেবল রিমোটের একই নামের শাখাগুলিতে ঠেলে দেয় (যেটি ডিফল্ট হিসাবে উত্পন্ন হয়)।

আপনি আরো পড়তে পারেন push.defaultপড়ার মাধ্যমে সেটিংস git help configবা Git-কনফিগ (1) ম্যানুয়াল পৃষ্ঠার একটি অনলাইন সংস্করণ

এর সাথে আরও নিরাপদে ঠেলাঠেলি করুন --force-with-lease

"ইজারা" দিয়ে জোর করে চাপ দেওয়ার ফলে আপনি যে রিমোটের প্রত্যাশা করেননি এমন নতুন কমিটস রয়েছে তবে প্রযুক্তিগতভাবে, যদি আপনি সেগুলি এখনও আপনার রিমোট-ট্র্যাকিং শাখায় না আনেন তবে শক্তি প্রয়োগটি কার্যকর হয় যদি আপনি দুর্ঘটনাক্রমে অন্য কারওর কমিটগুলি ওভাররাইট করতে চান না যে আপনি এখনও জানেন নি, এবং আপনি কেবল নিজের নিজের ওভাররাইট করতে চান:

git push <remote> <branch> --force-with-lease

নীচের যে কোনওটি পড়ে আপনি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও বিশদ জানতে পারবেন --force-with-lease:


আপনি ঠিক বলেছেন তবে এটি কেবল ব্যতিক্রমী পরিস্থিতিতে ব্যবহার করা উচিত ।
স্কট বেরেরোয়েট 21

1
@ স্কটবারেরোয়েটস " আমি পছন্দ করি তা হল আমার কাছে থাকা জিনিসকে ধাক্কা দেওয়া এবং এটি সংহত করার পরিবর্তে দূরবর্তীভাবে ওভাররাইট করা দেওয়া হোক। " আমি ওপিকে যা চেয়েছিলাম ঠিক তা দিয়েছিলাম।

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

1
@ স্কটবারেরোয়েটস আমি একজন মডারেটর আমার উত্তরটিকে ক্যানোনিকালটিতে মার্জ করার চেষ্টা করছি, কারণ আমি নতুন --force-with-leaseবিকল্পটি উল্লেখ করেছি;)

1
অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/24768330/...
Shog9

32

আরেকটি বিকল্প (অন্য অবদানকারীদের জন্য সমস্যাযুক্ত হতে পারে এমন জোরপূর্বক ধাক্কা এড়াতে) হ'ল:

  • আপনার নতুন কমিটিকে একটি উত্সর্গীকৃত শাখায় রাখুন
  • আপনার পুনরায় সেট masterকরুনorigin/master
  • আপনার উত্সর্গীকৃত শাখায় মার্জ করুন master , সর্বদা উত্সর্গীকৃত শাখা থেকে কমিট করে (অর্থাত্ আপনার নতুন উত্সর্গগুলি তৈরি করা যার উপরে masterআপনার উত্সর্গীকৃত শাখাটি আয়নাবে। এটিকে অনুকরণ করার কৌশলগুলির জন্য
    " একর মতো একটি শাখা তৈরির জন্য গিট কমান্ড " দেখুন git merge --strategy=theirs

এইভাবে, আপনি কিছু জোর না করেই মাস্টারকে রিমোটে ঠেলাতে পারেন।


ফলাফল "ধাক্কা" থেকে কীভাবে আলাদা?
আলেক্সকোভেলস্কি

6
@ অ্যালেক্সকোভেলস্কি কোনও বাধ্যতামূলক ধাক্কা ইতিহাস পুনর্লিখন করবে, রেপোর অন্যান্য ব্যবহারকারীদের নতুন স্থানীয় চাপের সাথে মিলিত হওয়ার জন্য তাদের নিজস্ব স্থানীয় রেপো পুনরায় সেট করতে বাধ্য করেছিল। এই পদ্ধতিটি কেবল নতুন কমিট তৈরি করে এবং জোরপূর্বক ধাক্কার প্রয়োজন হয় না।
ভোনসি

1
আমি আপনাকে পরামর্শ দিয়েছি যে আপনি নিজের উত্তরে একটি শিরোনাম যুক্ত করুন: "আপনি জোর করে চাপ দিতে চান না" :)
অ্যালেক্সকোভেলস্কি

@alexkovelsky ভাল পয়েন্ট। আমি সেই অনুযায়ী উত্তরটি সম্পাদনা করেছি।
ভনসি

4

গিট পুশ-এফ কিছুটা ধ্বংসাত্মক কারণ এটি দলের অন্য যে কোনও দূরবর্তী পরিবর্তনগুলি পুনরায় সেট করে। একটি নিরাপদ বিকল্প হ'ল it গিট পুশ - ফোর্স-সাথে-ইজারা}

Force --for-with-lease What কী করে তা কোনও শাখা আপডেট করা অস্বীকার করে যদি না এটি রাষ্ট্র হিসাবে প্রত্যাশা করে; অর্থাত্ কেউই উজানের শাখাটি আপডেট করেনি। অনুশীলনে এটি পরীক্ষা করে পরীক্ষা করে দেখায় যে প্রবাহিত রেফটি আমরা প্রত্যাশা করি, কারণ রেফগুলি হ্যাশ হয়, এবং অভিভাবকদের চেইনকে তাদের মান হিসাবে স্পষ্টভাবে এনকোড করে দেয়। আপনি force --for-With-lease tell ঠিক কী জন্য পরীক্ষা করতে হবে তা বলতে পারেন, তবে ডিফল্টরূপে বর্তমানের রিমোট রেফটি পরীক্ষা করা হবে। বাস্তবে এর অর্থ যা হ'ল অ্যালিস যখন তার শাখা আপডেট করে এবং এটি রিমোট রিপোজিটরিতে ঠেলে দেয়, তখন শাখার রেফ পয়েন্টিং হেড আপডেট হবে। এখন, বব রিমোট থেকে কোনও টান না এলে তার রিমোটের স্থানীয় রেফারেন্স পুরানো হয়ে যাবে। যখন তিনি {--ফোর্স-উইড-ইজারা using ব্যবহার করে ধাক্কা দিতে যান, গিট স্থানীয় রিফকে নতুন রিমোটের বিরুদ্ধে পরীক্ষা করবে এবং জোর করে চাপ দিতে অস্বীকার করবে। force - ইজারা-সহ-ইজারা} কার্যকরভাবে কেবল আপনাকে জোর-চাপ দেওয়ার অনুমতি দেয় যদি অন্য কেউ অন্তর্বর্তীকালীন দূরবর্তী স্থানে পরিবর্তন ঠেকায় না। এটি সিটবেল্ট সহ {--for}।



0

কচ্ছপ ব্যবহার করে সাধারণ পদক্ষেপ

জিআইটি স্থানীয় ফাইলগুলি দেয় এবং গিট সংগ্রহস্থলগুলিতে চাপ দেয়।

পদক্ষেপ:

1) স্ট্যাশ পরিবর্তন স্ট্যাশ নাম

2) টানুন

3) স্ট্যাশ পপ

4) প্রতিশ্রুতিবদ্ধ 1 বা একাধিক ফাইল এবং পরিবর্তন বিবরণ সেট লেখক এবং তারিখ কমিট দিতে

5) ধাক্কা

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