গিট মুছে ফেলুন ইতিহাস থেকে মার্জ কমিট


99

আমার গিট ইতিহাস এর মতো দেখাচ্ছে:

গিট ইতিহাস

আমি বেগুনি একক একটিতে স্কোয়াশ করতে চাই। আমি আমার প্রতিশ্রুতিবদ্ধ লগে তাদের আর কখনও দেখতে চাই না।

আমি একটি করার চেষ্টা করেছি git rebase -i 1, তবে যদিও 1এটি নীল শাখায় রয়েছে (সিএফ। চিত্র), আমি এখনও আমার বেগুনি শাখায় প্রতি প্রতিশ্রুতি দেখছি।

আমি কীভাবে বেগুনি শাখাটি সম্পূর্ণভাবে সরিয়ে ফেলতে পারি (কমিট লগ থেকে)?


আপনার রেপো এমন কোনও জায়গায় ঠেলাঠেলি করা হয়েছে যা অন্য লোকেরা এটিকে এড়িয়ে চলেছে?
শ্লেইস

উভয় শাখা খাঁটি স্থানীয়।
বেনিয়ামিন তোয়েগ

উত্তর:


101

না git rebase -i <sha before the branches diverged>এই আপনার মার্জটিকে সরিয়ে অনুমতি দেবে কমিট এবং আপনি চেয়েছিলেন লগ এক একক লাইন হবে। আপনি যে কোনও কমিটকে আর চাইবেন না তা মুছতে পারেন। আপনার রিবেসে কাজ না করার কারণটি হ'ল আপনি যথেষ্ট পিছনে যাচ্ছেন না।

সতর্কতা: আপনি ইতিহাসটি পুনর্লিখন করছেন। দূরবর্তী রেপোতে চাপ দেওয়া পরিবর্তনগুলি দিয়ে এটি করার ফলে সমস্যার সৃষ্টি হবে। আমি কেবল স্থানীয় কমিটগুলি দিয়ে এটি করার পরামর্শ দিই।



4
হ্যাঁ, তারপরে আপনি git rebaseএটিকে এডিট করে মুছে ফেলুন এবং সেগুলি মুছে ফেলা হবে।
শ্লেইস

4
কমিটগুলি মোছার ফলে মার্জটির সমস্ত পরিবর্তন হারাতে পারা যায়। তবে আমি একটি সফট রিসেট করেছি এবং আমি যেমন চাইছিলাম তেমন কিছু করতে সক্ষম হয়েছি (ক্রম প্রাথমিক প্রত্যাশার সাথে মেলে না)।
বেনজামিন তোয়েগ

4
এই উত্তরটি বিশদে অসম্পূর্ণ, আপনি কোন শাখা থেকে রিবেসটি শুরু করবেন?
17-18

4
মোটামুটি নিশ্চিত যে আপনি কমিটগুলি 'অপসারণ' করতে চান না। 'অপসারণ' রিবেসে কোনও বিকল্প নয়, তবে মুছে ফেলা হয়। যদি আপনি কোন প্রতিশ্রুতি মুছে ফেলেন তবে আপনি এটি পরিবর্তনটি শিথিল করবেন loose আপনি কমিটগুলি স্কোয়াশ করতে চান।
thecoshman

71

মূল অবস্থায় রেপো দিয়ে শুরু করা

মূল রেপো ইতিহাস

একত্রিত করার জন্য এবং একত্রীকরণের শাখাকে মুখ্য লাইনে মুছে ফেলার জন্য merge

স্কোয়াশেড কমিট করে, কোনও মার্জ কমিট নয়

এই আদেশগুলি ব্যবহার করুন (5 এবং 1 এর পরিবর্তে সংশ্লিষ্ট কমিটের এসএইচএগুলি সহ):

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

একীভূত প্রতিশ্রুতি ধরে রাখতে তবে স্কোয়াশ একটিতে কমিট করে:

স্কোয়াশেড কমিট করে, ধরে রাখার মার্জ কমিট

এই আদেশগুলি ব্যবহার করুন (সংশ্লিষ্ট কমিটের এসএইচএগুলির সাথে 5, 1 এবং সি প্রতিস্থাপন):

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

মার্জ কমিট অপসারণ এবং শাখা থেকে পৃথক কমিটের সাথে এটি প্রতিস্থাপন করতে

শাখাটি মূল লাইনে স্থানান্তরিত হয়েছে, কোনও মার্জ কমিট নয়

শুধু করুন (5 টি প্রতিস্থাপিত সম্পর্কিত কমিটের এসএইচএ সহ):

git rebase 5 master

এবং পরিশেষে, পুরোপুরি শাখা অপসারণ করতে

শাখা পুরোপুরি সরানো হয়েছে

এই কমান্ডটি ব্যবহার করুন (সি ও ডি এর পরিবর্তে সংশ্লিষ্ট কমিটের এসএইচএগুলি দিয়ে):

