আমি কীভাবে দূরবর্তী গিট সংগ্রহস্থলের সংশোধিত প্রতিশ্রুতিটি ঠেকাব?


662

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

> git commit --amend

দুর্ভাগ্যক্রমে প্রতিশ্রুতি পুনরায় সংগ্রহস্থলটিতে ঠেলা যায় না। এটি এইভাবে প্রত্যাখ্যান করা হয়:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

আমার কি করা উচিৎ? (আমি দূরবর্তী সংগ্রহস্থল অ্যাক্সেস করতে পারেন।)


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

7
@ ফাফা: আমি মনে করি এটি একটি FAQ। একটি কমিট বার্তা বরাবর সঙ্গে কমিট কুচি-কুচি করিয়া কাটা বস্তু হয়, তাই chaning এটা revid (হ্যাশ) পরিবর্তন। যদি এটি পরিষ্কার না হয়: না আপনি পারবেন না। আইআইআরসি নোটগুলিতে আউট-অফ-ব্যান্ড তথ্য সংরক্ষণ করতে পারে (যাতে আপনি বিদ্যমান কমিটগুলিকে পরিবর্তন না করেই টিকিয়ে দিতে পারেন)। নির্দিষ্ট
কমিটস

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

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

@ ইউজার ৫৮77 If your যদি আপনার প্রতিশ্রুতি কেবল প্রতিশ্রুতি বার্তা পরিবর্তন করতে হয় এবং আপনি তখন থেকে কোনও অতিরিক্ত স্থানীয় কমিট না করেন তবে আপনি কমিট বার্তা সংশোধন করার আগে আপনার স্থানীয় শাখাটিকে রিমোট কমিটে পুনরায় সেট করতে পারেন।
স্কট আহটেন

উত্তর:


504

আমি প্রকৃতপক্ষে একবার ধাক্কা দিয়েছিলাম --forceএবং .gitসংগ্রহস্থল এবং লিনাস বিগ টাইম দ্বারা বদনাম পেয়েছিলাম । সাধারণভাবে এটি অন্যান্য মানুষের জন্য প্রচুর সমস্যা তৈরি করবে। একটি সহজ উত্তর "এটি করবেন না"।

আমি অন্যকে যেভাবেই করার জন্য রেসিপিটি দিয়েছি দেখেছি, তাই আমি এখানে সেগুলি পুনরুক্ত করব না। তবে আপনি --for (বা + মাস্টার) এর মাধ্যমে সংশোধিত প্রতিশ্রুতিটি সরিয়ে দেওয়ার পরে পরিস্থিতি থেকে সেরে উঠতে এখানে একটি পরামর্শ ।

  1. git reflogআপনার সংশোধিত পুরানো প্রতিশ্রুতি সন্ধানের জন্য ব্যবহার করুন (এটি কল করুন oldএবং আমরা সংশোধন করে আপনার দ্বারা নির্মিত নতুন প্রতিশ্রুতি বলব new)।
  2. এর মধ্যে oldএবং newএর newমতো গাছের রেকর্ডিংয়ের মধ্যে একত্রীকরণ তৈরি করুন git checkout new && git merge -s ours old
  3. এটি আপনার মাস্টারের সাথে মার্জ করুন git merge master
  4. ফলাফল দিয়ে আপনার মাস্টার আপডেট করুন git push . HEAD:master
  5. ফলাফল ধাক্কা।

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


17
আপনি যখন একটি সংশোধিত প্রতিশ্রুতি চাপিয়ে দেন (ইতিহাস ধ্বংস করে) তখন কী হয় তা আমি খুব ভাল করেই জানি aware ভাগ্যক্রমে যথেষ্ট, আমি দূরবর্তী রেপোটি একটি নেটওয়ার্ক ড্রাইভে থাকার সাথে প্রকল্পের একমাত্র বিকাশকারী ছিলাম তাই এটি এত বড় কোনও চুক্তি ছিল না। আমি কখনও কোনও সংশোধন প্রতিশ্রুতি মার্জ করার বিষয়ে ভাবি নি, তাই আমি এটিকে উজ্জীবিত করব।
Spoike

