গিট পুশ - ফোর্স-সহ-লিজ বনাম --ফোর্স


182

আমি পার্থক্য বুঝতে চেষ্টা করছি

git push --force

এবং

git push --force-with-lease

আমার অনুমান যে উত্তরোত্তর কেবল দূরবর্তী দিকে ধাক্কা দেয় স্থানীয়টি শাখার কাছে নেই এমন প্রতিশ্রুতি না থাকলে যদি দেয় ?


"স্থানীয় দূরবর্তী ট্র্যাকিং শাখা "। মূলত রিমোটটির অর্থ আপনার ক্লায়েন্টটি এর মতো দেখতে প্রত্যাশা করে। git help pushএর উদ্দেশ্যগুলি ব্যাখ্যা করে ব্যবহারের ক্ষেত্রে রয়েছে (মূলত আপনাকে কাউকে কেবল ধাক্কা দেওয়ার পরিবর্তে ট্র্যাশ করা থেকে বিরত রাখতে)। আমার কাছে যা কিছুটা অস্পষ্ট তা হল দূরবর্তী ট্র্যাকিং শাখা কীভাবে কাজ করে। তবে সম্ভবত সাধারণত এটি দেখতে হবে ঠিক কীভাবে শেষবার আপনি যখন করেছিলেন fetchবা pullকোনও নতুন প্রতিশ্রুতি না দিয়ে দেখেছিলেন ঠিক তেমনটি দেখতে হবে।
zzxyz

4
@ জিগজিজ: প্রকৃত বাস্তবায়ন --force-with-leaseআধুনিক সিপিইউগুলির তুলনা-ও- অদলবদ নির্দেশাবলীর অনুরূপ : যিনি স্বাপটি ঘটতে চান তা প্রত্যাশিত মান এবং নতুন মান সরবরাহ করে। অদলবদলটি করা সিস্টেমটি প্রত্যাশিত মানটিকে প্রকৃত বর্তমান মানের সাথে তুলনা করে এবং দুটি সমান হলে কেবল এবং যদি সোয়াপ হয়। এর সাথে git push, প্রত্যাশিত মান হ'ল রিমোট-ট্র্যাকিং নামে যা আছে, উদাহরণস্বরূপ, নতুন পছন্দসই মানের সাথে git push --force-with-lease origin Xআপনার নিজস্ব প্রেরণ করে origin/X; originএর গিট আপনাকে জানায় এটি এক্সচেঞ্জ হয়েছে কিনা।
torek

1
গিট যদি originএক্সচেঞ্জটি করে, আপনি হয়ে গেছেন । যদি তা না হয় তবে আপনি নতুন বর্তমান মান git fetch originবাছাই করতে দৌড়াতে পারেন, প্রয়োজনে আপনার পরিবর্তনগুলি পুনরায় কাজ করতে পারেন এবং আবার চেষ্টা করার জন্য লিজের সাথে তুলনা-ও-স্বাপের সাথে অন্য জোর চালাতে পারেন।
torek

উত্তর:


172

force আপনার স্থানীয় শাখার সাথে একটি দূরবর্তী শাখা ওভাররাইট করে।

--force-with-leaseএকটি নিরাপদ বিকল্প যা দূরবর্তী শাখায় আরও কমিট যুক্ত করা হলে (অন্য দলের সদস্য বা সহকর্মী বা আপনার কী আছে) যদি রিমোট শাখায় কোনও কাজ ওভাররাইট করে না। এটি নিশ্চিত করে যে আপনি চাপ দিয়ে কেউ এলিসের কাজ ওভাররাইট করবেন না।

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

আমি --force-with-leaseযখন কোনও সতীর্থ কোডটি ওভাররাইট না করি তা নিশ্চিত করতে চাইলে আমি কেবলমাত্র বিকল্প হিসাবে ব্যবহার করব। আমার সংস্থার অনেকগুলি দল --force-with-leaseব্যর্থ-নিরাপদ জন্য ডিফল্ট বিকল্প হিসাবে ব্যবহার করে। এটি বেশিরভাগ পরিস্থিতিতে অপ্রয়োজনীয় তবে অন্য কোনও ব্যক্তি রিমোটে অবদান রেখে এমন কিছুতে ওভাররাইট করতে গিয়ে যদি আপনার প্রচুর মাথা ব্যথা বাঁচায়।

আমি নিশ্চিত যে আপনি ডক্সটি দেখেছেন তবে এখানে আরও কিছু শব্দাত্মক ব্যাখ্যা থাকতে পারে:

https://git-scm.com/docs/git-push


38

বিশ্বাসযোগ্য এবং / অথবা অফিসিয়াল উত্স থেকে উত্তর অঙ্কনের সন্ধান করছেন।

