วิธีปิดสาขาคุณลักษณะอย่างถูกต้องใน Mercurial ได้อย่างไร


240

feature-xฉันได้เสร็จสิ้นการทำงานในสาขาสารคดี ฉันต้องการที่จะผสานผลกลับไปที่defaultสาขาและใกล้เพื่อให้ได้รับการกำจัดของมันในการส่งออกของfeature-xhg branches

ฉันมาด้วยสถานการณ์ต่อไปนี้ แต่มีปัญหาบางอย่าง:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

ดังนั้นfeature-xbranch (changests 40- 41) จะถูกปิด แต่มีหนึ่ง head ใหม่เซ็ตการเปลี่ยนแปลง branch ที่ปิด44ซึ่งจะถูกแสดงในhg headsทุกครั้ง:

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

อัปเดต : ดูเหมือนว่าตั้งแต่เวอร์ชัน 1.5 Mercurial จะไม่แสดงหัวสาขาที่ปิดในผลลัพธ์ของhg headsอีกต่อไป

เป็นไปได้ไหมที่จะปิดสาขาที่ถูกผสานโดยไม่ต้องละออกไปอีกหนึ่งหัว? มีวิธีที่ถูกต้องกว่าในการปิดสาขาคุณลักษณะหรือไม่

คำถามที่เกี่ยวข้อง:


@Andrey: แต่บทความที่ชี้ให้เห็นไม่เพียง แต่พูดคุยเกี่ยวกับ "--close-branch" มันแสดงสี่วิธีในการตัดกิ่งของคุณ หากคุณไม่ต้องการมันอีกต่อไปคุณสามารถโคลนตามที่อธิบายไว้ในบทความ 'ปัญหา' เพียงอย่างเดียวคือถ้าด้วยเหตุผลใดก็ตามที่คุณต้องการปิดมัน
ไวยากรณ์ T3rr0r

1
@WizardOfOdds ใช่ฉันได้อ่านบทความทั้งหมดเกี่ยวกับการตัดกิ่งที่ตายแล้ว ฉันต้องการให้สาขาอยู่ในประวัติการแก้ไขไม่ใช่เพื่อโยนทิ้ง ก่อนหน้านี้ฉันเพิ่งรวมสาขาคุณลักษณะเข้าdefaultโดยไม่ต้อง "ปิด" พวกเขา มันส่งผลให้หัวใหม่ 0 แต่สาขาดังกล่าวสามารถมองเห็นได้hg branchesตลอดกาล (เป็นสาขาที่ไม่ได้ใช้งาน)
Andrey Vlasovskikh

เพื่อพัฒนาคุณสมบัติฉันมักจะโคลนที่เก็บทั้งหมดแล้วรวมกลับมาอีกครั้งเมื่อคุณสมบัติเสร็จสิ้น ฉันไม่ชอบที่จะมีสาขา (ปิด) ในประวัติศาสตร์
DanMan

คำตอบ:


218

วิธีหนึ่งคือเพียงเปิดสาขาฟีเจอร์ที่ผสานไว้ (และไม่ใช้งาน):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

อีกวิธีหนึ่งคือปิดสาขาฟีเจอร์ก่อนที่จะรวมโดยใช้การคอมมิทพิเศษ:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

อันแรกนั้นง่ายกว่า แต่จะเหลือสาขาที่เปิดอยู่ อันที่สองไม่มีใบหัว / สาขาที่เปิดอยู่ แต่มันต้องการการเสริมอีกหนึ่งอย่าง บางคนอาจรวมการกระทำที่เกิดขึ้นจริงครั้งล่าสุดกับสาขาฟีเจอร์กับการใช้การกระทำพิเศษนี้--close-branchแต่ควรรู้ล่วงหน้าว่าการมอบอำนาจใดเป็นการกระทำสุดท้าย

อัปเดต : ตั้งแต่ Mercurial 1.5 คุณสามารถปิดสาขาได้ตลอดเวลาดังนั้นจะไม่ปรากฏทั้งในhg branchesและhg headsอีกต่อไป สิ่งเดียวที่อาจทำให้คุณรำคาญได้ก็คือในทางเทคนิคกราฟการแก้ไขจะยังคงมีการแก้ไขอีกครั้งโดยไม่มีลูก

