มีวิธีใดบ้างที่จะลบการผูกพันใน Mercurial?


209

ดังนั้นฉันจึงทำผิดพลาดอย่างต่อเนื่องใน Mercurial บ่อยครั้งฉันจะเริ่มทำงานโดยไม่ทำ "hg pull" และ "hg update" เมื่อฉันพยายามผลักดันการเปลี่ยนแปลงฉันได้รับข้อผิดพลาด

มีวิธีใดที่จะลบการกระทำในท้องถิ่นของฉันเพื่อให้ฉันสามารถหลีกเลี่ยงการสร้างหลายหัวสาขา ฯลฯ ฉันแค่ต้องการลบการกระทำในท้องถิ่นของฉันรวมการเปลี่ยนแปลงของฉันกับเคล็ดลับแล้วมอบหมายอีกครั้ง ฟังดูง่ายใช่มั้ย ฉันไม่สามารถหาวิธีใด ๆ ที่จะลบการกระทำในท้องถิ่นได้อย่างง่ายดายดังนั้นฉันจึงสามารถรวมเข้ากับเคล็ดลับได้อย่างหมดจด

อีกครั้งฉันแค่พยายามลบการกระทำในท้องถิ่นที่ทำด้วย "hg ci" ฉันไม่ต้องการแก้ไขไฟล์กลับคืน ฯลฯ



12
ไม่ใช่ข้อผิดพลาดโง่ ๆ มันเป็นขั้นตอนการทำงานปกติเมื่อหลายคนทำงานกับที่เก็บเดียวกันพร้อมกัน
Juozas Kontvainis

คำตอบ:


247

เปิดใช้งานส่วนขยาย " แถบ " และพิมพ์ต่อไปนี้:

hg strip #changeset# --keep

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

สำหรับข้อมูลเพิ่มเติมให้ตรวจสอบขยาย Strip

หากคุณได้รับ "คำสั่ง unkown 'strip'" คุณอาจต้องเปิดใช้งาน หากต้องการค้นหา.hgrcหรือMercurial.iniไฟล์และเพิ่มรายการต่อไปนี้:

[extensions]
strip =

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

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

hg strip 'roots(outgoing())'

8
@Bharath: คุณต้องเปิดใช้งานส่วนขยาย
Samaursa

1
ตั้งแต่ mercurial 2.8, สตริปเป็นส่วนขยายแบบสแตนด์อโลนดังนั้นก็strip = ใช้ได้ WhatsNew for Mercurial 2.8
Chih-Hsuan Yen

104

หากคุณกำลังใช้ Hg Tortoise เพียงเปิดใช้งานส่วนขยาย " แถบ " ใน:

  1. ไฟล์ / การตั้งค่า / ส่วนขยาย /
  2. เลือกแถบ

จากนั้นเลือกการแก้ไขด้านล่างจากตำแหน่งที่คุณต้องการเริ่มต้นการสตริปโดยทำright clickมันและเลือก:

  1. แก้ไขประวัติ
  2. เพิก

เช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

ในตัวอย่างนี้มันจะลบจากการแก้ไขครั้งที่ 19 ถึงการยอมรับครั้งสุดท้าย (22)


2
File/Settings/Extensions/ฉันหวังว่าฉันจะสามารถเพิ่มคะแนนมากขึ้น ขอบคุณมาก!
dyatchenko

โอ๊ะ! ฉันลองสิ่งนี้ แต่ดูเหมือนว่าจะถ่ายโอนการเปลี่ยนแปลงทั้งหมดของฉันแม้จะไม่ได้ตรวจสอบว่า "ไม่มีข้อมูลสำรอง" หรือ "ยกเลิกการเปลี่ยนแปลงในเครื่อง" ฉันต้องการที่จะรักษาการเปลี่ยนแปลงเหล่านั้นเพียงแค่ไม่ยอมรับพวกเขา! มีวิธีกู้คืนพวกเขาตอนนี้หรือไม่?
ทิม Tisdall

2
ฉันไม่สามารถหาวิธีที่จะทำอย่างถูกต้อง แต่ดูเหมือนว่าจะเก็บเนื้อหาที่คุณต้องผ่าน--keepและ TortoiseHg ไม่ได้ให้ทางเลือกนั้น ดังนั้น ... hg strip -r . --keepคุณต้องทำมันที่บรรทัดคำสั่งด้วย
Tim Tisdall

3
จากแถบช่วยเหลือ: 'ชุดการเปลี่ยนแปลงใด ๆ ที่ถูกปล้นจะถูกเก็บไว้ใน ".hg / strip-backup" เป็นชุด (ดู "hg help bundle" และ "hg help unbundle") สามารถเรียกคืนได้โดยการเรียกใช้ "hg unbundle .hg / strip-backup / BUNDLE" โดยที่ BUNDLE เป็นไฟล์บันเดิลที่สร้างโดยแถบ '
Tim Tisdall

ใน SourceTree มันก็มีประโยชน์เช่นกัน ขอบคุณ!
Ponomarenko Oleh

22

คำตอบที่ทันสมัย ​​(เฉพาะที่เกี่ยวข้องหลังจาก Mercurial 2.1):

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