"তুলনা এবং swap 'র" দ্বারা উল্লেখ torek মধ্যে মন্তব্য এবং তার অন্য উত্তর আরও দ্বারা চিত্রিত করা হয় গীত নিজেই উৎস

পরেরটি কেবল রিমোটে ধাক্কা দেয় যদি দূরবর্তীটি স্থানীয় শাখার কাছে না থাকে যে কমিট করে না?

এই বৈশিষ্ট্যটি এই প্রতিশ্রুতিতে প্রবর্তিত হয়েছিল (ডিসেম্বর 2013, গিট ভি 1.8.5-আরসি0)

--force-with-lease অন্য সমস্ত নির্দিষ্ট সংজ্ঞা না থাকলে সমস্ত রিমোট রেফগুলি সুরক্ষিত করবে যা তাদের বর্তমান মানকে কিছু যুক্তিসঙ্গত ডিফল্ট হিসাবে একই হতে হবে;

আপাতত, "কিছু যুক্তিসঙ্গত ডিফল্ট" অস্থায়ীভাবে সংজ্ঞায়িত করা হয় যে " আমাদের রিমোটের রিফের জন্য রিমোট ট্র্যাকিং শাখার মান আপডেট করা হচ্ছে ", এবং আমাদের যদি এমন দূরবর্তী-ট্র্যাকিং শাখা না থাকে তবে এটি একটি ত্রুটি।

সুতরাং "ইজারা" এর অর্থ:

" force-with-lease": আপনি ধরে নিয়েছেন যে রিবেসড ইতিহাসটি কী হবে তা নির্ধারণ করার জন্য আপনি রেফের উপর ইজারা নিয়েছিলেন, এবং লিজটি ভাঙা না হলে আপনি কেবল পিছনে যেতে পারেন।

সূত্রগুলি এখনও "ক্যাস" উল্লেখ করে:

  • এই বিকল্পটি মূলত "cas " ("তুলনা এবং স্যুপ" জন্য) নামে পরিচিত, এটি নামটি কারও পছন্দ হয়নি কারণ এটি খুব প্রযুক্তিগত was
  • দ্বিতীয় প্রয়াসটিকে এটিকে "লকরেফ" বলে অভিহিত করা হয়েছে (কারণ এটি লক নেওয়ার পরে ধাক্কা দেওয়ার মতো ধারণা) তবে "লক" শব্দটি ঘৃণা করা হয়েছিল কারণ এটি বোঝানো হয়েছে যে এটি অন্যদের দ্বারা ধাক্কা খারিজ করে দিতে পারে, যা এই বিকল্পটির কাজ করার উপায় নয়।
  • এই রাউন্ডটি এটি "জোর-সহ-ইজারা" বলে calls
    আপনি ধরে নেবেন যে আপনি রিজেডের ইতিহাসটি কী হবে তা নির্ধারণ করার সময় আপনি রেফের উপর ইজারা নিয়েছিলেন এবং লিজটি ভাঙা না হলে আপনি কেবল পিছনে ঠেলাঠেলি করতে পারেন।

সুতরাং: " git push --force-with-leaseবনাম --force"

যেমনটি আমি " push --force-with-leaseডিফল্টরূপে " উল্লেখ করেছি , যেমন গিট ২.১13 (Q2 2017) উল্লেখ করেছে, ব্যাকগ্রাউন্ড প্রক্রিয়া (যেমন একটি গিট প্লাগইন সহ আইডিইতে আপনি খুঁজে পেয়েছেন ) এর মতো চললে বিকল্পটি উপেক্ষা করা--force-with-lease যেতে পারে । সেক্ষেত্রে, বিরাজ করছে।git fetch origin
--force


29

গিট পুশ - ফোর্স ধ্বংসাত্মক কারণ এটি স্থানীয়ভাবে যা কিছু আছে তার সাথে নিঃশর্তভাবে দূরবর্তী সংগ্রহস্থলটিকে ওভাররাইট করে। গিটের পুশ - ফোর্স দৃ strongly ়ভাবে নিরুৎসাহিত করা হয়েছে কারণ এটি ইতিমধ্যে ভাগ করা ভাণ্ডারগুলিতে ঠেলে দেওয়া অন্যান্য কমিটগুলি ধ্বংস করতে পারে destroy যখন আমাদের কোনও শাখা পুনরায় চালু করতে বাধ্য করা হয় তখন ফোর্স ধাক্কা দেওয়ার অন্যতম সাধারণ কারণ।

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

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

এখানে গিট পুশ - ফোর্স এবং গিট পুশ - ফোর্স-উইথ লিজ সম্পর্কিত একটি ভাল পোস্ট রয়েছে।


