আমার কাছে এক জোড়া কমিট রয়েছে যা সত্যই এক হওয়া উচিত be আমি যদি গিট ব্যবহার করতাম তবে আমি ব্যবহার করতাম:
git rebase -i <some-commit-before>
এবং তারপর তাদের স্কোয়াশ।
আমি কি পারফরম্যান্সে এটি করতে পারি? যদি তাই হয়, কিভাবে?
আমার কাছে এক জোড়া কমিট রয়েছে যা সত্যই এক হওয়া উচিত be আমি যদি গিট ব্যবহার করতাম তবে আমি ব্যবহার করতাম:
git rebase -i <some-commit-before>
এবং তারপর তাদের স্কোয়াশ।
আমি কি পারফরম্যান্সে এটি করতে পারি? যদি তাই হয়, কিভাবে?
উত্তর:
হ্যাঁ, আপনি কনসেটেটিং চেঞ্জসেট দ্বারা কোনও এক্সটেনশন ছাড়াই মার্চিয়রাল ব্যবহার করে এটি করতে পারেন ।
পর্যায়ক্রমে আপনি যদি কোনও এক্সটেনশন ব্যবহার করতে চান তবে আপনি ব্যবহার করতে পারেন:
আমার প্রিয় hg strip --keep
কমান্ড। এবং তারপরে আমি একটি প্রতিশ্রুতিতে সমস্ত পরিবর্তন করি।
এটি আমার পক্ষে দ্রুততম এবং স্বাচ্ছন্দ্যময় উপায়, কারণ আমি আমার প্রতিদিনের কাজের সময় অনেকগুলি ছোট ছোট কমিট করতে পছন্দ করি;)
নোট 1: সক্ষম করতে strip
একটি অন্তর্নির্মিত এক্সটেনশান mq
প্রয়োজন।
দ্রষ্টব্য 2: আমার প্রিয় গিট / মারকুরিয়াল ক্লায়েন্ট (স্মার্টজিট / এইচজি) --keep
সময়কালে ডিফল্ট প্যারামিটার দ্বারা সংযোজন হয় strip
। এবং আরও বেশি সুবিধাজনক কি: এটি বিকল্প বলা হয় join commits
:]
hg strip --keep --rev [rev]
কোথায়rev
--rev
hg strip --keep [rev]
hg help strip
দেয় hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, এবং বাদ দেওয়া সংশোধন আমাকে দেয় abort: empty revision set
।
hg strip
করা সেরা ধারণা নয়। এটি ঠিক নিরাপদ নয়। চেষ্টা করুন hg histedit
, সম্ভবত বিবর্তিত এক্সটেনশনটি ব্যবহার করে দেখুন।
রি-বেসের ফলে এক্সটেনশন একটি যাদুমন্ত্র মত কাজ করেন। স্কোয়াশ করতে 2 কমিট করে:
$ hg rebase --dest .~2 --base . --collapse
বর্তমান সংশোধনের জন্য ডট হ'ল একটি শর্টকাট।
এটি আরও সহজ যখন আপনার একটি শাখায় কয়েকটি কমিট থাকে এবং সেগুলি একটিতে ভাগ করতে চান:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
এটি কীভাবে কাজ করে:
( http://mercurial-scm.org/wiki/RebaseExistance# কলাপসিং থেকে )
আপনি যদি এই উত্তরটি পড়ছেন তবে আপনি এই উত্তরে বর্ণিত প্রতিটি বিকল্প ভুলে যেতে পারেন এবং বিবর্তিত এক্সটেনশন
fold
থেকে আদেশটি ব্যবহার করতে পারেন ।
evolve
মার্উরিয়ালের একটি এক্সটেনশন যা নিরাপদ পরিবর্তনযোগ্য ইতিহাস রাখতে আমাদের সহায়তা করে, যদিও এটি এখনও পরীক্ষামূলক। আপনি এটির রেপো থেকে এটি ক্লোন করে এবং আপনার .hgrc এ এটি যুক্ত করে ব্যবহার করতে পারেন ।
[extensions]
evolve = ~/evolve/hgext/evolve.py
ধরে নিচ্ছেন যে আপনি নিজের হোম ডিরেক্টরিতে রেপো ক্লোপ করেছেন। এখন আপনি যেতে ভাল। আপনি সাহায্যের সন্ধানও করতে পারেন hg help fold
।
আপনি fold
স্কোয়াশকে / ভাঙ্গতে বলছেন যে কমিটগুলির একটি রৈখিক চেইন ভাঙ্গা নয়। ভাঁজটি কী তা হ'ল এটি একটি নতুন চেঞ্জসেট তৈরি করে যা এতে সমস্ত পরিবর্তনসেট থেকে পরিবর্তন রয়েছে এবং সেই সমস্ত কমিটগুলি অপ্রচলিত হিসাবে চিহ্নিত করে। আপনি এই মধ্যে আরো একটি গভীর দৃশ্য থাকতে পারে ডক্স ।
এখন ধরুন আপনার নীচের ইতিহাস রয়েছে।
a -> b -> c -> d -> e -> f -> g
আপনি স্কোয়াশ করতে চান e
, f
এবং g
। আপনি করতে পারেন
hg up g
hg fold -r e
ফলাফল হবে
a -> b -> c -> d -> h
যেখানে h
changeset যা সব তিনটি করে থেকে পরিবর্তন রয়েছে e
, f
এবং g
।
আপনি ইতিহাসের মাঝামাঝি থেকে চেঞ্জসেটগুলিও ভাঁজ করতে পারেন, অর্থাত্ আপনাকে অবশ্যই একটি শৃঙ্খলা বেছে নিতে হবে যাতে টিপটি অন্তর্ভুক্ত থাকে। মনে করুন আপনি ভাঁজ করতে চান b
, c
এবং d
। আপনি করতে পারেন
hg up d
hg fold -r b
hg evolve --all
এর ফলে হবে
a -> i -> j
যেখানে i
এর গুটান changeset হয় b
, c
, d
এবং j
হিসাবে একই changeset হয় h
।
বিবর্তিত ব্যবহারকারী গাইড অবশ্যই পড়তে হবে।
--keep
পুনর্বার বিকল্পটি এইটিকে আবরণ করে (এরপরে সংশোধনগুলি গোপন হিসাবে চিহ্নিত করে, বা ফলাফলটি একবার দেখে নিলে সেগুলির উপর স্ট্রিপ ব্যবহার করে)। এমনকি অন্যান্য পুনর্বিবেচনার মধ্যে পরিবর্তনগুলি মুভিং করাও দুটি রিবেস কমান্ডের অনুক্রমের সাহায্যে সম্ভব।
মার্চুরিয়াল ৪.৮ (নভেম্বরে 2018, 9 বছর পরে) দিয়ে আপনি নতুন কমান্ডটি বিবেচনা করতে পারেন hg absorb
(এটি আগে একটি পরীক্ষামূলক বৈশিষ্ট্য ছিল )।
" বুধবারে 4.8 এ প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি দেখুন "
শোষণ এক্সটেনশানটি আপনার কার্যনির্বাহী ডিরেক্টরিতে প্রতিটি পরিবর্তন নেবে, আপনার সিরিজে কোনটি সেই লাইনটি সংশোধিত করেছে তা নির্ধারণ করবে এবং স্বয়ংক্রিয়ভাবে সেই প্রতিশ্রুতিতে পরিবর্তনটি সংশোধন করবে।
যদি কোনও অস্পষ্টতা থাকে (যেমন একাধিক কমিট একই লাইনে পরিবর্তিত হয়েছে), তবে শোষণটি কেবল সেই পরিবর্তনটিকে উপেক্ষা করবে এবং এটিকে ম্যানুয়ালি সমাধান করার জন্য আপনার কার্য ডিরেক্টরিতে রেখে দেবে।একটি প্রযুক্তিগত স্তরে,
hg absorb
সমস্ত আপত্তিহীন পরিবর্তনগুলি এবং প্রতিটি পরিবর্তিত রেখাকে একটি দ্ব্যর্থহীন পূর্বের প্রতিশ্রুতিতে ম্যাপ করার চেষ্টা করে।
পরিষ্কারভাবে ম্যাপ করা যায় এমন প্রতিটি পরিবর্তনের জন্য, আপত্তিহীন পরিবর্তনগুলি যথাযথ পূর্বের প্রতিশ্রুতিতে শোষিত হয়। অপারেশনের দ্বারা প্রভাবিত কমিটগুলি স্বয়ংক্রিয়ভাবে পুনরায় সাজানো হবে।
যদি কোনও পরিবর্তন কোনও স্পষ্টতপূর্ব প্রতিশ্রুতিতে ম্যাপ করা না যায়, তবে এটি ছাড়াই ছেড়ে দেওয়া হবে এবং ব্যবহারকারীরা একটি বিদ্যমান ওয়ার্কফ্লোতে ফিরে যেতে পারেন (যেমন ব্যবহার করেhg histedit
)।
hg absorb
লাইনগুলির ইতিহাস অনুসরণ করে স্বয়ংক্রিয় পুনর্লিখনের যুক্তি প্রয়োগ করা হয়: এটি গৃহীত পদ্ধতির থেকে মূলত পৃথকhg histedit
বাgit rebase
, যা একাধিক ইনপুট প্রদত্ত কোনও ফাইলের নতুন সংস্করণ পেতে 3- মার্জ মেশিনের ভিত্তিতে মার্জ কৌশলগুলিতে নির্ভর করে tend সংস্করণ।এই পদ্ধতির সাথে মিলিত হয়ে এইচ.জি. একটি অস্পষ্ট অ্যাপ্লিকেশন কমিটের পরিবর্তনের পরিবর্তে এইচজি শোষণ এড়িয়ে যায় এর অর্থ হ'ল এইচজি শোষণ কখনই মার্জ সংঘাতের মুখোমুখি হতে পারে না!
এখন, আপনি ভাবছেন যদি আপনি অস্পষ্ট প্রয়োগের লক্ষ্যগুলি সহ লাইনগুলি উপেক্ষা করেন, প্যাচটি সর্বদা ক্লাসিকাল 3-উপায় সংযুক্তি ব্যবহার করে পরিষ্কারভাবে প্রয়োগ করা হবে। এই বক্তব্যটি যৌক্তিকভাবে সঠিক বলে মনে হচ্ছে। তবে এটি নয়:
hg absorb
মার্জ সংঘাতগুলি এড়াতে পারে যখন মার্জ করাhg histedit
বাgit rebase -i
ব্যর্থ হবে।
আমি মনে করি chistedit
(মার্চিউরিয়াল ২.৩ থেকে নির্মিত) rebase -i
খাঁটি মারকুরিয়াল (এটির chistedit
ইন্টারেক্টিভ সংস্করণ ) এর সবচেয়ে নিকটতম histedit
। একবার হেসেডিটে fold
কমান্ড ম্যাপটি রিবেস করার জন্য squash
এবং roll
মানচিত্রের মানচিত্রগুলি রিবেস করার জন্য fixup
। হিসেডিট দেখুনআরও তথ্যের জন্য ডক্স ।
এখানে একটি সহজ উদাহরণ। ধরে নিন যে আপনার নিম্নলিখিত রয়েছে এবং 1e21c4b1 এর সমস্ত পরিবর্তনগুলি পূর্ববর্তী সংশোধনীতে সরাতে চান এবং কেবল পূর্ববর্তী সংশোধনের বার্তাটি রেখে চলেছেন।
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
আপনি hg chistedit -r b4a738a4
b4a738a4 এ ইতিহাস সম্পাদনা করতে দৌড়াতে পারেন। চিস্টিটে আপনি তারপরে 1e21c4b1 এ কার্সার নামিয়ে নিন এবং r
আপনি সেই সংশোধনটি রোল করতে চান তা বোঝাতে আঘাত করুন । মনে রাখবেন যে হেস্টেডিটে অর্ডারটি (সবচেয়ে পুরানো থেকে hg log
সর্বাধিক প্রাচীন) থেকে বিপরীত হয়েছে (সবচেয়ে প্রাচীন থেকে প্রাচীনতম)।
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
আপনার পরিবর্তনগুলি বেছে নেওয়ার পরে আপনি চয়ন করুন c
করার সেগুলি প্রতিশ্রুতিবদ্ধ করতে । ফলাফল নিম্নলিখিত:
@ bfa4a3be শুকনো টিপ | একটি কমিট ও 788aa028 ড্রি | পুরানো জিনিস
আপনি যদি তাদের তুলনায় তুলনামূলকভাবে নতুন হন তবে তার histedit
চেয়ে ভাল পছন্দ হতে পারে chistedit
কারণ এটি রেফারেন্সের জন্য হিস্টেডিট ফাইলে কমান্ডের বিবরণ সরবরাহ করে। সাধারণ পাঠ্য সম্পাদনা (সাধারণ রিবাজের মতো) ব্যবহার করে কমান্ডগুলি সেট করতে আরও কিছুটা সম্পাদনা লাগে।
নোট, উভয়ই ব্যবহার করতে histedit
বা আপনার ~ / .hgrc- এ আপনার এক্সটেনশনে chistedit
যুক্ত histedit
করতে হবে:
[extensions]
histedit =
আমি chistedit
এটি প্রস্তাব করেছি যেহেতু এটি নিকটতম rebase -i
এবং ইতিহাসের যে কোনও জায়গায় কাজ করে। আপনি যদি সত্যিই কেবল বর্তমানের পুনর্বিবেচনা / সামঞ্জস্য করতে চান তবে @ জি। strip
যা ঘটছে তা স্পষ্ট হওয়ায় ডেমেকির পরামর্শটি ভাল হতে পারে। এটি মার্চুরিয়া ২.৮ থেকে নির্মিত হয়েছে। উপরের মত সমতুল্য ফলাফল পেতে আপনি নিম্নলিখিতটি করতে পারেন:
hg strip .
hg add
hg commit --amend
নোট strip
, হিস্টেডিট এর মতো আপনার ~ / .hgrc এ সক্ষম করা দরকার:
[extensions]
strip =
ধরে নেওয়া যাক আপনি সর্বাধিক সাম্প্রতিক কমিটগুলি স্কোয়াশ করতে (একত্রিত করতে) চান।
একটি সংশোধন নম্বর সন্ধান করুন
hg log -G -l 3
সম্ভাব্য আউটপুট:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
নরম রিসেট শাখা
hg strip --keep -r 155
আবার পরিবর্তন প্রতিশ্রুতিবদ্ধ
hg commit -m "new commit message"
strip
সক্ষম করার জন্য একটি অন্তর্নির্মিত এক্সটেনশান প্রয়োজন। ~/.hgrc
নিম্নলিখিত সামগ্রী সহ কনফিগারেশন ফাইল তৈরি / সম্পাদনা করুন :
[extensions]
strip =