Mercurial: ฉันสามารถเปลี่ยนชื่อสาขาได้หรือไม่?


204

ตอนนี้เรามีสาขา "เพอร์มิง" ซึ่ง "staging" ดูเหมือนว่าจะมีความหมายที่ดีกว่ามาก กลยุทธ์ที่ดีในการจัดการสิ่งนี้คืออะไร?

คำตอบ:


223

อัปเดตเป็นstigingสาขาและสร้างสาขาใหม่ จากนั้นปิดสาขาเก่า

สรุป:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

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

2
Mercurial อนุญาตให้นำชื่อสาขาที่ปิดมาใช้ซ้ำได้หรือไม่ คือถ้าคุณมีสาขา v3 คุณสามารถใช้เทคนิคข้างต้นเพื่อเปลี่ยนชื่อเป็น v4 แล้วแยกสาขา v3 ใหม่ออกแม้ว่าจะทิ้งไว้ข้างหลัง v3 ที่ปิดไปหรือไม่?
Joshua Goldberg

4
@JoshuaGoldberg, 3noch ผิด Mercurial จะ--forceช่วยให้คุณสามารถนำมาใช้ชื่อสาขาปิดถ้าคุณใช้ ตัวอย่างเช่นhg branch --force v3. สิ่งนี้จะส่งผลให้มีการhg update v3อัพเดทไปยังv3สาขาใหม่ตามที่คุณต้องการ
Gili

2
ยืนยันความคิดเห็นของ @ Gili ด้วยสาขาช่วยเหลือของ hg: "- บังคับให้ตั้งชื่อสาขาแม้ว่าจะแสดงสาขาที่มีอยู่"
Joshua Goldberg

7
หากคุณปิดstigingก่อนที่จะแยกสาขาคุณจะไม่ได้รับ "
Loose

60

สำหรับผู้อ่านในอนาคต: ด้วยrebaseส่วนขยายคุณสามารถสร้างสาขาใหม่ที่มีผู้ปกครองเดียวกับstigingและย้ายประวัติสาขาทั้งหมดไปที่สาขานี้:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

สมมติว่าstigingมีเพียงหนึ่งพาเรนต์ แน่นอนคุณสามารถใช้หมายเลขการแก้ไขที่ชัดเจนแทน

หมายเหตุ 1: ถ้าสาขาstigingรวมถึงการผสานกับสาขาอื่น ๆ ผมคิดว่านี้จะรักษาพวกเขาตราบเท่าที่stagingและstigingมีแม่เดียวกัน แต่ฉันจะตรวจสอบอีกครั้งอย่างแน่นอน

หมายเหตุ 2: ตั้งแต่การแก้ไขประวัติสาขาเก่าจะไม่หายไปจากที่เก็บโคลน (ดูrebaseเอกสารประกอบ) ถ้าทุกคนไม่สามารถโคลนได้อีกครั้งมันอาจไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้จริงสำหรับกลุ่มใหญ่

Note3 / แก้ไข (ความอนุเคราะห์ของ @JasonRCoombs): ตอนนี้ขั้นตอนเป็นมาตรฐานในแบบ mercurial แล้วrebaseจะปฏิเสธที่จะแก้ไขชุดการเปลี่ยนแปลงที่ถูกผลักไปแล้ว ไม่ว่าจะด้วยการเปลี่ยนเฟสกลับมาเป็นแบบร่าง (ด้วยhg phases) หรือปล่อยให้สาขาเก่าอยู่ในตำแหน่งนั้นและทำสำเนาชื่อที่เหมาะสม (เช่นด้วย `hg rebase --keep ')


+1 สำหรับทีมเล็ก ๆ ที่คุณสามารถบังคับให้ผู้ใช้โคลนนี่เป็นความคิดที่ดี - หรือใช้hg convertแทน
hochl

5
ด้วย Mercurial เวอร์ชันล่าช้าคำสั่ง rebase จะล้มเหลวด้วย "ไม่สามารถรีเซ็ทเซ็ตการแก้ไขที่ไม่เปลี่ยนรูปแบบ" หากการเปลี่ยนแปลงที่จะย้ายเป็น "สาธารณะ" บังคับให้พวกเขาเป็นแบบร่าง (พร้อมเฟส hg) หรือส่งผ่าน--keepไปยังคำสั่ง rebase ซึ่งจะคัดลอกแทนที่จะย้ายการเปลี่ยนแปลง
Jason R. Coombs

ในขั้นตอนที่ abort: can't rebase immutable changeset 11b1e2b7dc4f4: โปรดทราบว่าฉันได้ทำการต่อกิ่งเซ็ตการเปลี่ยนแปลงจากสาขาอื่นเข้าไปในอันนี้ นอกจากนั้นมันแยกและรวมเป็นอิสระ
Mark Jeronimus

@ ทำเครื่องหมายดูที่หมายเหตุ 3 ด้านบน
alexis

6
แทนการยอมรับชุดการเปลี่ยนแปลงในสาขาใหม่จากนั้นรีบูตด้านบนของมันคุณสามารถละเว้นและใช้ค่า.ของคุณ--destและการรีบูตจะใช้ชื่อสาขาใหม่โดยอัตโนมัติ
weberc2

16

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


1
นี่เป็นวิธีแก้ปัญหาที่น่าสนใจคุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม?
DrM

15

สร้างสาขาใหม่ที่เรียกว่า "การจัดเตรียม" และลืมอีกสาขา ...


+1 นั่นคือสิ่งที่ฉันต้องการ เซ็ตการแก้ไขเก่า ๆ จะยังคงมีชื่อ branche เก่า แต่ชุดใหม่จะมีชื่อสาขาใหม่
barjak

6

นี่เป็นการแก้ไขประวัติและใช้สำหรับผู้ใช้ Mercurial ขั้นสูงเท่านั้น อย่าทำอย่างนี้ถ้าคุณไม่รู้ความหมาย

หาก stiging เป็นแบบโลคัลเท่านั้นคุณสามารถเปลี่ยนเป็นการ staging ด้วยการต่อกิ่งและสตริป เริ่มต้นด้วยการอัปเดตเป็นเซ็ตการแก้ไขที่บรรพบุรุษได้แยกไว้ด้วยกัน สร้างกิ่งก้านลำดับฉากและกราฟต์แต่ละการคอมมิทจากการ stiging ไปยังการจัดเตรียม การจัดเตรียมควรเป็นสำเนาของการตีตรา ในที่สุดทำลาย stiging โดยการลอกกระทำครั้งแรก

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
สำหรับขั้นตอนที่ 3 คุณสามารถใช้hg graft {first changeset in stiging}..{stiging head}
KCD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.