ইতিমধ্যে দূরবর্তী শাখায় ঠেলাঠেলি করা একীকরণের প্রতিশ্রুতি কীভাবে ফিরে যাবে?


959

git revert <commit_hash> একা কাজ করবে না। -mঅবশ্যই নির্দিষ্ট করা উচিত, এবং আমি এটি সম্পর্কে বেশ বিভ্রান্ত।

এর আগে কেউ অভিজ্ঞতা হয়েছে?


3
এই প্রশ্নের উত্তরটি একবার দেখুন: stackoverflow.com/questions/2318777/…
ইউজেন


এখানে লিঙ্কটি সর্বোত্তম উদাহরণ যা মার্জ করা প্রতিশ্রুতি ফিরিয়ে দেওয়ার চিত্রিত করে: খ্রিস্টিয়েনগভ্যাল.সেস
এস কে ভেঙ্কট

এটি যেখানে উদাহরণস্বরূপ ডিজাইনের সাথে gitমেলে না git-flowপ্রত্যেকের ব্যবহৃত ওয়ার্কফ্লো। যদি আপনি developচেক আউট করে থাকেন তবে অবশ্যই আপনি 2-কমিট বৈশিষ্ট্য শাখাটি ফিরিয়ে দিতে চান যা একটি বাগ প্রবর্তন করেছিল এবং বহু বছরের শেয়ার্ড দেব শাখাটিকে নয়। এটিকে বাছাই করার জন্য হাস্যকর প্রয়োজন মনে হচ্ছে -m 1
পেকম্ব

2
আমার কাছে অন্য একটি পরামর্শ যা এর আগে আমার কাছে কখনও ঘটেনি - যদি শাখাগুলির একটিও কমিটের তালিকা ছোট হয় তবে আপনি কমিটের পুরো শাখার পরিবর্তে স্বতন্ত্র কমিটগুলি ফিরিয়ে আনতে আরও স্বাচ্ছন্দ্য বোধ করতে পারেন।
শ্রীধর সারনোবাত

উত্তর:


1152

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

আপনি যখন আউটপুটটিতে মার্জ কমিটটি git logদেখেন, আপনি তার পিতামাতার সাথে শুরু হওয়া লাইনে তালিকাবদ্ধ দেখতে পাবেন Merge:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <ben@example.com>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

এ অবস্থায় git revert 8f937c6 -m 1যেমন ছিল আপনি গাছ পাবেন 8989ee0এবং git revert -m 2গাছ পুনর্বহাল করব যেমন ছিল 7c6b236

প্যারেন্ট আইডিগুলি আরও ভালভাবে বুঝতে, আপনি চালাতে পারেন:

git log 8989ee0 

এবং

git log 7c6b236

126
দুটি সংখ্যার থেকে 8989ee0, 7c6b236কোনটি যান। কীভাবে বুঝব?
অরূপ রক্ষিত

12
প্রত্যাবর্তনের পরে, আমি মনে করি না যে কেউ সোর্স শাখায় কোডটি সহজেই সংশোধন করতে এবং আবার সংহত করতে সক্ষম হবে? kernel.org/pub/software/scm/git/docs/howto/…
ইসমাইলস

10
আরও ভাল ব্যাখ্যার সন্ধানের জন্য গুগল করার সময় আমি এই নিবন্ধটি পেয়েছি যা আমি ভেবেছিলাম যে বিশদটি সন্ধানের জন্য দুর্দান্ত কাজ করেছে। আমি পড়ার পরে আবিষ্কার করেছিলাম যে আমি যা খুঁজছিলাম তা হ'ল রিসেট কমান্ড, তারপরে একটি জোর ধাক্কা। হতে পারে এটি অন্য কাউকে সাহায্য করবে। atlassian.com/git/tutorials/…
Funktr0n

46
@ অরূপক্ষিত যদি আপনি দৌড়েন git log 8989ee0এবং git log 7c6b236, আপনার উত্তরটি জানা উচিত।
বিএমডাব্লু