git rebase --onto C D~ master

মধ্যে git rebase 5 masterমামলা, কেন এটা নয় "এবিসি 1 2 3 4 5 ডি ..." অর্ডার?
রায়

4
এই কমান্ডটি সেই কমিটগুলি গ্রহণ করে যাগুলির masterসাথে সামঞ্জস্য নেই 5এবং তাদের উপরে টুকরো টুকরো করে 5। প্রতিশ্রুতিবদ্ধতা Cবংশের অংশ নয় 5, এটি প্রথম দিকে স্থানান্তরিত 5
অ্যালেন Luce

4
আপনি যদি "এবিসি 1 2 3 4 5 ডি ..." দিয়ে শেষ করতে চান তবে আপনি এটি করতে পারেন:git rebase C 5; git rebase 5 master
অ্যালেন লুইস

19

কেবল একটি মার্জ কমিট সরিয়ে ফেলতে

আপনি যা করতে চান তা যদি কোনও মার্জ কমিট (২) মুছে ফেলা হয় যাতে এটি কখনও ঘটেছিল না, কমান্ডটি কেবল নিম্নরূপ

git rebase --onto <sha of 1> <sha of 2> <blue branch>

এবং এখন বেগুনি রঙের শাখাটি নীল রঙের কমিট লগে নেই এবং আপনার আবার দুটি পৃথক শাখা রয়েছে। তারপরে আপনি বেগুনিটিকে স্বাধীনভাবে স্কোয়াশ করতে পারেন এবং মার্জ কমিট না করে আপনি যা চান তা করতে পারেন commit


4
সমস্ত উত্তরগুলির মধ্যে, আমি এটি সবচেয়ে সোজা এবং করণীয় উভয়ই খুঁজে পাই। ধন্যবাদ.
রোশাম্বো

16

আপনি যা চান তার উপর ভিত্তি করে এটিকে মোকাবেলা করার দুটি উপায় রয়েছে:

সমাধান 1 : ইতিহাস সংরক্ষণ করে বেগুনি কমিটগুলি সরান (যদি আপনি ফিরে যেতে চান তবে)

git revert -m 1 <SHA of merge>

-m 1 কোন পিতামাতার লাইনটি বেছে নিতে হবে তা নির্দিষ্ট করে

বেগুনি কমিটগুলি এখনও ইতিহাসে থাকবে তবে আপনি যেহেতু উল্টে গেছেন, আপনি সেই কমিটগুলি থেকে কোড দেখতে পাবেন না।


সমাধান 2 : বেগুনি কমিটগুলি সম্পূর্ণরূপে সরান (রেপো ভাগ করা থাকলে বিঘ্নিত পরিবর্তন)

git rebase -i <SHA before branching out>

এবং বেগুনি কমিটের সাথে সম্পর্কিত (লাইনগুলি সরান) মুছুন।

মার্জ করার পরে কমিট না করা থাকলে এটি কম জটিল হবে। অতিরিক্ত কমিটগুলি দ্বন্দ্ব হওয়ার সম্ভাবনা বাড়িয়ে তোলে revert/rebase


এটি ঠিক শোনাচ্ছে না। মূল পোস্টারটি বেগুনিদের সাথে প্রথমে যা করতে চেয়েছিল তা প্রথমে বলতে চাইলে এই বিষয়টিকে বাদ দেওয়া আপনি যদি মার্জটি ফিরিয়ে দেন তবে এটি ঠিক আছে, এটি সেই প্রতিশ্রুতি থেকে পরিবর্তনগুলির বিপরীত প্যাচ করবে এবং এটি হিসাবে যুক্ত করবে আরেকটি অঙ্গীকার, বেগুনিটি বাতিল করে। এটা মত 1 - 1 = 0। তবে যদি আপনি তখন বেগুনি কমিটগুলি রিবাজ করেন তবে আপনি উল্টানো প্যাচটি পিছনে রেখে যান, যদি না আপনি এটিও পুনরায় প্রত্যাখ্যান করেন। আপনি যদি তা না করেন তবে এটি -1আপনার ইতিহাসে প্রয়োগ করার মতো , না 0, তাই আপনি যে পরিবর্তনগুলি চান না তা পিছনে রেখে দেবেন।

@ ক্যাপকেক, সরবরাহিত দুটি পৃথক উত্তর ছিল। আমি কম বিভ্রান্তির জন্য উত্তরটি সংশোধন করেছি: পি
প্রিম

আফাইক এটি ওপি যা চাইছে তা নয়। তিনি পরিবর্তনগুলি রাখতে চান, তবে লগ থেকে শব্দটি সরিয়ে ফেলুন। তার জন্য, তাকে কমিটস ডাউন স্কোয়াশ করা দরকার, মোছা পরিবর্তনগুলি মুছে ফেলবে।
thecoshman

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