อัปเดต 2 : เนื่องจากบุ๊คมาร์ค Mercurial 1.8 ได้กลายเป็นคุณสมบัติหลักของ Mercurial บุ๊กมาร์กสะดวกต่อการแตกแขนงมากกว่ากิ่งที่ตั้งชื่อไว้ ดูคำถามนี้ด้วย:


2
Bookmarks are more convenient for branching than named branchesมันไม่จำเป็นต้องเป็นความจริงที่ว่า บุ๊กมาร์ก Hg นั้นไม่เหมือนกับของ Git พวกเขาเต็มไปด้วยกรณีขอบจำนวนมากซึ่งทำให้พวกเขาไม่เหมาะสมเป็นสาขาคุณลักษณะ ตัวอย่างเช่น: เมื่อคุณโคลนที่เก็บข้อมูลคุณจะจบลงด้วยการกระทำล่าสุดในdefaultสาขา หากคุณใช้บุ๊กมาร์กชุดการแก้ไขนี้จะสอดคล้องกับบุ๊กมาร์กแบบสุ่ม (ไม่เสถียร) หากคุณใช้สาขาที่มีชื่อคุณจะได้รับการส่งมอบล่าสุดในสาขาที่มีเสถียรภาพ / ค่าเริ่มต้นซึ่งมักเป็นสิ่งที่คุณต้องการ บุ๊กมาร์กจะไปถึงที่นั่นหนึ่งวัน แต่พวกเขายังไม่ได้อยู่ที่นั่น
Gili

ฉันใช้บุ๊กมาร์กเป็นแท็กส่วนตัวที่สามารถมองเห็นได้ในที่เก็บท้องถิ่นของฉันเท่านั้น พวกเขาทำหน้าที่เป็นตัวเตือนความจำเกี่ยวกับเซ็ตการแก้ไขที่ฉันต้องกลับมาอีกครั้ง
Gili

ผมพยายามที่จะทำตามวิธีนี้ abort: push creates new remote branches:แต่ฉันยังคงได้รับข้อผิดพลาดเมื่อพยายามที่จะผลักดัน: ฉันทำอะไรผิดได้
kasperd

79

imho มีสองกรณีสำหรับสาขาที่ลืมปิด

กรณีที่ 1: สาขาไม่ถูกรวมเป็นค่าเริ่มต้น

ในกรณีนี้ฉันอัปเดตไปยังสาขาและดำเนินการอื่นด้วย - ปิดสาขาโชคไม่ดีที่นี่เลือกสาขาเพื่อเป็นเคล็ดลับใหม่และด้วยเหตุนี้ก่อนที่จะผลักดันมันไปยังโคลนอื่น ๆ ฉันแน่ใจว่าเคล็ดลับที่แท้จริงได้รับการเปลี่ยนแปลงเพิ่มเติม อย่าสับสนกับเคล็ดลับแปลก ๆ นั้น

hg up myBranch
hg commit --close-branch

กรณีที่ 2: สาขาถูกรวมเป็นค่าเริ่มต้น

กรณีนี้ไม่แตกต่างจากกรณีที่ 1 มากนักและสามารถแก้ไขได้โดยทำขั้นตอนสำหรับกรณีที่ 1 และสองเพิ่มเติม

ในกรณีนี้ฉันอัปเดตเป็นเซ็ตการแก้ไขสาขาให้ทำคอมมิทอื่นด้วย --close-branch และรวมเซ็ตการแก้ไขใหม่ที่กลายเป็นคำแนะนำเข้าด้วยกัน การดำเนินการที่ผ่านมาสร้างเคล็ดลับใหม่ที่อยู่ในสาขาเริ่มต้น - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

หวังว่านี่จะช่วยผู้อ่านในอนาคต


3
คำตอบที่ชัดเจนดีสำหรับมือใหม่ Mercurial อย่างฉัน และขอขอบคุณที่ไม่ใช้ "ci" ซึ่งไม่ได้อยู่ในรายการเป็นหนึ่งในคำสั่งโดย hg help ดังนั้นฉันจึงไม่รู้ว่ามันหมายถึงอะไร :)
MB

8
@MB: ในกรณีเช่นนี้hg help ciจะอธิบายให้คุณทราบ
Chris Morgan