4
গিট লগ - সমস্ত একত্রীকরণ এবং গিট লগ দেখতে নিমজ্জন - কোনও সংযোজন ছাড়াই ইতিহাস দেখার জন্য না-মার্জ। একটি শাখা মার্জ করা মার্জড শাখার ইতিহাসকে টার্গেটে নিয়ে আসে এবং প্লেইন গিট লগ ব্যবহার করে তা করা শক্ত করে তোলে
অ্যালেক্স পুন্নেন

368

এটি কাউকে সহায়তা করে এই আশায় একটি সম্পূর্ণ উদাহরণ:

git revert -m 1 <commit-hash> 
git push -u origin master

<commit-hash>আপনি যে রূপান্তর করতে চান সেই মার্জ করার প্রতিশ্রুতিবদ্ধ হ্যাশটি কোথায় এবং এই উত্তরের ব্যাখ্যা অনুসারে ,-m 1 ইঙ্গিত করছে যে একত্রীকরণ করার পূর্বে প্রথমে পিতা বা মাতা বৃক্ষ প্রত্যাবর্তন করতে চাই।

git revert ...লাইন মূলত আপনার পরিবর্তনগুলি করে যখন দ্বিতীয় লাইন আপনার পরিবর্তনগুলি তাদের দূরবর্তী শাখায় ধাক্কা দিয়ে সর্বজনীন হয়।


21
আমি বিশ্বাস করি git revert কমান্ডটি ইতিমধ্যে তৈরি কমিট অবজেক্টটি কমিট করেছে ited এটি না হওয়ার জন্য আপনাকে --no-commitপতাকাটি ইনপুট করতে হবে
ডেলিফিক

2
@ ডেলিফিক যেমন উল্লেখ করেছেন, কমিট ইতিমধ্যে প্রথম লাইন দ্বারা পরিচালিত হয়েছে (এটির বৈধতা দেওয়ার জন্য আমার একটি: ডাব্লুএইচকিউ প্রয়োজন) তাই দ্বিতীয় লাইনটি প্রয়োজনীয় নয়।
eka808

1
এটা সন্দ্বিহান. এখানে কেবল 2 টি লাইন রয়েছে এবং কোনও গিট কমিট নেই .. কেউ দয়া করে সম্পাদনা করতে পারেন।
জে র্যান্ডম

176

বেন আপনাকে কীভাবে একীভূত প্রতিশ্রুতি ফিরিয়ে আনতে হবে তা বলেছে, তবে এটি করা আপনার পক্ষে উপলব্ধি করা খুব গুরুত্বপূর্ণ

"... ঘোষণা করে যে আপনি কখনও সংযুক্তির মাধ্যমে গাছের পরিবর্তন আনতে চাইবেন না a ফলস্বরূপ, পরে মার্জগুলি কেবল পূর্বে উল্লিখিত সংযুক্তির পূর্বপুরুষ নয় এমন কমিট দ্বারা প্রবর্তিত বৃক্ষের পরিবর্তন আনবে bring এটি হতে পারে বা নাও হতে পারে আপনি যা চান তা "" (গিট-মার্জ ম্যান পেজ)

একটি ম্যান পৃষ্ঠা থেকে লিঙ্কিত নিবন্ধ / মেলিং তালিকার বার্তাটিতে এর সাথে জড়িত পদ্ধতিগুলি এবং বিবেচনার বিবরণ দেওয়া হয়েছে। কেবল নিশ্চিত হয়ে নিন যে আপনি মার্জ কমিটটি ফিরিয়ে দিলে আপনি কেবল পরে আবার শাখাটি মার্জ করতে পারবেন না এবং একই পরিবর্তনগুলি ফিরে আসার প্রত্যাশা করতে পারবেন।


80
তবে যদি সত্যিই প্রয়োজন হয় তবে সেগুলি ফিরিয়ে আনতে আপনি ফিরে যেতে পারেন।
দুলোর

5
ধন্যবাদ। সংযুক্তিকে পূর্বাবস্থায় ফেরাতে ব্যবহারের ক্ষেত্রে হিসাবে জানা খুব কার্যকর - বাগের কারণে, বলুন - এবং তার পরে বাগটি ঠিক হয়ে গেলে পুরো শাখাটি পুনরায় মার্জ করা একটি সাধারণ বিষয়।
10