2
আমি কী বুঝতে পারি না - আপনি যদি মাস্টারের সাথে প্রত্যাবর্তন করেন, তবে আপনি ছাড়া --force-with-lease কি ধাক্কা দিতে সক্ষম হবেন ? --force-with-leaseমাস্টারের সাথে ছাড় দেওয়ার পরে কেন প্রয়োজনীয়?
আলেকজান্ডার মিলস

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

3
--forceকমিটগুলি হারাবে না, এটি কেবল তাদের আলাদা করে। তারা তাদের হ্যাশগুলির দ্বারা পুনরুত্থিত হতে পারে, যেমন git checkout <SHA>বা git reset --hard <SHA>ধরে নেওয়া, দূরবর্তী রেপো রক্ষণাবেক্ষণকারী কোনও জিসি বা ছাঁটাইয়ের কাজ করেন না।
কিথ রাসেল

1
"গিটের ধাক্কা - বল দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে কারণ এটি ইতিমধ্যে একটি ভাগ করা ভাণ্ডারের দিকে ঠেলে দেওয়া অন্যান্য প্রতিশ্রুতি ধ্বংস করতে পারে" এই বিবৃতি দৃ strongly়ভাবে মতামত ভিত্তিক। ফোর্স পুশ করা সাধারণ গিট রিবেস কোড পর্যালোচনা কর্মপ্রবাহের অংশ। ইতিমধ্যে উল্লিখিত মত আপনিও এটি করার পরেও কমিটগুলি পুনরুদ্ধার করতে পারেন।
en

9

সার্ভারে যে কোনও প্রাক-প্রাপ্ত হুকগুলি ধাক্কা গ্রহণ করে তা ধরে নিলে, এটি সর্বদা সফল হবে:

git push --force

যদিও এটি এগিয়ে যাওয়ার আগে একটি নির্দিষ্ট ক্লায়েন্ট-সাইড চেক চালায়:

git push --force-with-lease

আপনি নিজে নিজেই নির্দিষ্ট চেকটি চালাতে পারেন। এখানে "ইজারা-চেকিং" অ্যালগরিদম রয়েছে:

  1. আপনার বর্তমান শাখাটি বের করুন।

  2. চালান git for-each-ref refs/remotes। আপনার গিট ক্লায়েন্ট মনে করে যে আপনার বর্তমান শাখার উজানের অবস্থার সাথে মিলেছে কমিট-আইডি নোট করুন।

উদাহরণস্বরূপ, আপনি যদি শাখা "foo" এ থাকেন তবে "রেফ / রিমোটস / উত্স / ফু" এর সাথে সম্পর্কিত কমিট-আইডি নোট করুন।

  1. এখনই আপস্ট্রিম গিট সার্ভারে রিমোট শাখার আসল কমিট-আইডি নির্ধারণ করুন।

  2. পদক্ষেপ 2 এবং 3 য় পদক্ষেপ থেকে আপনি যে প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিগুলি সম্মতি দিয়েছিলেন তাতে কেবল "গিট পুশ" এগিয়ে যেতে দিন। অন্য কথায়, কেবলমাত্র যদি আপনার স্থানীয় গিট ক্লোনটির উজানের প্রবাহটি বাস্তব প্রবাহের সাথে একমত হয় তবেই এগিয়ে যান।

এখানে একটি দুঃখের বিষয় রয়েছে: যেহেতু git fetchসমস্ত রেফগুলি "রেফস / রিমোটস / উত্স / *" এর অধীনে তাদের সর্বশেষ সংস্করণে আপডেট করে, আদেশের এই সমন্বয়টি মূলত git push --force:

git fetch

# The command below behaves identically to "git push --force"
# if a "git fetch" just happened!

git push --force-with-lease

এই সহজাত দুর্বলতাটি ঘিরে কাজ করার জন্য git push --force-with-leaseআমি কখনই দৌড়াতে চাই না git fetch। পরিবর্তে আমি git pull --rebaseযখনই আপ স্ট্রিমের সাথে সিঙ্ক করার দরকার হয় আমি সর্বদা চালাই , যেহেতু git pullকেবলমাত্র রেফ / রিমোটসের অধীনে একটি একক রেফ আপডেট করে, "ইজারা" --force-with-leaseউপকারী রাখে।


1
চেকটি যদি ক্লায়েন্ট-সাইড হয় তবে রেসের শর্তের সম্ভাবনা কি আছে? অর্থাত্ চেকের পরে অন্য কেউ পরিবর্তন করে তবে জোর করে ধাক্কা দেওয়ার আগে?
ক্র্যাক

2

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

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