গিট একীভূতকরণ রোলব্যাক করুন


224
develop branch
--> dashboard (working branch)

আমি যে git merge --no-ff developকোনও প্রবাহ পরিবর্তন ড্যাশবোর্ডে মার্জ করতে ব্যবহার করি

গিট লগ:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

এতে মার্জটির প্রায় 50+ কমিট রয়েছে এবং আমি ভাবছি যে কীভাবে মার্জটি কীভাবে ফিরিয়ে আনব ড্যাশবোর্ডটি রাজ্যের প্রাক-সংশ্লেষে ফিরে যায়

এর দ্বিতীয় অংশটি হ'ল, আমি যদি একত্রীকরণ না করি তবে আমি --no-ff' মার্জ শাখা' বিকাশ 'ড্যাশবোর্ডে ' বিকাশ করব না .. আমি কীভাবে সেই মার্জটিকে আবার রোল করব?


উত্তর:


319

একত্রিত হওয়া প্রতিশ্রুতি ফিরিয়ে দেওয়া সম্পূর্ণ প্রশ্নে সম্পূর্ণ প্রশ্নে আবৃত আপনি যখন দ্রুত-ফরোয়ার্ড মার্জ করেন, দ্বিতীয়টি আপনি বর্ণনা করেছেন, আপনি git resetআগের অবস্থায় ফিরে যেতে ব্যবহার করতে পারেন :

git reset --hard <commit_before_merge>

আপনি জানতে পারেন <commit_before_merge>সঙ্গে git reflog, git log, বা, আপনি Moxy বোধ করছি করেন (এবং সম্পন্ন অন্য কিছু না):git reset --hard HEAD@{1}


6
তাত্ক্ষণিক জবাবের জন্য ধন্যবাদ .. গিট লগের দিকে তাকানোর পরে, সংশ্লেষের আগে কমিট 50+ কমিট করার আগে প্রতিশ্রুতি ফিরে আসে, যেমন গিট মার্জটি বিকাশ করে অন্য সমস্ত কমেটগুলিতে রাখে। আমি অনুমান করি যে আমি যা পাই না তা হ'ল, যদি আমি না জানতাম / কোথায় যে মার্জটি ছিল - আমি এটি কীভাবে খুঁজে পাব? আপনি প্রতিশ্রুতি_পরে_চলাচলের সন্ধানের কথা উল্লেখ করেছেন .. আমার ধারণা আমি সেই অংশটি বুঝতে পারছি না
সিজিএমকেভার

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

1
হ্যাঁ, reflog'লাইফসেভার। HEAD@{1}কেবলমাত্র হেডের দ্বিতীয় সাম্প্রতিক অবস্থার বর্ণনা দেয় বা আরও প্রযুক্তিগতভাবে: "একটি রেফ অনুসরণ করা হয় প্রত্যেকে @ একটি ব্রেস জোড় (যেমন {1}, {15}) দ্বারা বদ্ধ অর্ডিনাল স্পেসিফিকেশন সহ প্রত্যয়টি অনুসরণ করে যা এর পূর্ব-পূর্ব মানটি নির্দিষ্ট করে সুত্র। "
ক্রিস্টোফার

4
রিমোটে ফিরতে ধাক্কা সম্পর্কে কী? কিভাবে কাজ করবে তা আমি দেখছি না।
আন্তন সেভলিয়েভ

2
এটি হতাশ। এটি মার্জ হওয়ার পরে সমস্ত কমিটি ধ্বংস করে।
aaa90210

151

এখান থেকে:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

গিট রিভার্ট একটি নতুন প্রতিশ্রুতি যুক্ত করে যা নির্দিষ্ট প্রতিশ্রুতি ফিরে দেয়।

-M 1 ব্যবহার করে এটি জানায় যে এটি একীভূত এবং আমরা মাস্টার শাখায় পিতামাতার প্রতিশ্রুতিতে ফিরে যেতে চাই। আপনি বিকাশকারী শাখাটি নির্দিষ্ট করতে -m 2 ব্যবহার করবেন।


30
নোট করুন যেহেতু আপনি এর পরে শাখাটি পুনরায় মার্জ করতে পারবেন না, যেমন ডকস বলেছেন: "মার্জ কমিট ফিরিয়ে দেওয়া আপনি ঘোষণা করেন যে আপনি কখনই মার্জ দ্বারা বৃক্ষের পরিবর্তন আনতে চান না a ফলস্বরূপ, পরে সংযুক্তিগুলি কেবল গাছের পরিবর্তন আনবে পূর্বে উল্লিখিত সংযুক্তির পূর্বপুরুষ নয় এমন কমিট দ্বারা This এটি আপনি যা চান তা হতে পারে বা নাও পারে not "
ডালিবোর কার্লোভিć

23
@ ডালিবোরকার্লোভিć উক্তিটি কিছুটা কঠোর। আপনি পরে অবশ্যই এই পরিবর্তনগুলি ফিরিয়ে আনতে পারেন, কৌশলটি রিভার্ট কমিটকে ফিরিয়ে আনতে হবে। "প্রত্যাবর্তন ফিরিয়ে দেওয়া" বিভাগে এখানে আরও তথ্য
হিলিকাস