61
আমাদের সংস্থায়, আমরা বেশ নিয়মিত জোর করে ধাক্কা দিয়ে থাকি ... ব্যক্তিদের দ্বারা বিকাশ করা বৈশিষ্ট্যগুলি শাখাগুলিতে।
ওন্দ্রা Žižka

2
লিনাসের বদনামটি হ'ল কারণ আপনি বল প্রয়োগের সাহায্যে ইতিহাসটি মুছে ফেলেছিলেন, এটি করার কারণে নয়। গ্যাব্রিয়েলভের সমাধান ভাল কাজ করে, কারণ এটি ইতিহাস পরিবর্তন করে না।
ব্যবহারকারী 411279

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

2
ডা ব্রেকো আপনি git reflogএটির জন্য এটি ব্যবহার করতে পারেন
সাইমন জাইেক্স

269

আপনি একটি গিট সুরক্ষা বৈশিষ্ট্যটি দেখছেন। গিট আপনার শাখার সাথে রিমোট শাখা আপডেট করতে অস্বীকার করেছে, কারণ আপনার শাখার প্রধান অঙ্গীকার যে শাখায় আপনি চাপ দিচ্ছেন তার বর্তমান প্রধান প্রতিশ্রুতির সরাসরি বংশধর নয়।

যদি এটি না হয়, তবে একই সময়ে প্রায় একই সময়ে একই সংগ্রহস্থলের দিকে এগিয়ে যাওয়ার জন্য দু'জন লোক জানতে পারে না যে একই সময়ে একটি নতুন প্রতিশ্রুতি আসছিল এবং যে কেউ শেষের দিকে চাপ দেয় তারা কোনওটি ছাড়াই পূর্বের পুশারের কাজটি হারাবে তারা এই উপলব্ধি।

আপনি যদি জানেন যে আপনিই একমাত্র ব্যক্তি চাপ দিচ্ছেন এবং আপনি একটি সংশোধিত প্রতিশ্রুতি বা ধাক্কা দিতে চান যা শাখাটি ফিরিয়ে দেয়, আপনি গিটকে -fস্যুইচটি ব্যবহার করে দূরবর্তী শাখাটি আপডেট করতে বাধ্য করতে পারেন।

git push -f origin master

এমনকি এটি কাজ করতে পারে না কারণ গিটটি দূরবর্তী সংগ্রহস্থলগুলিকে কনফিগারেশন ভেরিয়েবলটি ব্যবহার করে দূর প্রান্তে নন-ফাস্টফোরওয়ার্ড পুশগুলি অস্বীকার করতে দেয় receive.denynonfastforwards। যদি এটি হয় তবে প্রত্যাখ্যান কারণটি দেখতে এরকম দেখাবে ('দূরবর্তী প্রত্যাখ্যানিত' অংশটি নোট করুন):

 ! [remote rejected] master -> master (non-fast forward)

এটি পেতে, আপনাকে হয় দূরবর্তী সংগ্রহস্থলের কনফিগারেশন পরিবর্তন করতে হবে বা একটি নোংরা হ্যাক হিসাবে আপনি শাখাটি মুছে ফেলা এবং পুনরায় তৈরি করতে পারেন:

git push origin :master
git push origin master

সাধারণত git pushফর্ম্যাটটি ব্যবহার করার জন্য সর্বশেষ পরামিতি <local_ref>:<remote_ref>, যেখানে local_refস্থানীয় সংগ্রহস্থলে remote_refশাখার নাম এবং দূরবর্তী সংগ্রহস্থলের শাখার নাম। এই কমান্ড জুটি দুটি শর্টহ্যান্ড ব্যবহার করে। :masterএকটি নাল লোকাল_রেফ রয়েছে যার অর্থ দূরবর্তী দিকে নাল শাখা masterটিপুন, অর্থাৎ দূরবর্তী শাখাটি মুছুন। কোনও শাখাবিহীন একটি শাখার নাম :স্থানীয় নামটি দেওয়া নামটির সাথে একই নামে প্রত্যন্ত শাখায় চাপ দিন। masterএই পরিস্থিতিতে জন্য সংক্ষিপ্ত master:master


