Mercurial - เปลี่ยนกลับเป็นเวอร์ชันเก่าและดำเนินการต่อจากที่นั่น


249

ฉันใช้ Mercurial ในพื้นที่สำหรับโครงการ (เป็นธุรกรรมซื้อคืนเดียวที่ไม่มีการผลัก / ดึงไปยัง / จากที่อื่น)

ในวันที่มันมีประวัติเชิงเส้น อย่างไรก็ตามสิ่งที่ฉันกำลังทำอยู่ตอนนี้ฉันรู้แล้วว่ามันเป็นวิธีการที่แย่มากและฉันต้องการกลับไปที่เวอร์ชันก่อนที่ฉันจะเริ่มและนำไปใช้ในวิธีที่ต่างออกไป

ฉันบิตสับสนกับbranch/ revert/ update -Cคำสั่งใน Mercurial โดยทั่วไปฉันต้องการเปลี่ยนกลับไปใช้เวอร์ชัน 38 (ปัจจุบันอยู่ที่ 45) และมีข้อผูกพันต่อไปของฉันมี 38 ในฐานะผู้ปกครองและดำเนินการต่อจากที่นั่น ฉันไม่สนใจว่าการแก้ไข 39-45 จะสูญหายไปตลอดกาลหรือสิ้นสุดในสาขาของตนเอง

ฉันต้องการคำสั่ง / ชุดคำสั่งใด


6
สำหรับทุกคนที่สนใจสิ่งนี้เกิดขึ้นที่แถบด้านข้างที่เกี่ยวข้องซึ่งเป็นคำอธิบายที่ดีของการย้อนกลับกับการอัปเดต: stackoverflow.com/questions/2506803/…
เปาโล

คำตอบ:


150
hg update [-r REV]

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


6
กระทำต่อไปจะสร้างสาขาใหม่ หากคุณไม่แน่ใจให้สำรองที่เก็บข้อมูลของคุณ (พร้อมสำเนาที่ใช้งานได้) ลองใช้งาน - ไม่ชอบผลลัพธ์ -> เริ่มจากศูนย์ไม่มีค่าใช้จ่าย
van

นี่เป็นคำตอบที่น่าสงสัยเนื่องจากเป็นการรวมการเปลี่ยนแปลงปัจจุบันของคุณเข้ากับการแก้ไขแบบเก่าซึ่งอาจเป็นสิ่งที่คุณไม่ต้องการทำ คำตอบที่ถูกต้องควรเป็น hg ย้อนกลับ
Trevor de Koekkoek

คำตอบนั้นใช้ได้ยกเว้นเรื่องเกี่ยวกับการผสาน (ฉันไม่คิดว่าผู้ถามจะต้องการผสาน)
ctrl-alt-delor

3
@NeonWarge REV เป็นเพียงตัวยึดตำแหน่งสำหรับการแก้ไข มันอาจเป็นหมายเลขแฮชบุ๊คมาร์คและอื่น ๆ เทรเวอร์: นี่ไม่น่าสงสัยเพราะมันไม่ได้รวมอะไรเลย ไม่ต้องการ.
DanMan

401

นี่คือสูตรโกงของคำสั่ง:

  • hg updateเปลี่ยนการแก้ไขการคัดลอกพาเรนต์สำเนาการทำงานของคุณและเปลี่ยนเนื้อหาไฟล์เพื่อให้ตรงกับการแก้ไขพาเรนต์ใหม่นี้ ซึ่งหมายความว่าคอมมิชชันใหม่จะดำเนินการต่อจากการแก้ไขที่คุณอัปเดต

  • hg revertเปลี่ยนเนื้อหาไฟล์เท่านั้นและปล่อยให้การแก้ไข parent copy ทำงานเพียงอย่างเดียว โดยทั่วไปคุณจะใช้hg revertเมื่อคุณตัดสินใจว่าคุณไม่ต้องการที่จะเก็บการเปลี่ยนแปลงที่ไม่ได้ตั้งใจไว้ที่คุณทำไว้กับไฟล์ในสำเนาการทำงานของคุณ

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

หากคุณใช้งานhg update --rev 38แล้วเซ็ตการแก้ไข 39–45 จะถูกทิ้งให้เป็นทางตัน - หัวที่ห้อยต่องแต่งขณะที่เราเรียกมันว่า คุณจะได้รับคำเตือนเมื่อคุณกดเนื่องจากคุณจะสร้าง "หลายหัว" ในที่เก็บที่คุณกด คำเตือนอยู่ที่นั่นเพราะมันไม่สุภาพที่จะออกไปจากหัวพวกเขาเพราะพวกเขาแนะนำว่าใครบางคนต้องทำการผสาน แต่ในกรณีของคุณคุณสามารถไปข้างหน้าและhg push --forceเนื่องจากคุณต้องการปล่อยให้มันแขวน

หากคุณยังไม่ได้เพิ่มการแก้ไขที่ 39-45 ที่อื่นคุณสามารถทำให้เป็นส่วนตัวได้ มันง่ายมาก: เมื่อhg clone --rev 38 foo foo-38คุณจะได้รับโคลนนิ่งใหม่ที่มีเฉพาะการแก้ไข 38. คุณสามารถทำงานต่อfoo-38และผลักดันเซ็ตการแก้ไข (ดี) ใหม่ที่คุณสร้างขึ้น คุณจะยังคงมีการแก้ไขเก่า (ไม่ดี) ในfooโคลนของคุณ (คุณมีอิสระที่จะเปลี่ยนชื่อโคลนได้ตามที่คุณต้องการเช่นfooไปfoo-badและfoo-38ไปfoo)

