จะยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับสาขาได้อย่างไร?


116

ฉันทำงานในสาขา (กล่าวคือdesign) และฉันได้ทำการเปลี่ยนแปลงหลายอย่าง แต่ฉันจำเป็นต้องทิ้งมันทั้งหมดและรีเซ็ตให้ตรงกับเวอร์ชันที่เก็บ ฉันคิดว่าgit checkout designจะทำ แต่มันบอกว่าฉันอยู่ในสาขาแล้วdesignและฉันมีไฟล์ที่แก้ไข 3 ไฟล์

ฉันจะยกเลิกการเปลี่ยนแปลงเหล่านั้นและรับสาขาได้อย่างไรในขณะนี้บนเซิร์ฟเวอร์ระยะไกล

คำตอบ:


207

หมายเหตุ: คุณไม่สามารถยกเลิกสิ่งนี้ได้

การลองทำgit checkout -fเช่นนี้จะยกเลิกการเปลี่ยนแปลงในพื้นที่ซึ่งไม่มีข้อผูกมัดในทุกสาขาและหลัก


86

git reset - ฮาร์ดสามารถช่วยคุณได้หากคุณต้องการทิ้งทุกอย่างตั้งแต่การกระทำครั้งสุดท้ายของคุณ


6
หรือgit reset --hard HEAD^
deadfish

28
git reset --hard HEAD^ควรเป็นคำตอบที่ยอมรับได้จริงๆ OP ไม่ได้ถามถึงสาขาอื่น ...
vphilipnyc

2
ฉันลองสิ่งนี้และฉันคิดว่ามันลบทุกอย่างตั้งแต่การผลักดันครั้งสุดท้ายไม่ใช่แค่การกระทำครั้งสุดท้ายของฉัน
Chase Roberts

3
ฉันลองรีเซ็ตคอมไพล์ - ฮาร์ด HEAD ^ แล้วมันยังเหลือไฟล์ที่ไม่ได้ติดตามอีกมากมาย ตอนนี้ไปที่ Google วิธีลบออกด้วยคำสั่งง่ายๆ
John Deighan

20
git diff master > branch.diff
git apply --reverse branch.diff

ขั้นตอนเหล่านี้จะมีประโยชน์มากหากเป้าหมายของคุณตั้งค่าสถานะของสาขาเฉพาะให้เท่ากับสาขาหลัก ในการทำเช่นนั้นให้เรียกใช้สิ่งนี้จากภายในสาขาที่ระบุจากนั้นลบไฟล์ [ชื่อสาขา] .diff เมื่อใช้เสร็จแล้วgit rm [branch name].diff
karolus

18

หากคุณไม่ต้องการให้มีการเปลี่ยนแปลงใด ๆdesignและต้องการให้ตรงกับสาขาของรีโมตคุณสามารถลบสาขาและสร้างใหม่ได้:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
ด้วย: git checkout design; git reset - ต้นกำเนิด / การออกแบบที่ยาก
Dan

ฉันจะยอมรับก่อนที่จะลบสาขา
Asarluhi

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

1
@erewok: คำถามบอกโดยเฉพาะว่าผู้ถามต้องการยกเลิกการเปลี่ยนแปลงทั้งหมด
mipadi

และฉันไม่คิดว่าคำตอบนี้จะประสบความสำเร็จ
erewok

7

@ แต่การแช่คอมไพล์เป็นการสอนคอมไพล์ที่ดีและเรียบง่าย จะแสดงวิธีการยกเลิกการเปลี่ยนแปลงสำหรับกรณีต่อไปนี้: ไม่จัดฉากจัดฉากและผูกมัด ห้องปฏิบัติการ 14-18


2
ฉันแค่อยากจะบอกว่าฉันได้ทำการแช่คอมไพล์แล้ว .. ในอีกหนึ่งปีต่อมา OI! ฉันควรจะทำสิ่งนี้ให้เร็วกว่านี้ ...
จะ

1
สิ่งนี้จำเป็นRubyต้องติดตั้ง.. ซึ่งดูเหมือนจะไม่มีทางเลือกเสมอไป
วิษณุ

5

เมื่อคุณต้องการยกเลิกการเปลี่ยนแปลงในสาขาภายในของคุณคุณสามารถซ่อนการเปลี่ยนแปลงเหล่านี้ได้โดยใช้คำสั่ง git stash

git stash บันทึก "some_name"

การเปลี่ยนแปลงของคุณจะได้รับการบันทึกและคุณสามารถเรียกดูได้ในภายหลังหากคุณต้องการหรือคุณสามารถลบได้ หลังจากทำสิ่งนี้สาขาของคุณจะไม่มีรหัสที่ไม่ได้ผูกมัดและคุณสามารถดึงรหัสล่าสุดจากสาขาหลักของคุณโดยใช้ git pull



0

วิธีการย้อนกลับเพื่อยกเลิกการเปลี่ยนแปลงทั้งหมด:

ฉันพบคำถามนี้หลังจากทำการผสานและลืมที่จะชำระเงินให้พัฒนาทันทีในภายหลัง คุณ guessed มัน: ผมเริ่มปรับเปลี่ยนไม่กี่ไฟล์โดยตรงบนต้นแบบ D'Oh! ในขณะที่สถานการณ์ของฉันแทบจะไม่ซ้ำกันเลย (เราเคยทำมาหมดแล้วใช่ไหม ->) ฉันจะเสนอวิธีย้อนกลับที่ฉันเคยใช้เพื่อละทิ้งการเปลี่ยนแปลงทั้งหมดเพื่อให้ต้นแบบดูเหมือนพัฒนาอีกครั้ง

หลังจากทำgit diffเพื่อดูว่าไฟล์ใดถูกแก้ไขและประเมินขอบเขตข้อผิดพลาดของฉันฉันดำเนินการ:

git stash
git stash clear

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

สมมติว่าตอนนี้ฉันต้องการกู้คืนการเปลี่ยนแปลงเหล่านั้น ฉันสามารถทำได้ ขั้นตอนแรกคือการค้นหาแฮชของที่ซ่อนที่ฉันเพิ่งล้าง / ลดลง:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

หลังจากเรียนรู้แฮชฉันกู้คืนการเปลี่ยนแปลงที่ไม่ได้ผูกมัดสำเร็จด้วย:

git stash apply hash-of-cleared-stash

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

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

Anyhoo หากคุณต้องการวิธีการล้างการเปลี่ยนแปลงสาขาที่ย้อนกลับได้วิธีที่กล่าวมาข้างต้นเป็นวิธีที่อันตรายน้อยกว่าในกรณีการใช้งานนี้


-1

git checkout -f

แค่นี้ก็เพียงพอแล้วสำหรับคำถามของคุณ สิ่งเดียวคือเมื่อเสร็จแล้วมันก็เสร็จ ไม่มีการเลิกทำ

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