Mercurial เลิกทำการคอมมิตล่าสุด


125

ฉันจะยกเลิกการเปลี่ยนแปลงครั้งสุดท้ายที่ตั้งใจไว้ (ไม่ได้ถูกผลัก) ใน Mercurial ได้อย่างไร?

ถ้าเป็นไปได้ขอแนะนำวิธีทำกับ TortoiseHg

ปรับปรุง

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


1
แล้วทำสองhg rollbackแล้วดึงอีกล่ะ?
VonC

1
การย้อนกลับครั้งแรกจะยกเลิกการดึงการย้อนกลับครั้งที่สองบอกฉันว่า "ไม่มีข้อมูลการย้อนกลับ"
Martin Buberl

1
ฉันเจอสถานการณ์เดียวกันและเท่าที่ฉันรู้ว่าเมื่อคุณดำเนินการอื่น ๆ แล้วคุณจะย้อนกลับหรือลบมันออกจากประวัติไม่ได้ คุณจะต้องโคลนที่เก็บ hg อีกครั้ง

3
strip --keep: stackoverflow.com/questions/29413851/…แก้งานโดยตรงเช่นเดียวกับ MQ qimport ผลัดกันมันอาจจะดีกว่าเพียงแค่rebaseในสถานการณ์หากมีการเปลี่ยนแปลงในท้องถิ่นจะยังถูกเก็บไว้และไม่มีความขัดแย้ง (ใช้การผสานเพื่อเก็บการเปลี่ยนแปลงบางอย่างจากทั้งสองสาขาเมื่อนั่นคือเป้าหมายปลายทางของกราฟที่ต้องการโดยเฉพาะอย่างยิ่งในกรณีที่ไม่ใช่ fastforward) นอกจากนี้ยังสามารถใช้ได้เพียงเพื่อปิดสาขาซึ่งยังคง 'รักษาประวัติ' ไว้ (แต่ แตกต่างจากการผสาน) ขึ้นอยู่กับสถานะสุดท้ายที่ต้องการ
user2864740

2
ในฐานะที่เป็น @ user2864740 กล่าวว่าhg strip --keepเป็นคำสั่งการใช้งานทำ hg strip --keep -r .แต่คุณจำเป็นต้องให้การแก้ไขเช่น: คำตอบนี้อธิบายได้ดีstackoverflow.com/a/19064016/1286571
ForeverWintr

คำตอบ:


77

วิธีหนึ่งก็คือ hg rollback (เลิกใช้แล้วเมื่อ Hg2.7 สิงหาคม 2556)

โปรดใช้hg commit --amendแทนrollbackเพื่อแก้ไขข้อผิดพลาดในการกระทำครั้งล่าสุด

ย้อนกลับธุรกรรมสุดท้ายในที่เก็บ

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

ดูหัวข้อการกู้คืน TortoiseHg :

ข้อความแสดงแทน

หัวข้อนี้ยังให้รายละเอียดความแตกต่างระหว่างhg rollbackและhg strip:
(เขียนโดยMartin Geislerที่มีส่วนร่วมใน SO)

  • ' hg rollback' จะลบธุรกรรมล่าสุด ธุรกรรมเป็นแนวคิดที่มักพบในฐานข้อมูล ใน Mercurial เราเริ่มต้นธุรกรรมเมื่อมีการเรียกใช้การดำเนินการบางอย่างเช่นกระทำผลักดึง ...
    เมื่อการดำเนินการเสร็จสิ้นธุรกรรมจะถูกทำเครื่องหมายว่าเสร็จสมบูรณ์ หากเกิดข้อผิดพลาดธุรกรรมจะ "ย้อนกลับ" และที่เก็บจะอยู่ในสถานะเดิมเหมือนเดิม
    คุณสามารถเรียกใช้การย้อนกลับด้วยตนเองด้วย "hg rollback" การดำเนินการนี้จะยกเลิกคำสั่งธุรกรรมสุดท้าย หากคำสั่ง pull นำชุดการเปลี่ยนแปลงใหม่ 10 ชุดไปยังที่เก็บในสาขาที่แตกต่างกัน ' hg rollback' จะลบออกทั้งหมด โปรดทราบ: ไม่มีการสำรองข้อมูลเมื่อคุณย้อนกลับธุรกรรม!

  • ' hg strip' จะลบชุดการเปลี่ยนแปลงและลูกหลานทั้งหมด ชุดการเปลี่ยนแปลงจะถูกบันทึกเป็นชุดรวมซึ่งคุณสามารถนำไปใช้ได้อีกครั้งหากต้องการกลับคืน

ForeverWintrแนะนำในความคิดเห็น (ในปี 2559 5 ปีต่อมา)

คุณสามารถ 'ยกเลิกการผูกมัด' ไฟล์ได้โดยการลืม hg ครั้งแรกเช่น: hg forget filea; hg commit --amendแต่ดูเหมือนจะไม่ได้ตั้งใจ
hg strip --keepน่าจะเป็นทางออกที่ดีกว่าสำหรับ hg สมัยใหม่


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

1
@Martin Buberl: อ้างอิงจากselenic.com/mercurial/hg.1.html#rollback การดึงถือเป็นธุรกรรม ดังนั้นหากคุณดึงการดำเนินการhg rollbackจะยกเลิกการดึงแทนที่จะเป็นการคอมมิต
Tim Henigan