2
এটি গিথুবের সাথে কাজ করে নি, এটি আমাকে নিম্নলিখিত বার্তা দিয়েছে: [রিমোট প্রত্যাখ্যান] মাস্টার (বর্তমান শাখা মুছে ফেলা নিষিদ্ধ)
বেদনাং

আমি জোর করে চাপ দিতে চাইনি (যা আমি জানতাম যে সমস্যাটি সমাধান হবে) তবে এখন আমার ধারণা আমার কোনও বিকল্প নেই।
বেদনাং

1
এটি একমাত্র সমাধান যা আমার রেপো অ্যাসেমব্লার সাথে হোস্টের জন্য কাজ করেছিল।
জাস্টিন

1
রিমোট মাস্টার শাখা মুছে ফেলা কি রিমোট রেপোতে জায়গা ফাঁকা করে দেবে?
মিস্টার_আর_আমস_ডি

1
@ মিঃ_আর_আমস_ডি: তাত্ক্ষণিকভাবে নয়, তবে git gcএকবার প্রত্যাবর্তনের পরে পুরানো জিনিসগুলি ছাঁটাই করা হবে। সংগ্রহস্থলটির ক্লোনিং করা কেউই শাখাটি আপডেট হওয়ার সাথে সাথে এমন কোনও বস্তু পাবেন না যা আর পৌঁছনীয় নয়।
সিবি বেইলি

211

দ্রুত অভিভাবক: সত্যিকারের উত্তর এখানে যে কেউ পোস্ট করেনি তা গিট সি এল এলির দ্বারা প্রদর্শিত মরিয়া ব্যবহারকারী-শত্রুতা প্রদর্শন করে না।

যাইহোক, এটি করার জন্য "সুস্পষ্ট" উপায়টি ধরে নিয়ে আপনি ধাক্কা দেওয়ার চেষ্টা করেননি, প্রথমে টানতে হবে। এটি আপনার সংশোধিত পরিবর্তনটিকে টেনে তুলবে (এবং তাই আর নেই) যাতে আপনার আবার তা থাকে।

একবার আপনি কোনও দ্বন্দ্ব সমাধান করার পরে আপনি আবার চাপ দিতে পারেন।

তাই:

git pull

আপনি যদি টানতে ত্রুটি পান তবে আপনার স্থানীয় সংগ্রহস্থল কনফিগারেশনে কিছু ভুল হতে পারে (.git / কনফিগার শাখা বিভাগে আমার একটি ভুল রেফারেন্স ছিল)।

এবং তারপর

git push

হতে পারে আপনি "তুচ্ছ মেশানো" সম্পর্কে সাবজেক্টের সাথে অতিরিক্ত প্রতিশ্রুতি পাবেন।


2
হ্যাঁ, আমি এই সম্পর্কে লিখেছে, দেখতে stackoverflow.com/questions/253055/... );
Spoike

10
আমি এটি প্রত্যাশা করেছিলাম ঠিক তেমন কাজ করে না। এটি দুটি নতুন কমিট তৈরি করে। এটি পুরানোটির প্রতিরূপ, তবে সংশোধিত পরিবর্তনগুলি। এবং একটি একীকরণ একটি খালি পার্থক্য সঙ্গে প্রতিশ্রুতিবদ্ধ। এখনও পুরানো প্রতিশ্রুতি অপরিবর্তিত রেখে, সম্ভবত সংবেদনশীল ডেটা প্রকাশ করে যা আমি সংশোধন করার চেষ্টা করছিলাম। আমি বিশ্বাস করি git push -fবা git resetএখানে যাওয়ার একমাত্র উপায়।
Thnee

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

102

সংক্ষিপ্ত উত্তর: সংশোধিত প্রতিশ্রুতিগুলি পাবলিক রেপোতে চাপবেন না।