ใน TortoiseHG คุณสามารถคลิกขวาที่คำสั่งเพื่อเปลี่ยนเฟส

นอกจากนี้:คุณยังสามารถใช้ส่วนขยาย "rebase" เพื่อย้ายการกระทำในพื้นที่ของคุณไปยังส่วนหัวของพื้นที่เก็บข้อมูลที่ใช้ร่วมกันหลังจากที่คุณดึง


ส่วนตัว == ความลับตอนนี้
Dmitry Osinovskiy

15

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

สิ่งนี้ไม่ได้ลบออกจากที่เก็บต้นฉบับ แต่จะสร้างโคลนใหม่ที่ไม่มี จากนั้นคุณสามารถลบ repo ที่คุณแก้ไข (ถ้าคุณต้องการ)


"hg clone -r" ลบการเปลี่ยนแปลงในเครื่องหรือไม่ ฉันแค่ต้องการลบการกระทำในท้องถิ่นเพื่อให้สิ่งต่าง ๆ ง่ายขึ้น
user191535

4
มันไม่ได้ลบพวกมันออกจากที่เก็บโคลน แต่มันสร้างโคลนใหม่ที่ไม่มีพวกมัน จากนั้นคุณสามารถลบ repo ที่คุณแก้ไขได้หากต้องการ
Ry4an Brase

9

ฉันเจอปัญหานี้ด้วย ฉันทำ 2 commitและต้องการย้อนกลับและลบทั้งสองข้อตกลง

$ hg rollback

แต่hg rollbackเพิ่งย้อนกลับไปสู่การคอมมิชชันล่าสุดไม่ใช่ 2 คอมมิท ในเวลานั้นฉันไม่ได้ตระหนักถึงสิ่งนี้และฉันเปลี่ยนรหัส

เมื่อฉันพบว่าhg rollbackมีการย้อนกลับหนึ่งข้อตกลงฉันพบว่าฉันสามารถhg strip #changeset#ใช้ได้ ดังนั้นผมใช้hg log -l 10ในการค้นหาล่าสุด 10 stripกระทำและได้รับการแก้ไขที่ถูกต้องผมอยากจะ

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

อะไรabort: local changes foundหมายถึง? หมายความว่าhgพบการเปลี่ยนแปลงในรหัสที่ยังไม่ได้ส่งมอบ ดังนั้นเพื่อแก้ปัญหานี้คุณควรhg diffจะบันทึกรหัสที่คุณมีการเปลี่ยนแปลงและและhg revert hg strip #changeset#เช่นนี้

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

หลังจากที่คุณทำข้างต้นคุณสามารถpatchไฟล์ diff และรหัสของคุณสามารถเพิ่มกลับไปยังโครงการของคุณ

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

คุณสามารถหลีกเลี่ยงปัญหานี้ได้ง่ายขึ้นด้วยส่วนขยาย Rebaseเพียงใช้hg pull --rebaseและคอมมิชชันของคุณจะกลับมาอีกครั้งโดยอัตโนมัติไปยังรุ่นที่ถูกดึงมาเพื่อหลีกเลี่ยงปัญหาการแตกแขนง


1
เสียค่าใช้จ่ายในการมีประวัติที่ไม่ถูกต้องและความเสียหายที่อาจเกิดขึ้นหากคุณทำสิ่งผิดพลาด
Ry4an Brase


4

hg stripคือสิ่งที่คุณกำลังมองหา มันคล้ายกับgit resetถ้าคุณคุ้นเคยกับคอมไพล์

ใช้คอนโซล:

  1. คุณจำเป็นต้องรู้หมายเลขการแก้ไข hg log -l 10. คำสั่งนี้แสดงการคอมมิท 10 ครั้งล่าสุด ค้นหาความมุ่งมั่นที่คุณกำลังมองหา คุณต้องมีตัวเลข 4 หลักจากบรรทัดเซ็ตการแก้ไขchangeset: 5888:ba6205914681

  2. hg strip -r 5888 --keepแล้วก็ สิ่งนี้จะลบบันทึกการกระทำ แต่เก็บไฟล์ทั้งหมดที่แก้ไขแล้วคุณสามารถแนะนำไฟล์เหล่านั้นได้ (หากคุณต้องการลบไฟล์เพื่อเพียงลบ --keephg strip -r 5888


1

[Hg Tortoise 4.6.1] หากเป็นการกระทำล่าสุดคุณสามารถใช้การกระทำ "ย้อนกลับ / เลิกทำ" (Ctrl + U)

รูปภาพ HG เต่า


ตรวจสอบการรวมภาพอีกครั้ง
Bill Keller

0

นอกเหนือจากคำตอบที่ยอดเยี่ยมของ Samaursa คุณสามารถใช้evolveส่วนขยายpruneเป็นเวอร์ชันที่ปลอดภัยและสามารถกู้คืนได้stripซึ่งจะช่วยให้คุณย้อนกลับไปได้ในกรณีที่คุณทำอะไรผิด

ฉันมีนามแฝงเหล่านี้ในของฉัน.hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

โปรดทราบว่าpruneยังมี--keepเหมือนstripเพื่อรักษาไดเรกทอรีการทำงานเหมือนเดิมช่วยให้คุณสามารถแนะนำไฟล์

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