আমি কি মার্চুরিয়ালে স্কোয়াশ কমিট করতে পারি?


109

আমার কাছে এক জোড়া কমিট রয়েছে যা সত্যই এক হওয়া উচিত be আমি যদি গিট ব্যবহার করতাম তবে আমি ব্যবহার করতাম:

git rebase -i <some-commit-before>

এবং তারপর তাদের স্কোয়াশ।

আমি কি পারফরম্যান্সে এটি করতে পারি? যদি তাই হয়, কিভাবে?

উত্তর:


88

হ্যাঁ, আপনি কনসেটেটিং চেঞ্জসেট দ্বারা কোনও এক্সটেনশন ছাড়াই মার্চিয়রাল ব্যবহার করে এটি করতে পারেন ।

পর্যায়ক্রমে আপনি যদি কোনও এক্সটেনশন ব্যবহার করতে চান তবে আপনি ব্যবহার করতে পারেন:


হ্যাঁ, আমি সাধারণ প্রশ্নের উপর আমার মন্তব্যে আমার পছন্দ করা দুপ প্রশ্নগুলির মধ্যে উত্তরটি খুঁজে পেয়েছি। আমি মনে করি এটি আপনার উত্তর one
Ry4an ব্রাস

4
একটু পার্শ্ব নোট: হিস্টেডিট এক্সটেনশনটি মার্চুরিয়াল ২.৩ এবং তার পরে বিতরণ করা হয়েছে। আপনাকে কেবল এটি সক্ষম করতে হবে।
পাইধি

1
কনকাটেনেটিং চেঞ্জসেটস ডকটিতে "রেপো" এর বিমূর্ত ধারণাটি ব্যবহার করা হয়েছে, আমি সেগুলি কীভাবে উল্লেখ করব? উদাহরণস্বরূপ: এইচজি -আর ওল্ডেরপো রফতানি ... উত্পাদন "প্রবণতা: সংগ্রহস্থল ওল্ডেরপো পাওয়া যায় নি!
আলেকসান্দ্র লেভুকুক

13
কেবল 2 টি স্কোয়াশ করার চেষ্টা করছে। আমার কি সত্যিই 10+ কমান্ড বা বিকল্প এক্সটেনশন সহ একটি উইকি পৃষ্ঠা দরকার?
আলেকসান্দ্র লেভুকুক

3
মন্তব্য দেখুন। হিস্টেডিট এখন অন্তর্নির্মিত, আপনাকে কেবল এটি সক্ষম করতে হবে (কারণ কোনও ডিফল্ট কমান্ড ইতিহাস পরিবর্তন করবে না)
Ry4an Brase

43

আমার প্রিয় hg strip --keepকমান্ড। এবং তারপরে আমি একটি প্রতিশ্রুতিতে সমস্ত পরিবর্তন করি।

এটি আমার পক্ষে দ্রুততম এবং স্বাচ্ছন্দ্যময় উপায়, কারণ আমি আমার প্রতিদিনের কাজের সময় অনেকগুলি ছোট ছোট কমিট করতে পছন্দ করি;)


নোট 1: সক্ষম করতে stripএকটি অন্তর্নির্মিত এক্সটেনশান mqপ্রয়োজন।
দ্রষ্টব্য 2: আমার প্রিয় গিট / মারকুরিয়াল ক্লায়েন্ট (স্মার্টজিট / এইচজি) --keepসময়কালে ডিফল্ট প্যারামিটার দ্বারা সংযোজন হয় strip। এবং আরও বেশি সুবিধাজনক কি: এটি বিকল্প বলা হয় join commits:]


4
এইচজি স্ট্রিপের সম্পূর্ণ কমান্ডটি হ'ল: আপনি সর্বশেষের সাথে স্কোয়াশ করতে চান এমন প্রথম প্রতিশ্রুতি সংশোধন নম্বরটি hg strip --keep --rev [rev] কোথায়rev
নিকোলাস ফোর্নি

3
--revhg strip --keep [rev]
@ নিকোলাসফোর্নি

৩.৩.৩: রিভিশনটি আমার জন্য বাধ্যতামূলক: hg help stripদেয় hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..., এবং বাদ দেওয়া সংশোধন আমাকে দেয় abort: empty revision set
রোমান স্টারকভ