3
দুঃখের বিষয়, here@ হিলিকাস মন্তব্যের লিঙ্কটি আর বৈধ নয়। সাইটটি দাবি করেছে যে বিষয়বস্তুটি কোনও বইতে স্থানান্তরিত হয়েছে ( git-scm.com/book/en/v2 ) তবে যদি তা হয় তবে এটি সেখানে খুঁজে পাওয়া তুচ্ছ নয়।
জেসি চিশলম

@ ডালিবোরকার্লোভিć কি এই ঘটনাটি @ ক্রিসটফার থেকে উপরের উত্তরটি প্রকাশ করে?
জেমস বি

3
পূর্বাবস্থায় ফেরানো একীকরণ সামগ্রীটি এখানে
SEK

27

কেবল মার্জ কমিটের সাথে পুনরায় সেট করুন git reset --hard HEAD^

যদি আপনি --no-ff গিট ব্যবহার করেন তবে সর্বদা একটি মার্জ তৈরি করে, এমনকি যদি আপনি এর মধ্যে কিছু না করেন। --No-ff গিট ছাড়াই কেবল দ্রুত এগিয়ে যাবে, যার অর্থ আপনার শাখাগুলি হেড মার্জড শাখার হেডকে সেট করা হবে। এটি সমাধান করতে আপনি যে প্রতিশ্রুতি-আইডিটি চান তাতে ফিরে যেতে চান git reset --hard $COMMITID


1
মার্জ করার আগে কমিট না জানলে ভাল সমাধান।
iglesiasedd

আমি প্রতিশ্রুতিবদ্ধ আইডিটি জানি না বলে আমার জন্য কাজ করেছিল + + 1
অনন্ত সিং --- 19:58

যদি অবাঞ্ছিত মার্জটি ইতিমধ্যে দূরবর্তীটিতে প্রতিশ্রুতিবদ্ধ ছিল তবে আমি গিটার পুশ-এফ ব্যবহার করে রিমোট করার পরে রিমোট শাখা আপডেট করতে।
জুমেক

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

তবে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হতে পারে। Git-scm.com/docs/git-revers এ--mainline parent-number বিকল্পটি দেখুন

সম্ভবত একটি জঘন্য কিন্তু কার্যকর উপায় হ'ল সেই প্রতিশ্রুতিটির বাম পিতামাতার পরীক্ষা করা, সমস্ত ফাইলের একটি অনুলিপি তৈরি করা, HEADআবার চেকআউট করা এবং পুরানো ফাইলগুলির সাথে সমস্ত বিষয়বস্তু প্রতিস্থাপন করা। তারপরে গিট আপনাকে জানাবে যে কী ঘূর্ণায়মান হচ্ছে এবং আপনি নিজের রিভার্ট কমিট তৈরি করেন :)!


1
+1 কারণ এই উত্তরটি ইতিহাসের সাথে রিসেটের মতো বিশৃঙ্খলা সৃষ্টি করে না (যদি আপনি ইতিমধ্যে দূরবর্তী স্থানে চলে যান তবে সত্যিই গুরুত্বপূর্ণ) তবে আমার কী অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া আশা করা উচিত?
পেড্রোম্যানোয়েল

3
এটি কি আপনি উল্লেখ করেছেন সেই পার্শ্ব-প্রতিক্রিয়া? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel

1
আপনি বলেছেন git resetসমাধানটি, তবে এটিরও উল্লেখ করুন যে এটির অপ্রত্যাশিত পার্শ্ব-প্রতিক্রিয়াও থাকতে পারে। তবে, সেই লিঙ্কটি :) এর git revertনয়, git reset:)
মার্ক

2
দয়া করে মনে রাখবেন, গিট রিসেটে একটি-এম পতাকা নেই। এছাড়াও মনে রাখবেন @ জর্জিআরপিনেল গিট-রিভার্ট ডক্সকে উল্লেখ করেছেন, গিট-রিসেট নয়। আমি মনে করি তিনি git revertনা বলতে চেয়েছিলেনgit reset
ডেভিন গ্লিসন ল্যামবার্ট

কীভাবে মেইনলাইন এড়ানো যায় তা নির্দিষ্ট করা হয়েছিল তবে 1234xyz কমিট করা কোনও মার্জ ত্রুটি নয়।
আচল

0

আপনি যদি শাখাটি মার্জ করে ফেলেছেন তবে একটি টানা অনুরোধটি ব্যবহার করে মার্জটি ফিরিয়ে আনুন এবং প্রত্যাবর্তনের অনুরোধ অনুরোধটি মার্জ করে।

আমার সবচেয়ে সহজ উপায়টি হ'ল:

  1. বিকাশ / মাস্টার থেকে একটি নতুন শাখা বের করুন (যেখানে আপনি একীভূত হয়েছিলেন)
  2. "রিভার্ট" ব্যবহার করে git revert -m 1 xxxxxx(যদি রিভার্টটি কোনও শাখা ব্যবহার করে মার্জ করা হত) বা ব্যবহার করে ফিরে আসুনgit revert xxxxxx এটি একটি সরল প্রত্যাবর্তন ছিল তা ফেরান
  3. নতুন শাখায় এখন পরিবর্তনগুলি হওয়া উচিত যা আপনি আবার মার্জ করতে চান।
  4. পরিবর্তন করুন বা এই শাখাকে বিকাশ / মাস্টার করতে মার্জ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.