ฉันเชื่อว่าคำสั่ง 'hg merge' จะบอกคุณว่ายังมีความมุ่งมั่นอีกอย่างในตอนท้าย
Chip Grandits

11

แก้ไข , สายเกินไป ... ฉันรู้ว่าอ่านความคิดเห็นของคุณโดยระบุว่าคุณต้องการให้ฟีเจอร์ x เปลี่ยนแปลงอยู่รอบ ๆ ดังนั้นวิธีการโคลนที่นี่จะไม่ทำงาน

ฉันจะยังคงให้คำตอบที่นี่เพื่อช่วยคนอื่น

หากคุณต้องการกำจัด "feature X" อย่างสมบูรณ์เพราะตัวอย่างเช่นมันใช้งานไม่ได้คุณสามารถโคลนได้ นี่เป็นหนึ่งในวิธีที่อธิบายไว้ในบทความและใช้งานได้และพูดถึงหัวโดยเฉพาะ

เท่าที่ฉันเข้าใจว่าคุณมีสิ่งนี้และต้องการกำจัด "feature-x" เพียงครั้งเดียวและสำหรับทั้งหมด:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

ดังนั้นคุณทำสิ่งนี้:

hg clone . ../cleanedrepo --rev 7

และคุณจะมีสิ่งต่อไปนี้และคุณจะเห็นว่า Feature-x หายไปแล้ว:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

ฉันอาจเข้าใจผิดในสิ่งที่คุณต้องการ แต่โปรดอย่าปรับตัวลงฉันใช้เวลาทำซ้ำกรณีการใช้งานของคุณ:)


7

เป็นเรื่องแปลกที่ไม่มีใครแนะนำวิธีที่แข็งแกร่งที่สุดในการปิดสาขาคุณลักษณะ ... คุณสามารถรวมการคอมมิชชันคอมมิชชันกับแฟล็ก --close-branch (เช่นคอมมิตไฟล์ที่ถูกแก้ไขและปิดการสาขา)

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

นั่นคือทั้งหมดที่ ไม่มีใครหัวพิเศษใน revgraph ไม่มีการกระทำพิเศษ


ฉันได้กล่าวถึงมันในคำตอบของฉัน: "" "หนึ่งอาจรวมการกระทำที่เกิดขึ้นจริงล่าสุดกับสาขาคุณลักษณะกับการกระทำพิเศษนี้โดยใช้ - ปิดสาขา แต่หนึ่งควรรู้ล่วงหน้าซึ่งการกระทำที่จะเป็นคนสุดท้าย" " "
Andrey Vlasovskikh

โอเคฉันเข้าใจแล้ว ฉันไม่เข้าใจในส่วนสุดท้ายของประโยค ("แต่ควรรู้ ... ") ดังนั้นฉันคิดว่ามันมีความแตกต่าง นอกจากนี้ฉันต้องการที่จะทราบว่าวิธีนี้ไม่ได้รับการสนับสนุนโดยเครื่องมือ GUI ส่วนใหญ่ (TortoiseHG, SourceTree เป็นต้น)
tav

@AndreyVlasovskikh จุดประสงค์ของคำตอบนี้คือการปิดสาขาในการรวมมากกว่าการกระทำครั้งสุดท้ายของสาขาฟีเจอร์
kasperd

@tav ก่อนที่จะออกmergeคำสั่งอาจเป็นความคิดที่ดีที่จะใช้hg branchเพื่อตรวจสอบว่าชื่อสาขาของการผสานนั้นเป็นชื่อที่คุณต้องการเปิดไว้
kasperd

2
เมื่อมองเข้าไปใกล้จะเห็นว่าการรวมจะอยู่ในสาขาที่ปิดอยู่เสมอ ผลลัพธ์ที่ต้องการจะอยู่ในสาขาของหนึ่งในผู้ปกครองและปิดสาขาของผู้ปกครองอื่น ๆ ที่ดูเหมือนจะเป็นไปไม่ได้ ดังนั้นนี่ไม่ใช่วิธีแก้ปัญหาที่ใช้การได้จริง แย่มากฉันต้องการใช้การผสานเป็นจุดปิดของสาขา
kasperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.