অনুপস্থিত-এম বিকল্প সম্পর্কে গিটটি কেন ফিরিয়ে দেয়?


183

সুতরাং আমি অন্যান্য লোকের সাথে একটি প্রকল্পে কাজ করছি, এবং সেখানে একাধিক গিথব কাঁটাচামচ কাজ করা হচ্ছে। কেউ মাত্র একটি সমস্যার সমাধান করেছেন এবং আমি তার কাঁটাচামচটির সাথে একীভূত হয়েছি তবে আমি বুঝতে পেরেছিলাম যে এর থেকে ভাল সমাধান আমি খুঁজে পেতে পারি। আমি সবেমাত্র যে প্রতিশ্রুতি দিয়েছি তা আমি ফিরিয়ে দিতে চাই। আমি git revert HEADএটি দিয়ে চেষ্টা করেছিলাম কিন্তু এটি আমাকে এই ত্রুটি দিয়েছে:

মারাত্মক: প্রতিশ্রুতি <Sha1> হ'ল একটি মার্জ কিন্তু কোনও-এম বিকল্প দেওয়া হয়নি।

ওটার মানে কি? আমি যখন মার্জ হয়েছি এবং প্রতিশ্রুতিবদ্ধ তখন আমি "ব্যবহারকারীর সাথে মার্জড" বলার জন্য -m বিকল্পটি ব্যবহার করেছি।

আমি এখানে কি ভুল করছি?

উত্তর:


216

ডিফল্টরূপে git revertএকীভূত প্রতিশ্রুতিটিকে বাস্তব হিসাবে অস্পষ্ট বলে বোঝাতে প্রত্যাখ্যান করে। আমি অনুমান করি যে আপনার HEADআসলে একীকরণের অঙ্গীকার।

আপনি যদি মার্জ কমিটিকে পূর্বাবস্থায় ফিরিয়ে আনতে চান তবে আপনাকে মার্জটির কোন পিতামাতাকে প্রধান ট্রাঙ্ক হিসাবে বিবেচনা করতে চান তা নির্ধারণ করতে হবে, অর্থাৎ আপনি কী আবার ফিরে যেতে চান।

প্রায়শই এটি পিতা-মাতার এক নম্বর হবে, উদাহরণস্বরূপ যদি আপনি চালু থাকেন masterএবং থাকেন git merge unwantedএবং তারপরে মার্জটি ফিরিয়ে আনার সিদ্ধান্ত নিয়েছেন unwanted। প্রথম পিতামাতা হবেন আপনার প্রাক-মার্জ masterশাখা এবং দ্বিতীয় পিতামাতার টিপ হবে unwanted

এই ক্ষেত্রে আপনি করতে পারেন:

git revert -m 1 HEAD

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

42
আমাকে -m1 বা -m2 ব্যবহার করতে হবে কিনা তা আমি কোথায় জানতে পারি? ...
প্যাট্রিক কর্নেলিসসেন

34
git cat-file -p [MERGE_COMMIT_ID]ক্রমানুসারে পিতামাতাদের শাখাগুলি প্রদর্শন করবে। তালিকাভুক্ত প্রথমটি হবে -m 1দ্বিতীয়টি -m 2
নস্ট্রোম

2
git revert [HASH] -m 2আমাকে শাখা 1.x-1.x তে প্রতিশ্রুতিবদ্ধ করার জন্য কিছুই বলছে না, কার্যকরী ডিরেক্টরি পরিষ্কার করুন কিন্তু আমার প্রতিশ্রুতি পুনরায় করা হয়নি।
জেনাল্যাম্পটন

3
সুতরাং যদি আমার অতীতের দশটি সংশ্লেষ ফিরিয়ে নেওয়া দরকার (যা সম্ভবত অন্য কোনও বিকাশকারীর পরিবর্তনের জন্য টানলে গিট স্বয়ংক্রিয়ভাবে মার্জ সম্পাদন করে) তবে প্রতিটি একক সংযুক্তির জন্য আমাকে এটি করতে হবে? এই কারণেই কি গিট গানের অনুরাগীরা রিবাজেসে এত আগ্রহী, কারণ রিভার্ট মূলত অকেজো?
নিউট্রিনো

45

বলুন যে অন্য লোকটি ফু এর উপরে বার তৈরি করেছে, তবে আপনি এর মধ্যে বাজ তৈরি করেছেন এবং তারপরে একীভূত হয়ে ইতিহাসের ইতিহাস দিয়েছেন

it গিট লোলা
* 2582152 (হেড, মাস্টার) শাখা 'অ্যাডগারুই' মার্জ করুন
| \  
| * c7256de (otherguy) বার
* | b7e7176 বাজ
| /  
* 9968f79 ফু

দ্রষ্টব্য: গিট লোলা একটি মানহীন তবে দরকারী উপকরণ।

এর সাথে কোনও ডাইস নেই git revert:

it গিট রিভার্ট হেড
মারাত্মক: প্রতিশ্রুতি 2582152 ... একীভূত হয় তবে নো-এম বিকল্প দেওয়া হয়নি।

চার্লস বেইলি যথারীতি দুর্দান্ত উত্তর দিয়েছেন । git revertহিসাবে হিসাবে ব্যবহার

it গিট রিভার্ট - নন-এডিট-মি 1 হেড
[মাস্টার e900aad] "শাখা 'মার্জ করুন' অ্যাডগারুই '" ফিরিয়ে দিন
 0 টি ফাইল পরিবর্তন করা হয়েছে, 0 টি সন্নিবেশ (+), 0 টি মোছা (-)
 মোড 100644 বার মুছুন

কার্যকরভাবে মুছে ফেলা barএবং এর ইতিহাস উত্পাদন করে

it গিট লোলা
* e900aad (শিরোনাম, মাস্টার) "শাখা 'মার্জ করুন' অন্যান্যগ্রয় '" ফিরিয়ে দিন
* 2582152 শাখা 'otherguy' মার্জ করুন
| \  
| * c7256de (otherguy) বার
* | b7e7176 বাজ
| /  
* 9968f79 ফু

তবে আমার সন্দেহ হয় আপনি মার্জ কমিটটি ফেলে দিতে চান :

it গিট রিসেট - হেয়ার হেড ^
হেড এখন B7e7176 বাজে

it গিট লোলা
* b7e7176 (হেড, মাস্টার) বাজ
| * c7256de (otherguy) বার
| /  
* 9968f79 ফু

ম্যানুয়ালটিতে নথিভুক্তgit rev-parse

<rev>^উদাহরণস্বরূপ, হেড ^,v1.5.1^0 একটি রিভিশন প্যারামিটারের
প্রত্যয় ^অর্থ সেই কমিটমেন্ট অবজেক্টের প্রথম পিতামাতা। ^<n>অর্থ এন- পিতাম ( অর্থাত্ <rev>^ সমান <rev>^1)। একটি বিশেষ নিয়ম হিসাবে, <rev>^0মানে প্রতিশ্রুতিবদ্ধ হওয়া এবং যখন ব্যবহৃত <rev>হয় কোনও ট্যাগ অবজেক্টের অবজেক্টের নাম যা কমিটমেন্ট অবজেক্টকে বোঝায়।

তাই invoking সামনে git reset, HEAD^(অথবা HEAD^1) b7e7176 ছিলেন এবং HEAD^2c7256de ছিল, অর্থাত যথাক্রমে একত্রীকরণ প্রথম ও দ্বিতীয় বাবা কমিট।

সতর্কতা অবলম্বন করুন git reset --hardকারণ এটি কাজটিকে ধ্বংস করতে পারে।


3
এটি মিশ্রিত, বিশৃঙ্খল, বিশ্বকে কাঁপানো। লোলা বাদে। এই দুর্দান্ত ওরফে জন্য একটি মিলিয়ন ধন্যবাদ।
বার্নি

lolaআপনার গিট কমান্ডগুলিতে যুক্ত করার সহজ উপায় :git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
ডি গিবস

8

আমার এই সমস্যাটি ছিল, সমাধানটি ছিল কমিট গ্রাফটি দেখতে (গিটক ব্যবহার করে) এবং আমার নিম্নলিখিতগুলি ছিল তা দেখুন:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

আমি এখন বুঝতে পারি যে আমি করতে চাই

git cherry-pick -m 2 mycommitsha

এটি কারণ -m 1সাধারণ পিতামাতার উপর ভিত্তি করে মার্জ হবে যেখানে -m 2শাখার y এর উপর ভিত্তি করে মার্জ হিসাবে , এটিই আমি চেরি-বাছাই করতে চাই।


1
সম্ভবত কারণ এটি সম্পর্কিত নয় git-revert, যা এই প্রশ্নটি সম্পর্কে।
pnomolos

1
আমি মনে করি এই প্রশ্নটি -mবিকল্প সম্পর্কে , একচেটিয়াভাবে নয় git merge। উদাহরণস্বরূপ, -mবিকল্পটি ব্যবহারের পিছনে যুক্তিগুলি রিভার্ট এবং চেরি-পিকগুলির জন্য অনুরূপ বলে মনে হয়। যদি এটি সত্য না হয় তবে দয়া করে আমাদের জানান। যেহেতু আমি চেরি-বাছাইয়ের ব্যবহারের জন্য বিশেষভাবে অন্য কোনও প্রশ্ন খুঁজে পাইনি, এই উত্তরটির জন্য ধন্যবাদ, সম্ভবত গুগল আমাকে এই প্রশ্নটি এবং দরকারী, প্রাসঙ্গিক আলোচনার সন্ধান করতে সহায়তা করেছিল!
nealmcb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.