ฉันมีการเปลี่ยนแปลงหลายอย่างที่ฉันยอมรับกับที่เก็บในเครื่องของฉัน แต่ยังไม่ได้รับการผลักดัน เนื่องจากฟีเจอร์ใช้เวลานานกว่าที่คาดไว้ฉันจึงต้องการสลับการเปลี่ยนแปลงเหล่านี้ไปยังสาขาที่มีชื่อก่อนที่ฉันจะพุช ฉันจะทำเช่นนี้ได้อย่างไร?
ฉันมีการเปลี่ยนแปลงหลายอย่างที่ฉันยอมรับกับที่เก็บในเครื่องของฉัน แต่ยังไม่ได้รับการผลักดัน เนื่องจากฟีเจอร์ใช้เวลานานกว่าที่คาดไว้ฉันจึงต้องการสลับการเปลี่ยนแปลงเหล่านี้ไปยังสาขาที่มีชื่อก่อนที่ฉันจะพุช ฉันจะทำเช่นนี้ได้อย่างไร?
คำตอบ:
ตามคำแนะนำของ 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 การย้ายชุดการเปลี่ยนแปลงที่ผลักไปแล้วโดยทั่วไปเป็นความคิดที่ไม่ดีเว้นแต่คุณจะทำงานในทีมเล็ก ๆ ที่คุณสามารถสื่อสารและบังคับใช้การจัดการประวัติของคุณได้
fold
คำสั่งของส่วนขยายฮิสต์ที่มีอยู่แล้วในตอนนี้)
hg log -G
( GraphlogExtension ). ผมเคยถอดเส้นบางด้วยตนเอง แต่ก็ยังจะได้รับการแสดงผลอย่างสมบูรณ์โดยอัตโนมัติโดยใช้รูปแบบการเข้าสู่ระบบที่กำหนดเอง
คุณสามารถใช้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
ฉันชอบวิธีแก้ปัญหาที่อธิบายไว้ที่นี่ 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
หมายเหตุ: ชุดการเปลี่ยนแปลงแตกต่างกัน แต่การแก้ไขจะเหมือนกัน
สำหรับผู้ที่ชอบใช้ GUI
Tortoise Hg
-> File
-> Settings
แล้วติ๊กrebase
ถูกรีสตาร์ท UI ของเต่า
สร้างสาขาใหม่ที่คุณจะย้ายการเปลี่ยนแปลง คลิกที่ชื่อสาขาปัจจุบัน -> เลือกOpen a new named branch
-> เลือกชื่อสาขา
public
(เช่นdraft
) ไปที่ 5. (หากมีการเผยแพร่การเปลี่ยนแปลงไปแล้วและคุณไม่ใช่นักพัฒนาอาวุโสคุณควรคุยกับคนที่อาวุโสกว่า (รับแพะรับบาป) เพราะคุณอาจทำให้เรื่องเสียหายครั้งใหญ่ ฉันไม่รับผิดชอบใด ๆ :))ไปที่View
-> Show Console
(หรือCtrl+ L) จากนั้นเขียนในคอนโซลhg phase -f -d 2
- โดยที่ 2 เป็นการแก้ไขที่ต่ำที่สุดคุณจะย้ายไปที่สาขาใหม่
ไปที่สาขาและการแก้ไข (ควรเป็นการแก้ไขสูงสุดหากคุณกำลังย้ายการเปลี่ยนแปลงไปยังสาขาใหม่ที่สร้างในขั้นตอนที่ 3) Right Mouse
->Update
ไปที่ branch และ revsion คุณจะย้ายการเปลี่ยนแปลงจากRight Mouse
-> Modify History
->Rebase
คลิกRebase
และอธิษฐานว่าไม่มีความขัดแย้งรวมเข้าด้วยกันหากคุณต้องการ
ผลักดันการเปลี่ยนแปลง ณ จุดนี้การแก้ไขทั้งหมดควรยังคงเป็นdraft
อยู่
ไปที่การแก้ไขสูงสุดในสาขาที่คุณกำลังจะย้ายการเปลี่ยนแปลงRight Mouse
-> ->Change Phase to
Public
หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง
public
อัตโนมัติอีกต่อไป (อย่างน้อยสำหรับฉันพวกเขาก็ไม่ทำ)