3
আপনি যদি আমার মতো হন এবং পরে মার্জটি না চান আপনি হয় উল্টা ফিরতে পারেন, বা চেরি আপনি যে পরিবর্তনটি ফিরিয়ে দিয়েছেন তা বেছে নিতে পারেন।
ইউনিটাসব্রুকস 21

আমার পরিস্থিতিতে, আমি আমার পরিবর্তনগুলি-ব্যাক-ইস্যু পেতে 'রিভার্টটি ফিরিয়ে আনতে' আঘাত করেছি। চেরি-বাছাই করা আরও সুন্দর উপায় হতে পারে? আমি পরের বার চেষ্টা করব ...
স্টিভেন অ্যান্ডারসন

79

আপনি ভুল প্রতিশ্রুতি (গুলি) ফিরিয়ে আনতে বা আপনার দূরবর্তী শাখাটি পুনরায় সেট করতে হেড / স্থিতি ফিরিয়ে আনতে এই পদক্ষেপগুলি অনুসরণ করতে পারেন।

  1. স্থানীয় রেপোতে দূরবর্তী শাখাটি চেকআউট করুন।
    git checkout development
  2. গিট লগ থেকে কমিট হ্যাশ (অর্থাত্ কমিটের আইডি) অনুলিপি করুন git log -n5

    আউটপুট:

    7cd42475d6f95f5896b6f02e902efab0b70e8038 "শাখাটি 'ভুল-প্রতিশ্রুতিবদ্ধ' কে 'উন্নয়নের জন্য"
    প্রতিশ্রুতিবদ্ধ করুন "f9a734f8f44b0b37ccea769b9a2fd774c0f0c012" এটি একটি ভুল প্রতিশ্রুতিবদ্ধ "
    এই" কমেন্ট "3779ab50e7228 isa" 7979cdd532687 "

  3. পূর্ববর্তী পদক্ষেপে অনুলিপি করা অনুলিপিটিতে শাখাটিকে পুনরায় সেট করুন
    git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. চালান git statusভুল প্রতিশ্রুতির অংশ ছিল এমন সমস্ত পরিবর্তনগুলি দেখানোর জন্য ।
  5. সহজভাবে চালান git reset --hard সমস্ত পরিবর্তনগুলি প্রত্যাহার করতে ।
  6. আপনার স্থানীয় শাখাটিকে দূরবর্তী স্থানে চাপ দিন এবং লক্ষ্য করুন যে আপনার প্রতিশ্রুতিবদ্ধ ইতিহাসটি দূষিত হওয়ার আগে যেমন ছিল তেমন পরিষ্কার।
    git push -f origin development

4
যদি এর মধ্যে ২০ জন বিকাশকারী সর্বশেষ দেব সংযুক্তি টানেন তবে কী হবে?
ইওকস

2
সেই শাখাটি ব্যবহার করে 20 টি বিকাশকারী থাকাকালীন আমি কোনও উন্নয়ন শাখাকে জোর করবো না। :) সেক্ষেত্রে কেবল রিভার্ট কমিট করা বুদ্ধিমানের কাজ।
ssasi

4
এটি খুব ভাল সমাধান যখন আপনি নিজের দ্বারা কাজ করছেন বা আপনি নিশ্চিত যে অন্য কোনও দেবগণ আপনার দ্বারা চালিত কমিটগুলি টানছেন না
কাইল বি


30