2
ฉันไม่แน่ใจว่าhg commit --amendควรจะทำงานอย่างไร แต่สำหรับฉันมันทำให้ฉันมีตัวแก้ไขเพื่อแก้ไขข้อความคอมมิตและไม่มีวิธีการเปลี่ยนไฟล์ที่รวมอยู่ ผมเดินออกมาจากการแก้ไขโดยไม่ต้องบันทึกและพบว่าฉันเข้าใจผิดกระทำคือการเปลี่ยนแปลงที่จะรวมทุกไฟล์การเปลี่ยนแปลง!
Tim Tisdall

2
ยังไม่ชัดเจนสำหรับฉันว่าจะตอบคำถามโดยใช้hg commit --amendอย่างไร คุณสามารถ 'ยกเลิกการคอมมิต' ไฟล์ได้โดยการแต่งhg forgetแต้มไฟล์ก่อนเช่น: hg forget filea; hg commit --amendแต่ดูเหมือนว่าจะไม่ใช้งานง่าย hg strip - Keepน่าจะเป็นทางออกที่ดีกว่าสำหรับ hg สมัยใหม่
ForeverWintr

1
@JasonS book.mercurial-scm.org/read/…เป็นการอ่านที่ดีแม้ว่าในกรณีของคุณคุณสามารถพิจารณาการรีเซ็ต hg: stackoverflow.com/a/31302998/6309
VonC

46

hg strip จะลบการแก้ไขอย่างสมบูรณ์ (และลูกหลาน) ออกจากที่เก็บ

ในการใช้แถบคุณจะต้องติดตั้งMqExtensionโดยเพิ่มบรรทัดต่อไปนี้ใน. hgrc (หรือ mercurial.ini) ของคุณ:

[extensions]
mq =

ใน TortoiseHg คำสั่ง strip พร้อมใช้งานในโต๊ะทำงาน คลิกขวาที่การแก้ไขและเลือก 'แก้ไขประวัติ' -> 'สตริป'

เนื่องจากstripการเปลี่ยนแปลงประวัติของที่เก็บคุณควรใช้เฉพาะกับการแก้ไขที่ยังไม่ได้แชร์กับใคร หากคุณใช้ Mercurial 2.1+ คุณสามารถใช้ขั้นตอนเพื่อติดตามข้อมูลนี้ได้ หากคอมมิตยังอยู่ในขั้นตอนร่างจะไม่ถูกแชร์กับที่เก็บอื่นเพื่อให้คุณสามารถถอดออกได้อย่างปลอดภัย (ขอบคุณ Zasurus ที่ชี้ให้เห็น)


2
หากการแก้ไขที่เป็นปัญหายังคงอยู่ในวลีฉบับร่าง (หรือคุณสามารถเข้าถึง repo ทั้งหมดที่มีการผลัก / ดึงและนำแถบไปใช้กับทั้งหมด) (ซึ่งเป็นกรณีในคำอธิบายนี้) นี่คือ ดังนั้นตัวเลือกที่ดีที่สุดและสะอาดที่สุด
GazB

4
หากคุณติดตั้ง TortoiseHg จะมีอินเทอร์เฟซแบบกราฟิกสำหรับการเปิดใช้งาน mq ทั่วโลก ในเวอร์ชันปัจจุบัน: เปิดใช้งาน "file-> settings-> global settings tab-> extensions-> mq" หรือเข้าถึงไฟล์การตั้งค่าผ่านปุ่ม "แก้ไขไฟล์"
เดวิด

19

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

ดังนั้นหากคุณดึงและอัปเดตเป็นส่วนหัวคุณสามารถทำได้:

hg --config ui.merge=internal:local merge

เก็บการเปลี่ยนแปลงทั้งหมดไว้ในการแก้ไขที่เช็คเอาต์ในปัจจุบันและไม่มีการเปลี่ยนแปลงใด ๆ ในการแก้ไขที่ไม่ได้เช็คเอาต์ (การแก้ไขที่คุณเขียนว่าคุณไม่ต้องการอีกต่อไป)

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


5

hg rollback คือสิ่งที่คุณต้องการ

ใน TortoiseHg hg rollbackจะสำเร็จในกล่องโต้ตอบการกระทำ เปิดกล่องโต้ตอบการกระทำและเลือก "เลิกทำ"

ข้อความแสดงแทน


1
ฉันทำการคอมมิตจากนั้นดึงและอัปเดต / ซิงค์ ด้วยการเปลี่ยนแปลงใหม่ ๆ เหล่านี้ทำให้ฉันได้ตัดสินใจว่าคอมมิตสุดท้ายของฉันล้าสมัยและต้องการที่จะเลิกทำ ปุ่มเลิกทำใน TortoiseHg ถูกปิดใช้งานในกรณีของฉัน
Martin Buberl

ตอนนี้เลิกใช้การย้อนกลับแล้ว
UpTheCreek

ในเวอร์ชันปัจจุบันของ Tortoise HG คุณสามารถไปที่ตัวเลือก Rollback / Undo จากรายการเมนู Repository
daveywc

@UpTheCreek อ้างอิงจำเป็น
DanMan

@DanMan - ตรวจสอบลิงค์ที่เขาให้มา
UpTheCreek

3

ในเวอร์ชันปัจจุบันของ TortoiseHg Workbench 4.4.1 (07.2018) คุณสามารถใช้Repository- Rollback/undo...:
ใส่คำอธิบายภาพที่นี่


1

วิธีแก้ปัญหา

หากคุณไม่ดันไปที่เซิร์ฟเวอร์คุณจะโคลนไปยังโฟลเดอร์ใหม่อื่น ๆ ที่ล้างออก (ลบไฟล์ทั้งหมด) จากโฟลเดอร์ที่เก็บของคุณและทำการโคลนใหม่


0

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

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