গিট ইতিহাসের কোনও নির্দিষ্ট সংশোধন আপনি কীভাবে সরিয়ে ফেলবেন?


213

মনে করুন আপনার গিট ইতিহাসটি এরকম দেখাচ্ছে:

1 2 3 4 5

1-5 পৃথক সংশোধন। 1, 2, 4 এবং 5 রাখার সময় আপনার 3 টি সরিয়ে ফেলতে হবে এটি কীভাবে করা যায়?

মুছে ফেলার পরে যখন কয়েকশ সংশোধনী রয়েছে তখন কি কোনও কার্যকর পদ্ধতি আছে?


এই প্রশ্নটি সংজ্ঞায়িত। এটি স্পষ্টভাবে বলা যায় না যে লেখক 1-2- (3 + 4) -5 বা 1-2-4-5-5 চান
রেন্ডিটেক

14
ঠিক আট বছর পরে, আমি ঠিক কী সমস্যাটি সমাধান করার চেষ্টা করছিলাম তা বলতে পারছি না। তবে গিটের মধ্যে সবসময় কিছু করার জন্য অনেকগুলি উপায় রয়েছে এবং বিভিন্ন লোকেরা পছন্দ করেছে এমন অনেক উত্তর রয়েছে, তাই আমি অনুমান করি অস্পষ্টতা খুব বেশি লোককে অনেক
1800 তথ্য

1
git rebase --onto 2 3 HEADপ্রায় 3 থেকে
হেডের মধ্য দিয়ে কমিটের সাথে

উত্তর:


76

3 এবং 4 সংশোধনকে একক সংশোধনীতে একত্রিত করতে, আপনি গিট রিবেস ব্যবহার করতে পারেন। আপনি যদি রিভিশন 3 এর পরিবর্তনগুলি সরাতে চান, আপনাকে ইন্টারেক্টিভ রিবেস মোডে সম্পাদনা কমান্ডটি ব্যবহার করতে হবে। যদি আপনি পরিবর্তনগুলি একক সংশোধনীতে একত্রিত করতে চান তবে স্কোয়াশ ব্যবহার করুন।

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

থেকে Git ডকুমেন্টেশন :

আপনি যেমনটি বজায় রাখতে চান সেই পুরানো প্রতিশ্রুতি দিয়ে এটি শুরু করুন:

git rebase -i <after-this-commit>

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

এই প্রতিশ্রুতিবদ্ধতার অন লাইন
পরের প্রতিশ্রুতিটির অন লাইন ফাএএএফ 1 বেছে নিন
...