দীর্ঘ উত্তর: কয়েকটি গিট কমান্ড, যেমন git commit --amendএবং git rebaseআসলে ইতিহাসের গ্রাফটি পুনরায় লেখায় rite যতক্ষণ না আপনি নিজের পরিবর্তনগুলি প্রকাশ করেননি এটি ঠিক আছে, তবে একবার আপনি করার পরে, আপনি সত্যিই ইতিহাসের সাথে ঘৃণা করবেন না, কারণ যদি কেউ ইতিমধ্যে আপনার পরিবর্তনগুলি পেয়ে থাকে, তবে যখন তারা আবার টানতে চেষ্টা করে, ব্যর্থ হতে পারে । কোন প্রতিশ্রুতি সংশোধন করার পরিবর্তে, আপনার পরিবর্তনগুলি নিয়ে একটি নতুন প্রতিশ্রুতি করা উচিত।

তবে, আপনি যদি সত্যই সত্যিকার অর্থে সংশোধিত প্রতিশ্রুতিটি চাপতে চান তবে আপনি এটি করতে পারেন:

$ git push origin +master:master

নেতৃস্থানীয় +লক্ষণটি "দ্রুত এগিয়ে যাওয়ার" প্রতিশ্রুতি না দিলেও, এই চাপটি ঘটতে বাধ্য করবে will (যখন আপনি যে পরিবর্তনগুলি ধাক্কা দিচ্ছেন তা জনসাধারণের রেপোতে ইতিমধ্যে পরিবর্তনগুলির প্রত্যক্ষ বংশধর হয়ে উঠলে একটি দ্রুত অগ্রসর করার প্রতিশ্রুতি হয় ))


5
গিট পুশ-এফ থেকে এটি কীভাবে আলাদা (ভাল বা খারাপ)? ধন্যবাদ!
বেন্টফোর্ড

11
@ বেন্টফোর্ড: এটি মূলত একই জিনিস git push -f
মিপাদি

54

আপনি ইতিমধ্যে একটি করার পরে আপনার পরিবর্তনগুলি ঠেকানোর জন্য এখানে একটি খুব সহজ এবং পরিষ্কার উপায় commit --amend:

git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master

যা নিম্নলিখিতগুলি করে:

  • শাখা মাথা পিতামাতার প্রতিশ্রুতি পুনরায় সেট করুন।
  • এই শেষ প্রতিশ্রুতিবদ্ধ।
  • রিমোটে চাপ দিন। রিমোটের এখন শেষ প্রতিশ্রুতি নেই।
  • আপনার স্ট্যাশ পপ করুন।
  • পরিষ্কারভাবে প্রতিশ্রুতিবদ্ধ।
  • রিমোটে ধাক্কা।

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


3
২ টি মন্তব্য: - আপনি যদি অন্য একটিতে কাজ করে থাকেন তবে শাখার নাম পরিবর্তন করতে ভুলবেন না - git addপরিবর্তনগুলি অন্তর্ভুক্ত করার জন্য আমার প্রতিশ্রুতিবদ্ধ হওয়ার আগে আমাকে ব্যবহার করতে হয়েছিল।
সিলভাইনবি

1
উইন্ডোজ সিএমডি সালে প্রথম কমান্ড পলান করা উচিত: git reset --soft "HEAD^"। বাকীগুলি ভাল কাজ করে।
মিঃ মিস্টার

2
"একটি খুব সহজ এবং পরিষ্কার উপায় .." উদ্ধৃতি। এই পদ্ধতিতে জোরপূর্বক ধাক্কা অন্তর্ভুক্ত। উপরের উত্তরের সমস্ত সমালোচনার আলোকে আমি নিশ্চিত নই যে এই পদ্ধতিটি আসলে একটি পরিষ্কার কিনা।
Na13-সি

24

আমি আমার স্থানীয় সংশোধিত প্রতিশ্রুতি বাতিল করে এবং নতুন পরিবর্তনগুলি উপরে যুক্ত করে সমাধান করেছি:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

2
এটি সহজতম সংস্করণ!
mknaf