ในที่สุดคุณสามารถใช้hg revert --all --rev 38และจากนั้นกระทำ สิ่งนี้จะสร้างการแก้ไข 46 ซึ่งดูเหมือนกับการแก้ไข 38 จากนั้นคุณจะทำงานต่อจากการแก้ไข 46 ได้สิ่งนี้จะไม่สร้างทางแยกในประวัติศาสตร์ด้วยวิธีที่ชัดเจนเหมือนกับที่hg updateเคยทำ แต่ในทางกลับกันคุณจะไม่บ่นเกี่ยวกับ หลายหัว ฉันจะใช้hg revertถ้าฉันร่วมมือกับผู้อื่นที่ทำงานของตัวเองตามการแก้ไข 45 แล้วมิฉะนั้นhg updateจะชัดเจนกว่านี้


2
คำตอบที่น่ากลัว ฉันใช้ hg revert - all --rev ## และช่วยฉันไว้: D
Van Thoai Nguyen

1
จะดีกว่าไหมที่จะปิดสาขาที่ห้อยอยู่ด้วย? สิ่งนี้จะป้องกันการเตือนในอนาคตบนที่เก็บ ดูstackoverflow.com/a/3688320/900130
Zoltán

หมายเหตุ: hg revert - all --rev xxx จะแก้ไขไฟล์ในเครื่องที่จำเป็นในการเปลี่ยนกลับจากตำแหน่งที่คุณอยู่ใน repo ในเครื่องของคุณ ดังนั้นคุณต้องอัปเดตก่อนหน้านี้เป็นตำแหน่งที่คุณต้องการเปลี่ยนกลับ
Vincent

หากต้องการแยกรุ่นก่อนหน้าออกไปฉันต้องเปลี่ยนกลับก่อนแล้วจึงอัปเดต ที่ถูกกล่าวว่าคำอธิบายที่ทึบน้อยกว่ามากที่สุด
CodeLurker

30

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

hg revert path/to/file -r-2

ซึ่ง-2จะเปลี่ยนกลับไปเป็นเวอร์ชันก่อนที่จะส่งมอบครั้งล่าสุดโดยใช้-1เพียงแค่เปลี่ยนกลับการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับในปัจจุบัน


1
ฉันพบว่ามันมีประโยชน์มาก แน่นอนว่าสำหรับตัวเลือก -r คุณสามารถระบุหมายเลขการแก้ไขได้
Alex

คุณสามารถเลือกการแก้ไขเฉพาะได้ เช่นhg revert path/to/file -r478
Matt

7

IMHO hg strip -r 39เหมาะกับกรณีนี้ดีกว่า

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


ไม่ทราบเกี่ยวกับสิ่งนี้ ง่ายกว่าและสะอาดกว่าการลบและคัดลอกซ้ำ repo ขอบคุณ
Reinstate Monica - notmaynard

6

หลังจากใช้hg update -r REVแล้วจะไม่ชัดเจนในคำตอบเกี่ยวกับวิธีการยอมรับการเปลี่ยนแปลงนั้นเพื่อให้คุณสามารถผลักดัน

หากคุณเพียงแค่พยายามคอมมิชชันหลังการอัพเดท Mercurial จะไม่คิดว่าจะมีการเปลี่ยนแปลงใด ๆ

ก่อนอื่นฉันต้องทำการเปลี่ยนแปลงไฟล์ใด ๆ (พูดใน README) ดังนั้น Mercurial จึงยอมรับว่าฉันได้ทำการเปลี่ยนแปลงใหม่จากนั้นฉันก็สามารถยอมรับได้

สิ่งนี้จะสร้างสองหัวดังกล่าว

เพื่อกำจัดหัวอื่น ๆ ก่อนที่จะผลักดันฉันจากนั้นทำตามขั้นตอนNo-Op Mergesเพื่อแก้ไขสถานการณ์นั้น

จากนั้นฉันก็สามารถผลักดัน


คุณสามารถทำได้commit --close-branchในสาขาเก่า คุณสามารถpush -fผลักหัวใหม่ แต่อาจทำให้เกิดความสับสนว่าเป็นหัวปัจจุบัน
ctrl-alt-delor

5

คำตอบข้างต้นมีประโยชน์มากที่สุดและฉันได้เรียนรู้มากมาย อย่างไรก็ตามสำหรับความต้องการของฉันคำตอบสั้น ๆ คือ:

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

ที่${1}เป็นจำนวนของการแก้ไขหรือชื่อของสาขาที่ สองบรรทัดนี้เป็นส่วนหนึ่งของสคริปต์ทุบตี แต่ทำงานได้ด้วยตัวเองหากคุณต้องการทำด้วยตนเอง

สิ่งนี้มีประโยชน์หากคุณต้องการเพิ่มฮอตฟิกซ์ในรีลีสสาขา แต่ต้องสร้างจากค่าเริ่มต้น (จนกว่าเราจะได้รับเครื่องมือ CI ของเราที่ถูกต้องและสามารถสร้างจากแบรนช์ได้


1

ฉันจะติดตั้ง Tortoise Hg (GUI ฟรีสำหรับ Mercurial) และใช้มัน จากนั้นคุณสามารถคลิกขวาที่การแก้ไขที่คุณอาจต้องการกลับไปที่ - ด้วยข้อความยืนยันทั้งหมดที่มีต่อหน้าต่อตา - และ 'เปลี่ยนไฟล์ทั้งหมด' ทำให้มันใช้งานง่ายและง่ายต่อการย้อนกลับและส่งต่อระหว่างเวอร์ชันของ fileset ซึ่งจะมีประโยชน์มากหากคุณกำลังมองหาเมื่อเกิดปัญหาขึ้นครั้งแรก

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