ฉันมีคู่กรรมที่ควรจะเป็นเพียงหนึ่งเดียว ถ้าฉันใช้คอมไพล์ฉันจะใช้:
git rebase -i <some-commit-before>
แล้วสควอชพวกเขา
ฉันสามารถทำใน Mercurial ได้หรือไม่? ถ้าเป็นอย่างไร
ฉันมีคู่กรรมที่ควรจะเป็นเพียงหนึ่งเดียว ถ้าฉันใช้คอมไพล์ฉันจะใช้:
git rebase -i <some-commit-before>
แล้วสควอชพวกเขา
ฉันสามารถทำใน Mercurial ได้หรือไม่? ถ้าเป็นอย่างไร
คำตอบ:
ได้คุณสามารถทำได้โดยใช้ Mercurial โดยไม่มีส่วนขยายใด ๆ โดยการเชื่อมต่อชุดการเปลี่ยนแปลง
อีกวิธีหนึ่งหากคุณต้องการใช้ส่วนขยายที่คุณสามารถใช้ได้:
ที่ชอบคือhg strip --keep
คำสั่ง จากนั้นฉันก็ทำการเปลี่ยนแปลงทั้งหมดในคอมมิตเดียว
เป็นวิธีที่เร็วและสะดวกสบายที่สุดสำหรับฉันเพราะฉันชอบทำงานเล็ก ๆ น้อย ๆ ระหว่างการทำงานประจำวันของฉัน)
หมายเหตุ 1: strip
จำเป็นmq
ต้องเปิดใช้งานส่วนขยายในตัว
หมายเหตุ 2: ไคลเอนต์ Git / Mercurial ที่ฉันชอบ (SmartGit / Hg) ต่อท้ายด้วย--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
บางทีลองใช้ส่วนขยายวิวัฒนาการ
ขยาย Rebaseทำงานเช่นเสน่ห์ ในการสควอช 2 คอมมิต:
$ hg rebase --dest .~2 --base . --collapse
Dot เป็นทางลัดสำหรับการแก้ไขปัจจุบัน
ง่ายยิ่งขึ้นเมื่อคุณมีการกระทำไม่กี่ครั้งในสาขาและต้องการยุบทั้งหมดเป็นหนึ่งเดียว:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
วิธีการทำงาน:
(จากhttp://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
ถ้าคุณกำลังอ่านคำตอบนี้คุณสามารถลืมทุกตัวเลือกอื่น ๆ ที่กล่าวถึงในคำตอบนี้และใช้
fold
คำสั่งจากส่วนขยายวิวัฒนาการ
evolve
เป็นส่วนเสริมของ Mercurial ซึ่งช่วยให้เรามีประวัติที่ไม่แน่นอนที่ปลอดภัย แต่ก็ยังคงทดลองอยู่ คุณสามารถใช้มันได้โดยการโคลนจากrepoและเพิ่มใน. hgrc ของคุณเช่นนี้
[extensions]
evolve = ~/evolve/hgext/evolve.py
สมมติว่าคุณโคลนวิวัฒนาการ repo ในโฮมไดเร็กทอรีของคุณ ตอนนี้คุณพร้อมที่จะไป 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
เป็นเซ็ตที่มีการเปลี่ยนแปลงจากทั้งสามกระทำe
, f
และg
และ
นอกจากนี้คุณยังสามารถพับชุดการเปลี่ยนแปลงจากตรงกลางของประวัติกล่าวคือคุณไม่จำเป็นต้องเลือกโซ่ที่มีปลาย สมมติว่าคุณต้องการที่จะพับb
, และc
d
คุณทำได้
hg up d
hg fold -r b
hg evolve --all
ซึ่งจะส่งผลให้
a -> i -> j
ที่i
เป็นเซ็พับb
, c
, d
และเป็นเช่นเดียวกับการแก้ไข
j
คู่มือผู้ใช้ Evolveเป็นสิ่งที่ต้องอ่านh
--keep
ตัวเลือกของ rebase จะครอบคลุมสิ่งนี้ (ตามด้วยการทำเครื่องหมายการแก้ไขเป็นความลับหรือใช้แถบเมื่อคุณตรวจสอบผลลัพธ์แล้ว) แม้แต่การย้ายการแก้ไขระหว่างการแก้ไขอื่น ๆ ก็สามารถทำได้ด้วยลำดับของคำสั่ง rebase สองคำสั่ง
ด้วย Mercurial 4.8 (พฤศจิกายน 2018, 9 ปีต่อมา) คุณสามารถพิจารณาคำสั่งใหม่ได้hg absorb
(เป็นคุณลักษณะทดลองมาก่อน )
ดู "การดูดซับการกระทำที่เปลี่ยนแปลงใน Mercurial 4.8 "
ส่วนขยายการดูดซับจะทำการเปลี่ยนแปลงแต่ละรายการในไดเร็กทอรีการทำงานของคุณคิดว่าคอมมิตใดในซีรีส์ของคุณแก้ไขบรรทัดนั้นและแก้ไขการเปลี่ยนแปลงโดยอัตโนมัติในคอมมิตนั้น
หากมีความคลุมเครือใด ๆ (เช่นการคอมมิตหลายรายการที่แก้ไขในบรรทัดเดียวกัน) การดูดซับจะเพิกเฉยต่อการเปลี่ยนแปลงนั้นและปล่อยไว้ในไดเร็กทอรีการทำงานของคุณเพื่อแก้ไขด้วยตนเองในระดับเทคนิค
hg absorb
พบการเปลี่ยนแปลงที่ไม่ได้ผูกมัดทั้งหมดและพยายามแมปแต่ละบรรทัดที่เปลี่ยนแปลงกับคอมมิตก่อนหน้าที่ไม่คลุมเครือ
สำหรับการเปลี่ยนแปลงทุกครั้งที่สามารถแมปได้อย่างหมดจดการเปลี่ยนแปลงที่ไม่ได้กำหนดไว้จะถูกดูดซับไปยังการกระทำก่อนหน้านี้ที่เหมาะสม การกระทำที่ได้รับผลกระทบจากการดำเนินการจะถูกปรับฐานใหม่โดยอัตโนมัติ
หากไม่สามารถแมปการเปลี่ยนแปลงกับคอมมิตก่อนหน้าที่ไม่คลุมเครือได้การเปลี่ยนแปลงนั้นจะไม่ถูกผูกมัดและผู้ใช้สามารถถอยกลับไปใช้เวิร์กโฟลว์ที่มีอยู่ได้ (เช่นการใช้hg histedit
)ตรรกะการเขียนซ้ำอัตโนมัติ
hg absorb
ถูกนำไปใช้โดยทำตามประวัติของบรรทัดซึ่งแตกต่างกันโดยพื้นฐานจากแนวทางที่ใช้hg histedit
หรือgit rebase
ซึ่งมักจะอาศัยกลยุทธ์การผสานตามการผสาน3 ทางเพื่อรับไฟล์เวอร์ชันใหม่ที่มีการป้อนข้อมูลหลายรายการ เวอร์ชันวิธีนี้รวมกับความจริงที่ว่า hg ดูดซับข้ามการเปลี่ยนแปลงด้วยแอพพลิเคชั่นที่คลุมเครือหมายความว่าการดูดซับ hg จะไม่พบกับความขัดแย้งในการผสาน!
ตอนนี้คุณอาจกำลังคิดว่าหากคุณเพิกเฉยต่อบรรทัดที่มีเป้าหมายแอปพลิเคชันที่ไม่ชัดเจนแพตช์จะใช้อย่างหมดจดโดยใช้การผสาน 3 ทางแบบคลาสสิก คำพูดนี้ฟังดูมีเหตุผล แต่ไม่ใช่:
hg absorb
สามารถหลีกเลี่ยงความขัดแย้งในการผสานเมื่อการผสานดำเนินการโดยhg histedit
หรือgit rebase -i
จะล้มเหลว
ฉันคิดว่าchistedit
(สร้างขึ้นตั้งแต่ Mercurial 2.3) เป็นรุ่นที่ใกล้เคียงที่สุดกับrebase -i
Mercurial บริสุทธิ์ ( chistedit
เป็นเวอร์ชันโต้ตอบhistedit
) เมื่ออยู่ใน histedit fold
คำสั่งแมปไป rebase ของsquash
และroll
คำสั่งแมปไป fixup
rebase ดูhisteditเอกสารสำหรับข้อมูลเพิ่มเติม
นี่คือตัวอย่างง่ายๆ สมมติว่าคุณมีสิ่งต่อไปนี้และต้องการย้ายการเปลี่ยนแปลงทั้งหมดของ 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 ใน chistedit ให้คุณเคอร์เซอร์ลงไปที่ 1e21c4b1 และกดr
เพื่อระบุว่าคุณต้องการม้วนการแก้ไขนั้น โปรดทราบว่าลำดับในฮิสแก้ไข (เก่าที่สุดไปหาใหม่ที่สุด) จะกลับจากhg log
(ใหม่สุดไปเก่าสุด)
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
หลังจากเลือกการเปลี่ยนแปลงของคุณแล้วคุณจึงเลือก c
จะยอมรับผลลัพธ์มีดังต่อไปนี้:
@ bfa4a3be เคล็ดลับ drees | กระทำ o 788aa028 drees | สิ่งที่เก่ากว่า
หากคุณค่อนข้างใหม่สำหรับพวกเขาhistedit
อาจเป็นทางเลือกที่ดีกว่าchistedit
เนื่องจากมีคำอธิบายคำสั่งในไฟล์ฮิสแก้ไขสำหรับการอ้างอิง ใช้เวลาแก้ไขอีกเล็กน้อยเพื่อตั้งค่าคำสั่งโดยใช้การแก้ไขข้อความปกติ (เช่นเดียวกับ rebase ปกติ)
หมายเหตุหากต้องการใช้อย่างใดอย่างหนึ่งhistedit
หรือchistedit
คุณต้องเพิ่มhistedit
ในส่วนขยายของคุณใน ~ / .hgrc ของคุณ:
[extensions]
histedit =
ฉันแนะนำchistedit
เนื่องจากใกล้เคียงที่สุดrebase -i
และทำงานได้ทุกที่ในประวัติศาสตร์ หากคุณต้องการเพียงแค่สมัคร / ปรับแต่งการแก้ไขปัจจุบันในการแก้ไขก่อนหน้านี้ให้ @G strip
ข้อเสนอแนะของ Demecki นั้นดีเพราะสิ่งที่เกิดขึ้นนั้นชัดเจน สร้างขึ้นตั้งแต่ Mercuria 2.8 เพื่อให้ได้ผลลัพธ์เทียบเท่าข้างต้นคุณสามารถทำสิ่งต่อไปนี้:
hg strip .
hg add
hg commit --amend
หมายเหตุstrip
เช่น histedit ต้องเปิดใช้งานใน ~ / .hgrc ของคุณ:
[extensions]
strip =
สมมติว่าคุณต้องการสควอช (รวมกัน) 2 คอมมิตล่าสุด
ค้นหาหมายเลขการแก้ไข
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 =
ฉันใช้:
hg phase --draft --force -r 267
...
hg rebase --dest 282 --source 267 --collapse