পুনর্লিখনের ইতিহাসের সাথে গোলযোগের চেয়ে আরও একটি 'পরিবর্তন' প্রতিশ্রুতি যুক্ত করা ভাল। আমি @mknaf
sdkks এর

8

আমারও একই সমস্যা ছিল।

  • দুর্ঘটনাক্রমে সর্বশেষ প্রতিশ্রুতি সংশোধন করা হয়েছে যা ইতিমধ্যে ঠেলে দেওয়া হয়েছিল
  • স্থানীয়ভাবে প্রচুর পরিবর্তন হয়েছে, প্রায় পাঁচবার প্রতিশ্রুতিবদ্ধ
  • ধাক্কা দেওয়ার চেষ্টা করেছিল, একটি ত্রুটি পেয়েছে, আতঙ্কিত হয়েছে, রিমোট একীভূত হয়েছে, প্রচুর নন-মাই-ফাইল পেয়েছে, পুশ হয়েছে, ব্যর্থ হয়েছে ইত্যাদি

গিট-নবাগত হিসাবে আমি ভেবেছিলাম এটি সম্পূর্ণ ফুবার

সমাধান: কিছুটা @ বারার প্রস্তাবিত একটি স্থানীয় ব্যাকআপ শাখা তৈরি করেছে

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

সম্ভবত এটি একটি দ্রুত এবং পরিষ্কার সমাধান নয়, এবং আমি আমার ইতিহাস হারিয়েছি (5 এর পরিবর্তে 1 টি প্রতিশ্রুতি), তবে এটি একটি দিনের কাজ সাশ্রয় করেছে।


6

যদি আপনি কোডটি আপনার দূরবর্তী শাখায় (গিটহাব / বিটবকেট) না ঠেলে থাকেন তবে আপনি নীচের মতো কমান্ড লাইনে প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে পারেন।

 git commit --amend -m "Your new message"

আপনি যদি একটি নির্দিষ্ট শাখায় কাজ করছেন তবে এটি করুন:

git commit --amend -m "BRANCH-NAME: new message"

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

এটি করার আগে দয়া করে পুরো উত্তরটি পড়ুন

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

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


1
আপনি যদি আপনার শেষ উদাহরণটিতে সাফল্যের সাথে প্রতিশ্রুতিটি টানেন, তবে আপনাকে জোর করে চাপ দেওয়ার কী দরকার? একটি স্ট্যান্ডার্ড ধাক্কা যথেষ্ট হবে না? ধন্যবাদ
টমাস

টমাস জিজ্ঞাসা করা প্রশ্ন আসলে খুব বৈধ। আমার নিজেরও ধাক্কা অনুসরণ করার জন্য জোর করার প্রয়োজন হয়নি।
Na13-সি

দয়া করে এটিকে "সেরা অনুশীলন" হিসাবে অভিহিত করবেন না কারণ চারপাশে কাজ করার একটি উপায় রয়েছে --force, গৃহীত উত্তরটি দেখুন
ফরিদ

5

যদি আপনি জানেন যে কেউ আপনার আন-সংশোধিত প্রতিশ্রুতিটি টানেনি, তবে --force-with-leaseবিকল্পটি ব্যবহার করুন git push

টর্টোজাইজিটে, আপনি "পুশ ..." বিকল্পগুলির অধীনে "ফোর্স: বাতিল করতে পারে" এবং "পরিচিত পরিবর্তনগুলি" পরীক্ষা করে একই জিনিস করতে পারেন।

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


4

আপনি এই ত্রুটিটি পাচ্ছেন কারণ গিট দূরবর্তীটিতে ইতিমধ্যে এই প্রতিশ্রুতিবদ্ধ ফাইল রয়েছে। এটি কাজ করার জন্য আপনাকে শাখাটি চাপ দিতে হবে:

git push -f origin branch_name

আপনার দলের অন্য কেউ একই শাখায় যেতে পারে বলে আপনি দূরবর্তী থেকে কোডটি টানছেন তাও নিশ্চিত করুন।

git pull origin branch_name

এটি এমন একটি ক্ষেত্রে যেখানে আমাদের বাধ্যতামূলকভাবে রিমোটে চাপ দিতে হয়।


