Mercurial move เปลี่ยนสาขาใหม่


124

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


คำตอบ:


153

ตามคำแนะนำของ Mark MqExtensionเป็นทางออกหนึ่งสำหรับปัญหาของคุณ IMHO เวิร์กโฟลว์ที่เรียบง่ายคือการใช้ส่วนขยาย rebase สมมติว่าคุณมีประวัติดังนี้:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

ซึ่งหมายความว่าการแก้ไข0เป็นฐานที่คุณเริ่มทำงานกับคุณลักษณะของคุณ ตอนนี้คุณต้องการที่จะมีการแก้ไขในชื่อสาขาสมมติว่า1-2 my-featureอัปเดตเพื่อแก้ไข0และสร้างสาขานั้น:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

ตอนนี้ประวัติมีลักษณะดังนี้:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

ใช้rebaseคำสั่งเพื่อย้ายการแก้ไข1-2ไปยังการแก้ไข3:

$ hg rebase -s 1 -d 3

ผลลัพธ์ในกราฟต่อไปนี้:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

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


4
IMHO ข้อเสียเปรียบของโซลูชันนี้คือแนะนำการคอมมิตจำลอง "start new branch my-feature" (เช่นอันที่ไม่เปลี่ยนแปลงไฟล์ใด ๆ )
sschuberth

9
@sschuberth: ฉันคิดว่าการเปิดเผยเป็นสิ่งที่ดีที่นี่ หากชุดการเปลี่ยนแปลงพิเศษเป็นปัญหาสำหรับคุณให้รวมเข้ากับชุดที่สำเร็จ (เช่นโดยใช้foldคำสั่งของส่วนขยายฮิสต์ที่มีอยู่แล้วในตอนนี้)
Oben Sonne

6
@AmirRachum: hg log -G( GraphlogExtension ). ผมเคยถอดเส้นบางด้วยตนเอง แต่ก็ยังจะได้รับการแสดงผลอย่างสมบูรณ์โดยอัตโนมัติโดยใช้รูปแบบการเข้าสู่ระบบที่กำหนดเอง
Oben Sonne

2
เปิดใช้งานส่วนขยายrebase : mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka

1
@sschuberth ฉันเห็นด้วย วิธีแก้ปัญหาของฉันคือการกำหนดฐานข้อมูลใหม่ที่ไม่ใช่ดัมมี่ของคุณลงในพาเรนต์ของดัมมี่คอมมิตด้วยแฟล็ก --keepbranches จากนั้น hg จะดึงการคอมมิตดัมมี่ของคุณออก นี่เป็นงานจำนวนมากในการเปลี่ยนชื่อสาขา แต่บางครั้ง Mercurial ก็เป็นใบ้เช่นนั้น
weberc2

30

คุณสามารถใช้MqExtension สมมติว่าชุดการเปลี่ยนแปลงที่จะย้ายเป็นการแก้ไข 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

ฉันต้องการนำเข้า 63:64 และ 66:68 ฉันได้รับการแก้ไข 65 ไม่ใช่แม่ของ 64
Casebash

คุณต้องการทำอะไรกับ 65? Mq สามารถแปลงชุดการเปลี่ยนแปลงต่อเนื่องจากส่วนหัวเท่านั้น โดยปกติจะเปลี่ยนชุดการเปลี่ยนแปลงที่ไม่เปลี่ยนรูปเป็นแพตช์ที่เปลี่ยนแปลงได้ซึ่งสามารถแก้ไขได้ สิ่งนี้จะเปลี่ยนแฮช (ส่งผลกระทบต่อเด็กทุกคน) ดังนั้นคุณจึงไม่สามารถข้ามได้
Mark Tolonen

ฉันมีการเปลี่ยนแปลงหลายอย่าง (รวม 65) ที่ฉันทำในสาขาหลักและผลักดัน
Casebash

1
อย่าแก้ไขชุดการเปลี่ยนแปลงที่ถูกพุช Mq เปลี่ยนแฮชเพื่อให้เป็นการเปลี่ยนแปลงใหม่อย่างมีประสิทธิภาพ แก้ไขเฉพาะประวัติที่ไม่ได้รับการผลักดัน
Mark Tolonen

หากคุณกด 65 ไปแล้วคุณไม่ควรขยับ 63 และ 64 อย่างแน่นอนและเพียงแค่ตัดสินใจย้าย 66:68 (อีกครั้งเฉพาะในกรณีที่คุณไม่ได้ผลักดัน)
Matt