অনলাইন বর্ণনা সম্পূর্ণরূপে আপনার সন্তুষ্টির জন্য; গিট-রিবেস এগুলি দেখতে পাবে না তবে প্রতিশ্রুতিবদ্ধ নামগুলিতে ("উদাহরণস্বরূপ" ডেডবি "এবং" এফ 1 এএফ 1 "), সুতরাং নামগুলি মুছুন বা সম্পাদনা করবেন না।

কমান্ড "পিক" কমান্ডটি "সম্পাদনা" দিয়ে প্রতিস্থাপন করে আপনি গিট-রিবেসকে সেই প্রতিশ্রুতি প্রয়োগের পরে থামতে বলতে পারেন, যাতে আপনি ফাইলগুলি এবং / অথবা প্রতিশ্রুতি বার্তা সম্পাদনা করতে পারেন, প্রতিশ্রুতি সংশোধন করতে পারেন এবং রিবাজ চালিয়ে যেতে পারেন।

আপনি যদি দুটি বা আরও কমিটিকে একটিতে ভাঁজ করতে চান তবে দ্বিতীয় এবং পরবর্তী কমিটের জন্য "স্কোয়াশ" দিয়ে "পিক" কমান্ডটি প্রতিস্থাপন করুন। যদি কমিটগুলির বিভিন্ন লেখক থাকে তবে এটি প্রথম কমিটের লেখকের কাছে স্কোয়াশড কমিটকে দায়ী করবে।


42
-1 প্রশ্নটি ভালভাবে সংজ্ঞায়িত করা হয়েছে তবে এই উত্তরটি এত পরিষ্কার নয়। সঠিক সমাধান কী তা লেখক বলেন নি।
আলেকসান্দ্র লেভুকুক

1
এটি একটি ভুল নেতৃত্ব। স্প্লিটিং কমিটি বিভাগটি সঠিক নয়। আপনি ম্যানুয়ালটিতে অনেক বেশি পড়তে চান - @ রেয়ারেস ভার্নিকার উত্তর দেখুন।
আলেকসান্দ্র লেভুকুক

1
@ আলেকসান্দ্রল্যাভুকুক প্রশ্নটি সঠিকভাবে সংজ্ঞায়িত নয়: প্রশ্নটি যেভাবে বলা হয়েছে তাতে 3 থেকে পরিবর্তনটি রাখা হবে বা বাতিল করা হবে কিনা তা পরিষ্কার নয় uncle আমি সম্মত হবো যে যদি পরিবর্তনগুলি বাতিল করতে হয় তবে অন্যান্য উত্তরগুলি আরও সহজ পদ্ধতির প্রস্তাব দেয়। পরিবর্তনগুলি যদি রাখতে হয় তবে এটি সম্পূর্ণরূপে অঙ্গরাগ অপারেশন হবে। উভয় পদ্ধতির ইতিহাস পুনর্লিখনের পদ্ধতিগুলি বিপজ্জনক যদি অন্যদের ত্রুটিযুক্ত ইতিহাসের শীর্ষে ভিত্তিক কাজ থাকতে পারে; যদি এটি হয় তবে কসমেটিক ক্লিনআপ করা উচিত নয় এবং পরিবর্তন মুছে ফেলা গিট রিভার্টের মাধ্যমে আরও ভাল করা যেতে পারে।
থিওডোর মুরডক

124

প্রতি এই মন্তব্যটি (এবং আমি চেক করে এই সত্য), rado এর উত্তর খুব ঘনিষ্ঠ কিন্তু পাতার একটি বিচ্ছিন্ন মাথা রাজ্যের Git। পরিবর্তে, আপনি যে শাখায় HEADরয়েছেন তা <commit-id>থেকে সরানোর জন্য এটি সরান এবং ব্যবহার করুন:

git rebase --onto <commit-id>^ <commit-id>

1
আপনি যদি আমাকে কেবল কমিট-আইডির ভিত্তিতে সেই কমিট-আইডিটিকে ইতিহাস থেকে সরিয়ে ফেলতে পারেন তবে আপনি আমার নায়ক হতে পারেন be
kayleeFrye_onDeck

আপনি দয়া করে জাদু আদেশটি উত্তরের মধ্যে কী ব্যাখ্যা ব্যাখ্যা করতে পারেন? অর্থাৎ প্রতিটি প্যারামিটারটি কী বোঝায়?
অ্যালেক্সানড্রয়েড

এটি দুর্দান্ত কিন্তু আমি যদি ইতিহাসের প্রথম প্রতিশ্রুতি সরিয়ে নিতে চাই তবে কী হবে? (এই কারণেই আমি এখানে এসেছি: পি)
স্টার্লিং ক্যামডেন

2
কিছু কারণে, যখন আমি এটি চালাই তখন কিছুই হয় না। যাইহোক, পরিবর্তন ^করার জন্য ~1এটা কাজ করেছে।
অ্যান্টিমনি

দেরি হয়ে গেছে, তবে আমি যুক্ত করতে যাচ্ছি যদি আপনি মার্জ সংঘাতগুলির মধ্যে চলে যান তবে রিবেসটি বাতিল করুন এবং তারপরে এটিকে আবার পুনরায় চালু --strategy-option theirsকরুন।
লাস্টস্টার 7007

122

অ-ইন্টারেক্টিভভাবে নির্দিষ্টটি সরিয়ে ফেলার এখানে একটি উপায় যা <commit-id>কেবল <commit-id>আপনি মুছে ফেলতে চান তা জেনে :

git rebase --onto <commit-id>^ <commit-id> HEAD

2
আমার জন্যও কাজ করেছেন। বিটিডব্লিউ, ^ অপারেটর কী করে? এর অর্থ কি নির্দিষ্টটির পরে পরবর্তী প্রতিশ্রুতি?
হোপিয়া

3
@ হপিয়া এর অর্থ নির্দিষ্ট কমিটের পিতামাতা (প্রথম)। "গিট সহায়তা সংশোধনগুলি" দেখুন
এমিল স্টায়ার্ক

12
HEADবিচ্ছিন্ন মাথা যাতে এড়াতে পারে তার উত্তরে @ কারিমের সুপারিশটি দেখুন ।
mklement0

1
কতগুলি অনুসন্ধানে ফিরে আসে তা নির্ধারণের চেয়ে অনেক সহজ।
ডানা উডম্যান

1
এটি দুর্দান্ত কিন্তু আমি যদি ইতিহাসের প্রথম প্রতিশ্রুতি সরিয়ে নিতে চাই তবে কী হবে? (এই কারণেই আমি এখানে এসেছি: পি)
স্টার্লিং ক্যামডেন

76

গিট-রিবেসের আগে উল্লিখিত (1) আপনার বন্ধু। কমিটগুলি আপনার masterশাখায় রয়েছে তা ধরে নিলে আপনি এটি করবেন:

git rebase --onto master~3 master~2 master

আগে:

1---2---3---4---5  master

পরে:

1---2---4'---5' master

গিট-রিবেস থেকে (1):

পুনর্বাসনের মাধ্যমে অনেকগুলি কমিটসও সরানো যেতে পারে। আমাদের যদি নিম্নলিখিত পরিস্থিতি থাকে:

E---F---G---H---I---J  topicA

তারপর আদেশ

git rebase --onto topicA~5 topicA~3 topicA

ফলশ্রুতিতে F এবং G অপসারণের ফলস্বরূপ:

E---H'---I'---J'  topicA

এটি দরকারী যদি F এবং G কোনওভাবে ত্রুটিযুক্ত ছিল বা বিষয় A এর অংশ না হওয়া উচিত। নোট করুন - আন্টো এবং প্যারামিটারের যুক্তি কোনও বৈধ কমিট-ইশ হতে পারে।


3
এই হওয়া উচিত নয় --onto master~3 master~1?
ম্যাথিয়াস

3
আপনি যদি কেবল সর্বশেষ প্রতিশ্রুতি মুছতে চান তবে এটি
মাইকহস

আমি এই পদক্ষেপটি বহন করতে চাই তবে আমি MERGE CONFLICTত্রুটি পেয়েছি আমি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 2938301/ রেমোভ - স্পেসিফিক- কমিটে উল্লিখিত দৃশ্যের ব্যবহার করেছি এবং উদাহরণটিতে ২ য় প্রতিশ্রুতি অপসারণ করতে অক্ষম।
maan81

22

আপনি যা করতে চান তা যদি 3 সংস্করণে করা পরিবর্তনগুলি সরিয়ে ফেলা হয় তবে আপনি গিট রিভার্টটি ব্যবহার করতে পারেন।

গিট রিভার্ট সহজেই এমন পরিবর্তনগুলির সাথে একটি নতুন সংশোধন তৈরি করে যা আপনি পুনর্বিবেচনা করছেন যা পরিবর্তনগুলির সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনবে।

এর অর্থ হ'ল আপনি হ'ল অবাঞ্ছিত প্রতিশ্রুতি, এবং প্রতিশ্রুতিবদ্ধ যা এই পরিবর্তনগুলি সরিয়ে দেয় both

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


4
দুর্ভাগ্যক্রমে আমার পক্ষে ভাল সমাধান নয় কারণ কেউ দুর্ঘটনাক্রমে রেপোতে 100MB বোকা চাপিয়ে দিয়েছিল, আকারটি ফুটিয়ে তুলেছিল এবং ওয়েব ইন্টারফেসটিকে স্বচ্ছল করে তোলে।
স্টিফেন স্মিথ

18

এখনও পর্যন্ত সমস্ত উত্তর পিছনের উদ্বেগের সমাধান করে না:

মুছে ফেলার পরে যখন কয়েকশ সংশোধনী রয়েছে তখন কি কোনও কার্যকর পদ্ধতি আছে?

পদক্ষেপগুলি অনুসরণ করে তবে রেফারেন্সের জন্য আসুন নিম্নলিখিত ইতিহাসটি ধরে নিই:

[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]

সি : অপসারণের প্রতিশ্রুতি অনুসরণ করার পরেই প্রতিশ্রুতিবদ্ধ (পরিষ্কার)

আর : প্রতিশ্রুতি অপসারণ করা হবে

বি : প্রতিশ্রুতি অপসারণের পূর্বে কেবল প্রতিশ্রুতিবদ্ধ (বেস)

"শত শত সংশোধনী" সীমাবদ্ধতার কারণে আমি নিম্নলিখিত প্রাক-শর্তগুলি ধরে নিচ্ছি:

  1. কিছু বিব্রতকর প্রতিশ্রুতি আছে যে আপনি চান কখনও অস্তিত্ব
  2. জেরো পরবর্তী প্রতিশ্রুতিগুলি রয়েছে যা প্রকৃতপক্ষে সেই শ্বাসকষ্টের উপর নির্ভর করে (প্রত্যাবর্তনের ক্ষেত্রে শূন্য দ্বন্দ্ব)
  3. আপনার মনে হয় না যে শত শত হস্তক্ষেপকারী কমিটির "প্রতিশ্রুতিবদ্ধ" হিসাবে আপনাকে তালিকাবদ্ধ করা হবে ('লেখক' সংরক্ষণ করা হবে)
  4. আপনি কখনও সংগ্রহস্থল ভাগ করেন নি
    • অথবা আপনার সমস্ত ইতিহাসের উপরে সত্যিকারের যথেষ্ট প্রভাব রয়েছে যারা কখনও কখনও ইতিহাসকে ক্লোন করেছেন যে তাদের প্রতিশ্রুতি দিয়েছিলেন যে তারা আপনার নতুন ইতিহাস ব্যবহার করতে রাজি হয়েছে
    • এবং আপনি ইতিহাস পুনরায় লেখার বিষয়ে চিন্তা করেন না

এটি সীমাবদ্ধতার একটি দুর্দান্ত নিয়ন্ত্রক সেট, তবে একটি আকর্ষণীয় উত্তর রয়েছে যা এই কোণার ক্ষেত্রে আসলে কাজ করে।

পদক্ষেপগুলি এখানে:

  1. git branch base B
  2. git branch remove-me R
  3. git branch save
  4. git rebase --preserve-merges --onto base remove-me

যদি সত্যিকার অর্থে কোনও দ্বন্দ্ব না থাকে, তবে এটি আর বাধা ছাড়াই এগিয়ে চলবে। যদি কোন্দল হয়, আপনি সেগুলি সমাধান করতে পারেন এবং rebase --continueবা কেবল বিব্রতকর জীবন যাপন করার সিদ্ধান্ত নিতে পারেন এবংrebase --abort

এখন আপনি থাকা উচিত masterআর কমিট আছে আর তাতে। দ্যsaveআপনি যখন পুনর্মিলন করতে চান শাখাটি আপনি কোথায় ছিলেন সেদিকে ইঙ্গিত করে।

আপনি কীভাবে আপনার নতুন ইতিহাসে অন্যের স্থানান্তর স্থানান্তর করতে চান তা আপনার উপর নির্ভর করে। আপনি সঙ্গে পরিচিত করা প্রয়োজন হবে stash, reset --hardএবং cherry-pick। আর তুমি মুছে দিতে পারেন base, remove-meএবং saveশাখা


আমি কীভাবে এটি 150000 বার পছন্দ করতে পারি?
জেনা মরোজ

আমার পক্ষে এমন একটি শাখার ইতিহাসের মাঝামাঝি থেকে ক্রমানুসারে 3 টি কমিট অপসারণ করার জন্য কাজ করেছিল যেখানে কেউ 150 এমএমবি ফাইল ফাইল করে।
মার্কোস

3

আমিও একই পরিস্থিতিতে অবতরণ করেছি। নীচের কমান্ডটি ব্যবহার করে ইন্টারেক্টিভ রিবেস ব্যবহার করুন এবং নির্বাচন করার সময় 3 য় কমিট ড্রপ করুন।

git rebase -i remote/branch

2

সুতরাং এখানে আমি যে দৃশ্যের মুখোমুখি হয়েছিলাম এবং কীভাবে আমি এটি সমাধান করেছি is

[branch-a]

[Hundreds of commits] -> [R] -> [I]

এখানে Rযে প্রতিশ্রুতি আমার অপসারণের প্রয়োজন হয়েছিল তা এখানে রয়েছে এবং Iএটি একটি একক প্রতিশ্রুতি পরে এসেছিলR

আমি রিভার্ট কমিট করেছি এবং তাদের একসাথে স্কোয়াশ করেছি

git revert [commit id of R]
git rebase -i HEAD~3

ইন্টারেক্টিভ রিবেস স্কোয়াশের সময় শেষ 2 টি কমিট করে।


0

রডো এবং কেরেমের উত্তরগুলি আমার জন্য কিছুই করে না (কেবলমাত্র "বর্তমান শাখাটি আপ টু ডেট" "প্রদর্শিত হবে) message সম্ভবত এটি ঘটে কারণ উইন্ডোজ কনসোলে 'symbol' চিহ্নটি কাজ করে না। তবে এই মন্তব্য অনুসারে '^' এর পরিবর্তে '~ 1' সমস্যার সমাধান করে by

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