3
ব্যবহার hg stripকরা সেরা ধারণা নয়। এটি ঠিক নিরাপদ নয়। চেষ্টা করুন hg histedit, সম্ভবত বিবর্তিত এক্সটেনশনটি ব্যবহার করে দেখুন।
মার্টিন থমসন

Git মানুষের জন্য সবচেয়ে প্রাকৃতিক উপায় মনে;)
foo বিন্যাস

32

রি-বেসের ফলে এক্সটেনশন একটি যাদুমন্ত্র মত কাজ করেন। স্কোয়াশ করতে 2 কমিট করে:

$ hg rebase --dest .~2 --base . --collapse

বর্তমান সংশোধনের জন্য ডট হ'ল একটি শর্টকাট।

এটি আরও সহজ যখন আপনার একটি শাখায় কয়েকটি কমিট থাকে এবং সেগুলি একটিতে ভাগ করতে চান:

$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse

এটি কীভাবে কাজ করে:

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

( http://mercurial-scm.org/wiki/RebaseExistance# কলাপসিং থেকে )


1
দুটি প্রত্যাশার জন্য আপনি কোথায় "~ 2" পেয়েছেন?
মি-লা

1
এটি রিসেটস বিষয়গুলিতে ব্যাখ্যা করা হয়েছে, hg সহায়তা রিসেটগুলি দেখুন।
মার্ক্যান্ড এবং

13

আপনি যদি এই উত্তরটি পড়ছেন তবে আপনি এই উত্তরে বর্ণিত প্রতিটি বিকল্প ভুলে যেতে পারেন এবং বিবর্তিত এক্সটেনশন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

যেখানে hchangeset যা সব তিনটি করে থেকে পরিবর্তন রয়েছে 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পুনর্বার বিকল্পটি এইটিকে আবরণ করে (এরপরে সংশোধনগুলি গোপন হিসাবে চিহ্নিত করে, বা ফলাফলটি একবার দেখে নিলে সেগুলির উপর স্ট্রিপ ব্যবহার করে)। এমনকি অন্যান্য পুনর্বিবেচনার মধ্যে পরিবর্তনগুলি মুভিং করাও দুটি রিবেস কমান্ডের অনুক্রমের সাহায্যে সম্ভব।
আর্থার ট্যাকা

... আরও, আপনি যদি কিছু জটিল করে থাকেন তবে ব্যাকআপ হিসাবে আপনি সর্বদা প্রথমে স্থানীয় রেপোকে ক্লোন করতে পারেন। এটি কতটা বিরল (আশাবাদী!) বিবেচনা করে দেখুন, কীভাবে সম্পূর্ণ নতুন এক্সটেনশনটি ব্যবহার করবেন তা শেখার চেয়ে কম প্রচেষ্টা।
আর্থার ট্যাকা

"নেম এরিয়ার: নাম 'এক্সিকিফিল' সংজ্ঞায়িত করা হয়নি" - যার অর্থ বিকলিত হওয়া পাইথন 2-এ লিখিত, যা মূলত প্রস্তর যুগ।
নিল জি

1
@ নীলজি মুরুরিয়াল পাইথন 3 এখনও সমর্থন করে না।
পুলকিত গোয়াল

2
@ নীলজি হ্যাঁ, পার্কিয়ান সম্প্রদায় পিআই 3 সমর্থন তাত্পর্য অর্জনের জন্য কঠোর পরিশ্রম করছে।
পুলকিত গোয়েল

1

মার্চুরিয়াল ৪.৮ (নভেম্বরে 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ব্যর্থ হবে।


0

আমি মনে করি 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 b4a738a4b4a738a4 এ ইতিহাস সম্পাদনা করতে দৌড়াতে পারেন। চিস্টিটে আপনি তারপরে 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 =

0

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

  1. একটি সংশোধন নম্বর সন্ধান করুন

    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
    
  2. নরম রিসেট শাখা

    hg strip --keep -r 155
    
  3. আবার পরিবর্তন প্রতিশ্রুতিবদ্ধ

    hg commit -m "new commit message"
    

মন্তব্য

stripসক্ষম করার জন্য একটি অন্তর্নির্মিত এক্সটেনশান প্রয়োজন। ~/.hgrcনিম্নলিখিত সামগ্রী সহ কনফিগারেশন ফাইল তৈরি / সম্পাদনা করুন :

[extensions]
strip = 

-1

আমি ব্যবহার করি:

hg phase --draft --force -r 267
...
hg rebase --dest 282 --source 267 --collapse
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.