9

ฉันชอบวิธีแก้ปัญหาที่อธิบายไว้ที่นี่ Mark Tolonen

สิ่งที่ฉันมี:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

สิ่งที่ฉันต้องการ:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

คำสั่ง mercurials:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

นี่คือสถานะของที่เก็บในเครื่องของฉัน

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

ตอนนี้ฉันต้องการลบการแก้ไข 1 2 และ 3 จากสาขาเริ่มต้นของฉัน คุณสามารถทำได้ด้วยคำสั่ง strip จากส่วนขยายของ mq hg stripลบชุดการเปลี่ยนแปลงและลูกหลานทั้งหมดออกจากที่เก็บ

เปิดใช้งานส่วนขยายโดยเพิ่มบรรทัดต่อไปนี้ในไฟล์กำหนดค่าของคุณ (.hgrc หรือ Mercurial.ini):

vim ~/.hgrc และเพิ่ม:

[extensions]
mq =

และตอนนี้ถอดที่เก็บนี้ในการแก้ไข 1

hg strip 1

และเราอยู่ที่นี่

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

หมายเหตุ: ชุดการเปลี่ยนแปลงแตกต่างกัน แต่การแก้ไขจะเหมือนกัน


5

สำหรับผู้ที่ชอบใช้ GUI

  1. ไปที่Tortoise Hg-> File-> Settingsแล้วติ๊กrebaseถูก

ใส่คำอธิบายภาพที่นี่

  1. รีสตาร์ท UI ของเต่า

  2. สร้างสาขาใหม่ที่คุณจะย้ายการเปลี่ยนแปลง คลิกที่ชื่อสาขาปัจจุบัน -> เลือกOpen a new named branch-> เลือกชื่อสาขา

ใส่คำอธิบายภาพที่นี่

  1. หากยังไม่ได้ทำการเปลี่ยนแปลงที่คุณต้องการย้ายpublic(เช่นdraft) ไปที่ 5. (หากมีการเผยแพร่การเปลี่ยนแปลงไปแล้วและคุณไม่ใช่นักพัฒนาอาวุโสคุณควรคุยกับคนที่อาวุโสกว่า (รับแพะรับบาป) เพราะคุณอาจทำให้เรื่องเสียหายครั้งใหญ่ ฉันไม่รับผิดชอบใด ๆ :))

ไปที่View-> Show Console(หรือCtrl+ L) จากนั้นเขียนในคอนโซลhg phase -f -d 2- โดยที่ 2 เป็นการแก้ไขที่ต่ำที่สุดคุณจะย้ายไปที่สาขาใหม่

  1. ไปที่สาขาและการแก้ไข (ควรเป็นการแก้ไขสูงสุดหากคุณกำลังย้ายการเปลี่ยนแปลงไปยังสาขาใหม่ที่สร้างในขั้นตอนที่ 3) Right Mouse->Update

  2. ไปที่ branch และ revsion คุณจะย้ายการเปลี่ยนแปลงจากRight Mouse-> Modify History->Rebase

ใส่คำอธิบายภาพที่นี่

  1. คลิกRebaseและอธิษฐานว่าไม่มีความขัดแย้งรวมเข้าด้วยกันหากคุณต้องการ

  2. ผลักดันการเปลี่ยนแปลง ณ จุดนี้การแก้ไขทั้งหมดควรยังคงเป็นdraftอยู่

  3. ไปที่การแก้ไขสูงสุดในสาขาที่คุณกำลังจะย้ายการเปลี่ยนแปลงRight Mouse-> ->Change Phase toPublic

ใส่คำอธิบายภาพที่นี่

หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง


เยี่ยมมาก! จะลองทำแค่คำถามเดียวทำไมถึงเปลี่ยนเฟสเป็นสาธารณะในตอนท้าย? "ชุดการเปลี่ยนแปลงใด ๆ ที่เห็นในที่เก็บระยะไกลเป็นแบบสาธารณะ" ดังนั้นเมื่อคุณพุชจะไม่ตั้งค่าเป็นสาธารณะใช่หรือไม่
Joshua Duxbury

@JoshLeeDucks เมื่อผลักดันพวกเขาจะไม่เปลี่ยนเป็นแบบpublicอัตโนมัติอีกต่อไป (อย่างน้อยสำหรับฉันพวกเขาก็ไม่ทำ)
Matas Vaitkevicius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.