কিছুই ঘটেনি হিসাবে লগটি পরিষ্কার রাখার জন্য (এই পদ্ধতির সাথে কিছুটা ধীরে ধীরে (পুশ-ফের কারণে)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>

'কমিট-হ্যাশ-বিফোর-মার্জ' মার্জ হওয়ার পরে লগ (গিট লগ) থেকে আসে।


ইঙ্গিত: আপনি যদি আপনার সংস্থায় এটি করছেন তবে আপনার অনুমতি নাও থাকতে পারে।
এনেস্কি

3
push -fভাগ করা রেপোতে কখনই কোনও কাজ করবেন না
ব্যাপটিস্ট মিল-ম্যাথিয়াস

17

কখনও কখনও রোলব্যাকের সবচেয়ে কার্যকর উপায় হ'ল পিছনে পদক্ষেপ এবং প্রতিস্থাপন।

git log

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

git checkout -b newbranch <HASH>

তারপরে পুরানো শাখাটি মুছুন, তার জায়গায় নতুন ব্রাঙ্কটি অনুলিপি করুন এবং সেখান থেকে পুনরায় চালু করুন।

git branch -D oldbranch
git checkout -b oldbranch newbranch

যদি এটি সম্প্রচারিত হয়, তবে সমস্ত সংগ্রহস্থল থেকে পুরানো শাখাটি মুছুন, রেডন শাখাটিকে সবচেয়ে কেন্দ্রীয় দিকে ঠেকান এবং এটিকে আবার নীচে টানুন।


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

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

5

আপনি যদি কোন mergeপ্রতিশ্রুতি ফিরিয়ে দিতে চান তবে আপনাকে যা করতে হবে তা এখানে।

  1. প্রথমে git logআপনার মার্জ কমিটের আইডি খুঁজতে চেক করুন । আপনি একত্রীকরণের সাথে যুক্ত একাধিক অভিভাবক আইডিগুলিও পাবেন (নীচের চিত্রটি দেখুন)।

এখানে চিত্র বর্ণনা লিখুন

হলদে বর্ণিত মার্জ কমিট আইডিটি নোট করুন। প্যারেন্ট আইডিগুলি হ'ল পরবর্তী লাইনে লেখা আছে Merge: parent1 parent2। এখন ...

ছোট গল্প:

  1. যে শাখায় একত্রীকরণ করা হয়েছিল সেটিতে স্যুইচ করুন। তারপরে কেবল এটি করুন git revert <merge commit id> -m 1যা viপ্রতিশ্রুতি বার্তা প্রবেশের জন্য একটি কনসোল উন্মুক্ত করবে । লিখুন, সংরক্ষণ করুন, প্রস্থান করুন!

দীর্ঘ কাহিনী:

  1. যে শাখায় একত্রীকরণ করা হয়েছিল সেটিতে স্যুইচ করুন। আমার ক্ষেত্রে এটি testশাখা এবং আমি feature/analytics-v3এটি থেকে শাখাটি সরিয়ে দেওয়ার চেষ্টা করছি ।

  2. git revertহ'ল আদেশ যা কোনও প্রতিশ্রুতি ফিরিয়ে দেয়। mergeপ্রতিশ্রুতি ফিরিয়ে দেওয়ার সময় একটি বাজে কৌশল আছে । আপনার -mপতাকাটি প্রবেশ করতে হবে অন্যথায় এটি ব্যর্থ হবে। এখান থেকে, আপনি সিদ্ধান্ত নিতে হবে যে আপনি নিজের শাখাটি ফিরিয়ে আনতে চান এবং এটি ঠিক যেমন প্রদর্শিত হয়েছিল parent1বা তার parent2মাধ্যমে দেখতে চান:

git revert <merge commit id> -m 1(ফিরে আসে parent2)

git revert <merge commit id> -m 2(ফিরে আসে parent1)

আপনি কোন পথে যেতে চান তা নির্ধারণ করতে আপনি এই বাবা-মাকে লগ করতে পারেন এবং এটিই সমস্ত বিভ্রান্তির মূল।


5

সমস্ত উত্তর ইতিমধ্যে বেশিরভাগ জিনিসকে কভার করেছে তবে আমি আমার 5 সেন্ট যোগ করব। সংক্ষেপে রূপান্তরিত করা মার্জ কমিটটি বেশ সহজ:

git revert -m 1 <commit-hash>

আপনার যদি অনুমতি থাকে তবে আপনি এটিকে সরাসরি "মাস্টার" শাখায় ঠেলাতে পারবেন অন্যথায় এটি আপনার "রিভার্ট" শাখায় চাপ দিন এবং টানুন অনুরোধ তৈরি করুন।

আপনি এই বিষয় সম্পর্কে আরও দরকারী তথ্য এখানে পেতে পারেন: https://itcodehub.blogspot.com/2019/06/how-to-revert- নিম-in-git.html


1

আমি দুটি শেষ পয়েন্টের মধ্যে একটি বিপরীত প্যাচ তৈরি করতে দেখেছি এবং সেই প্যাচটি কার্যকর হবে। এটি অনুমান করে যে আপনি আপনার মাস্টার ব্রাঞ্চের স্ন্যাপশট (ট্যাগ) তৈরি করেছেন বা আপনার মাস্টার ব্রাঞ্চের একটি ব্যাক আপও মাস্টার_বিকে_01012017 বলুন।

বলুন যে কোড শাখাটি আপনি মাস্টারে মার্জ করেছেন তা হ'ল মাইকোড্র্যাঞ্চ।

  1. চেকআউট মাস্টার।
  2. মাস্টার এবং আপনার ব্যাকআপের মধ্যে একটি সম্পূর্ণ বাইনারি রিভার্স প্যাচ তৈরি করুন। git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. আপনার প্যাচ পরীক্ষা করুন git apply --check myrevert.patch
  4. সাইন-অফ সহ প্যাচ প্রয়োগ করুন git am --signoff < myrevert.patch
  5. এটি ঠিক হয়ে গেলে আপনার যদি আবার এই কোডটি আনার দরকার হয় তবে আপনাকে পুনরায় উল্টানো মাস্টারটি বন্ধ করে ফিক্স শাখাটি পরীক্ষা করতে হবে git branch mycodebranch_fix git checkout mycodebranch_fix
  6. এখানে আপনাকে রিভার্টের জন্য SHA কীটি খুঁজে বের করতে হবে এবং রিভার্টটি ফিরতে হবে git revert [SHA]
  7. সমস্যাগুলি সমাধান করতে, প্রতিশ্রুতিবদ্ধ এবং একবার হয়ে গেলে মাস্টারটিতে পুনরায় মার্জ করতে আপনি এখন আপনার মাইকোডেবাঞ্চ_ফিক্স ব্যবহার করতে পারেন।

1

সঠিকভাবে চিহ্নিত উত্তরটি আমার পক্ষে কাজ করেছে তবে যা চলছে তা নির্ধারণ করতে আমাকে কিছুটা সময় ব্যয় করতে হয়েছিল .. সুতরাং আমি আমার মতো মামলার সহজ সরল পদক্ষেপের সাথে একটি উত্তর যুক্ত করার সিদ্ধান্ত নিয়েছি ..

বলুন যে আমরা A এবং B শাখা পেয়েছি .. আপনি শাখা A কে শাখা B তে মিশিয়ে দিয়েছেন এবং শাখা B কে নিজের দিকে ঠেলে দিয়েছেন তাই এখন মার্জটি এরই একটি অংশ .. তবে আপনি মার্জ হওয়ার আগে শেষ প্রতিশ্রুতিতে ফিরে যেতে চান .. কি করবেন তুমি কর?

  1. আপনার গিট রুট ফোল্ডারে যান (সাধারণত প্রকল্প ফোল্ডার) এবং ব্যবহার করুন git log
  2. আপনি সাম্প্রতিক কমিটের ইতিহাস দেখতে পাবেন - কমিটদের কমিট / লেখক / তারিখের বৈশিষ্ট্য রয়েছে যখন সংযুক্তিরও একত্রীকরণের সম্পত্তি রয়েছে - সুতরাং আপনি তাদের দেখতে পাবেন:

    commit: <commitHash> Merge: <parentHashA> <parentHashB> Author: <author> Date: <date>

  3. ব্যবহার করুন git log <parentHashA>এবং git log <parentHashB>- আপনি সেই মূল শাখাগুলির প্রতিশ্রুতিবদ্ধ ইতিহাস দেখতে পাবেন - তালিকার প্রথম কমিটগুলি সর্বশেষতম

  4. <commitHash>আপনি চান প্রতিশ্রুতিটি নিন , আপনার গিট রুট ফোল্ডারে যান এবং ব্যবহার করুন git checkout -b <newBranchName> <commitHash>- যা আপনি মার্জ করার আগে বেছে নিয়েছেন সেই শেষ প্রতিশ্রুতি থেকে শুরু করে একটি নতুন শাখা তৈরি করবে .. ভয়েলা, প্রস্তুত!


0

আমি পিআর-তেও এই সমস্যার মুখোমুখি হয়েছি যা গিটহাব রেপোর মাস্টার শাখায় একীভূত হয়েছে।

যেহেতু আমি শুধু কিছু পরিবর্তিত ফাইল পরিবর্তন করতে চেয়েছিলেন কিন্তু না পুরো পরিবর্তন জনসংযোগ আনবার পর আমি ছিল সঙ্গে ।amendmerge commitgit commit --am

পদক্ষেপ:

  1. আপনি যে শাখায় কিছু পরিবর্তন করতে চান তা পরিবর্তন / ফিরিয়ে আনতে চান সেই শাখায় যান
  2. পরিবর্তিত ফাইল অনুসারে আপনি যে পরিবর্তনগুলি চান তা করুন
  3. চালান git add *বাgit add <file>
  4. চালান git commit --amএবং বৈধতা দিন
  5. চালান git push -f

কেন এটি আকর্ষণীয়:

  • এটি PR এর লেখককে অপরিবর্তিত রাখতে প্রতিশ্রুতিবদ্ধ রাখে
  • এটি গিট গাছকে ভাঙে না
  • আপনাকে প্রতিশ্রুতিবদ্ধ হিসাবে চিহ্নিত করা হবে (মার্জ কমিট লেখক অপরিবর্তিত থাকবে)
  • গিট অ্যাক্ট যেমন আপনি বিরোধগুলি সমাধান করেছেন, এটি মোডিফাই করা ফাইলগুলিতে কোডটি সরিয়ে / পরিবর্তন করবে যেন আপনি ম্যানুয়ালি গিটহাবকে বলছেন যে সেটিকে যেমন মেশানো না হয়

0

এই লিঙ্কটি থেকে কীভাবে মার্জটি ফিরিয়ে আনতে হবে তার জন্য আমি ভাল ব্যাখ্যা পেয়েছি এবং আমি নীচের ব্যাখ্যাটি কপি করেছি এবং নীচের লিঙ্কটি যদি কাজ না করে তবে এটি কেবল সহায়ক।

কীভাবে একটি ত্রুটিযুক্ত মার্জ অ্যালান (alan@clueserver.org) ফিরিয়ে আনতে বলা হয়েছে:

আমার একটা মাস্টার শাখা আছে। আমাদের কিছু শাখা আছে যা কিছু বিকাশকারী কাজ করছে। তারা দাবি করে যে এটি প্রস্তুত। আমরা এটিকে মাস্টার শাখায় মার্জ করি। এটি কিছুটা ভেঙে যায় তাই আমরা মার্জটি ফিরিয়ে দিই। তারা কোড পরিবর্তন করে। তারা এটি এমন একটি জায়গায় পৌঁছে যায় যেখানে তারা বলে যে এটি ঠিক আছে এবং আমরা আবার একত্রিত হয়েছি। যখন পরীক্ষা করা হয়, আমরা দেখতে পেলাম যে রিভার্টের আগে করা কোড পরিবর্তনগুলি মাস্টার শাখায় নয়, তবে কোড মাস্টার ব্রাঞ্চে রয়েছে changes এবং এই পরিস্থিতি থেকে পুনরুদ্ধার করতে সহায়তা চেয়েছিলেন।

"একীভূতকরণের প্রত্যাবর্তন" এর পরপরই ইতিহাসটি এরকম দেখাবে:

---o---o---o---M---x---x---W
              /
      ---A---B

যেখানে A এবং B পার্শ্ব বিকাশে রয়েছে যা এতটা ভাল ছিল না, এম হ'ল মার্জ যা এই অকাল পরিবর্তনগুলিকে মূলরেখায় নিয়ে আসে, এক্স পার্শ্বের শাখা যা করেছিল এবং এরই মধ্যে মূল লাইনে তৈরি হয়েছিল তার সাথে সম্পর্কযুক্ত নয় এমন পরিবর্তনগুলি এবং ডব্লু হ'ল " মার্জ এম "" (ডাব্লু এমকে উল্টে দেখায় না?) ফেরত দিন re IOW, "diff W ^ .. W" "ডিফ -আরএম ^ .. এম" এর মতো।

মার্জ এর যেমন "রিভার্ট" এর সাথে তৈরি করা যেতে পারে:

it গিট রিভার্ট-এম 1 এম পার্শ্ব শাখার বিকাশকারীরা তাদের ভুলগুলি ঠিক করার পরে, ইতিহাসটি দেখতে পারে:

---o---o---o---M---x---x---W---x
              /
      ---A---B-------------------C---D

যেখানে সি এবং ডি এ এবং বি-তে কী ভাঙা হয়েছে তা ঠিক করতে পারে এবং ডাব্লু-র পরে আপনার ইতিমধ্যে মূল লাইনে কিছু অন্যান্য পরিবর্তন থাকতে পারে where

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

লিনাস পরিস্থিতি ব্যাখ্যা করে:

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

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

যেখানে Y ডাব্লু এর রিভার্ট হয় এই জাতীয় "রিভার্ট অফ রিভার্ট" এর সাথে এটি করা যেতে পারে:

it গিট রিভার্ট ডব্লিউ এই ইতিহাস (ডাব্লু এবং ডব্লু ডব্লু..ওয়াই যা পরিবর্তিত হয়েছিল তার মধ্যে সম্ভাব্য দ্বন্দ্বগুলি উপেক্ষা করে) ইতিহাসে ডাব্লু বা ওয়াই না থাকার সমতুল্য:

---o---o---o---M---x---x-------x----
              /
      ---A---B-------------------C---D

এবং পাশের শাখাটি আবার মার্জ করার ফলে পূর্ববর্তী প্রত্যর্পণ এবং প্রত্যাবর্তনের পূর্বে ফিরে আসা থেকে বিরোধ দেখা দেবে না।

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

অবশ্যই সি এবং ডিতে হওয়া পরিবর্তনগুলি এখনও কোনও এক্স দ্বারা করা হয়েছিল তার সাথে বিরোধ করতে পারে, তবে এটি কেবল একটি সাধারণ মার্জ সংঘাত।


-2

রায়ান যেমন উল্লেখ করেছেন, git revertরাস্তাটি মিশে যেতে সমস্যা তৈরি করতে পারে, তাই git revertআপনি যা চান তা নাও হতে পারে। আমি দেখতে পেয়েছি যে git reset --hard <commit-hash-prior-to-merge>কমান্ডটি এখানে আরও কার্যকর হতে পারে।

একবার আপনি হার্ড রিসেট অংশটি সম্পন্ন করার পরে, আপনি তারপরে রিমোট শাখায় জোর করতে পারেন git push -f <remote-name> <remote-branch-name>, যেখানে <remote-name>প্রায়শই নামকরণ করা হয় origin। সেই অবস্থান থেকে আপনি চাইলে পুনরায় মার্জ করতে পারেন।


4
জোর-চাপের সাথে জড়িত যে কোনও কিছুই কেবল রেপো ব্যবহার না করা অবধি খারাপ ধারণা এবং আপনি কী করছেন তা আপনি ঠিক জানেন। গিট রিভার্টের সাথে প্রত্যাবর্তন এবং তারপরে সম্ভবত গিট রিভার্টের সাথে রিভার্টকে ফিরিয়ে দেওয়া (যদি আপনাকে আবার জিনিস ফিরিয়ে আনার প্রয়োজন হয়) তবে এটি অনেক বেশি নিরাপদ বিকল্প।
oyvind
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.