এই উত্তরটি পূর্বের উত্তরে উত্থাপিত বড় মন্তব্যের জন্য অ্যাকাউন্টিং নয় কেন?
Na13-সি

2

আপনি ইতিমধ্যে একটি git add "your files"এবং এর পরে আপনার পরিবর্তনগুলি ঠেকানোর জন্য এখানে একটি খুব সহজ এবং পরিষ্কার উপায় git commit --amend:

git push origin master -f

বা:

git push origin master --force

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

1

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


আসলে তা না. সমস্যাটি হ'ল আপনি দূরবর্তী রেপো থেকে আপনার স্থানীয় অনুলিপি আপডেট করেন নি। গিট এটিতে চাপ দেবে না কারণ আপনাকে ম্যানুয়ালি একত্রীকরণের সাথে ডিল করতে হতে পারে। আমার অন্য উত্তরে আমার কাছে একটি কমান্ড রয়েছে (এবং ব্যাখ্যা) যা একটি চাপ দিতে বাধ্য করবে - তবে সতর্কতা অবলম্বন করুন যা দূরবর্তী পরিবর্তনগুলি মুছে ফেলতে পারে।
মিপাদি

1

গিট আমাকে যা করতে বলেছিল তা আমি কেবল করেই চললাম। তাই:

  • সংশোধিত কমিটের কারণে চাপ দিতে পারছি না।
  • আমি প্রস্তাব হিসাবে একটি টান না।
  • মার্জ ব্যর্থ। সুতরাং আমি নিজেই এটি ঠিক।
  • একটি নতুন প্রতিশ্রুতি তৈরি করুন ("মার্জ" হিসাবে লেবেলযুক্ত) এবং এটিকে চাপ দিন।
  • মনে হচ্ছে কাজ!

দ্রষ্টব্য: সংশোধিত প্রতিশ্রুতি সর্বশেষতমটি ছিল।


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

1

নিম্নলিখিত এবং লেখক এবং প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ যখন পরিবর্তন আমার জন্য কাজ করে।

git push -f origin master

গিটটি যথেষ্ট স্মার্ট ছিল যে এইগুলি অভিন্ন ডেল্টাসের কমিট যা কেবল মেটা তথ্য বিভাগে পৃথক ছিল।

স্থানীয় এবং দূরবর্তী উভয় প্রধানই প্রশ্নে কমিটিকে নির্দেশ করেছেন।


1

আপনি যদি ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করছেন, আপনি এটি সহজ করার জন্য এই এক্সটেনশানটি ব্যবহার করে দেখতে পারেন।

https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force

আপনি এর নামটি থেকে বুঝতে পারবেন, এটি ক্রমাগত আদেশগুলি কার্যকর করে

  • git commit --amend
  • git push --force

0

এখানে, আমি পূর্বের প্রতিশ্রুতিতে কীভাবে একটি সম্পাদনা স্থির করেছি:

  1. এখন পর্যন্ত আপনার কাজ সংরক্ষণ করুন।
  2. যদি করা হয় তবে আপাতত আপনার পরিবর্তনগুলি সরিয়ে রাখুন: git stash আপনার শেষ প্রতিশ্রুতিবদ্ধ অবস্থায় এখন আপনার কার্যকরী অনুলিপি পরিষ্কার clean
  3. সম্পাদনা এবং সংশোধন করুন।
  4. "সংশোধন" মোডে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ :git commit --all --amend
  5. আপনার সম্পাদক লগ বার্তা জানতে চাইবে (ডিফল্টরূপে, পুরানো লগ বার্তা)। আপনি যখন এতে খুশি হন তখন সংরক্ষণ করুন এবং প্রস্থান করুন।

    পুরানো প্রতিশ্রুতিতে নতুন পরিবর্তন যুক্ত করা হয়েছে। git logএবং সাথে নিজের জন্য দেখুনgit diff HEAD^

  6. যদি করা হয় তবে আপনার স্ট্যাশ করা পরিবর্তনগুলি পুনরায় প্রয়োগ করুন: git stash apply

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