สลับการคัดลอกการทำงานเป็นการกระทำ Git ที่ระบุชั่วคราว


248

วิธีการเปลี่ยนไปใช้เฉพาะ Git กระทำโดยไม่สูญเสียกระทำทั้งหมดที่ทำหลังจากที่มัน ?

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

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

วิธีการทำเช่นนี้โดยไม่ต้องซิปโฟลเดอร์ทั้งโครงการ


ที่เกี่ยวข้อง: ย้อนกลับไปยัง Git ก่อนกระทำ

คำตอบ:


344

ถ้าคุณอยู่ที่สาขาบางเพียงไปข้างหน้าและmybranch จากนั้นคุณสามารถกลับไปยังสาขาของคุณโดยgit checkout commit_hash git checkout mybranchผมมีเกมเดียวกันตัดข้อผิดพลาดในวันนี้ :) นอกจากนี้คุณควรรู้เกี่ยวกับแบ่งครึ่งคอมไพล์


6
หมายเหตุคุณสามารถทำได้git checkout commit_hashถ้าคุณอยู่ในพื้นที่เก็บข้อมูลที่สะอาดและไม่จำเป็นต้องทำการแยกสาขา อาจจะง่ายกว่าสำหรับกรณีการใช้งานบางอย่าง (เช่นของฉัน)
enderland

@enderland: HEAD ของคุณมักจะชี้ไปที่สาขาบางแห่งโดยปกติ :)
Alexander Pavlov

ฉันมีปัญหาที่ฉันต้องใช้แฮชคอมมิททั้งหมดเนื่องจากไม่ได้รับการยอมรับบางส่วน
mightyiam

6
โหวตขึ้นสำหรับการgit bisectอ้างอิง; เป็นเครื่องมือที่มีประโยชน์อย่างยิ่ง!
Niek

54

ก่อนอื่นใช้git logเพื่อดูบันทึกเลือกการมอบหมายที่คุณต้องการจดแฮช sha1 ที่ใช้เพื่อระบุการส่ง git checkout hashถัดไปวิ่ง git checkout original_branchหลังจากที่คุณทำ สิ่งนี้มีความได้เปรียบในการไม่ย้าย HEAD เพียงแค่สลับสำเนาการทำงานไปเป็นการกระทำเฉพาะ


4
git checkout <original_branch>ฉันคิดว่าคุณหมายถึง git checkout HEADเป็น NOOP อย่างมีประสิทธิภาพ
Abe Voelker

3
git reset --hard <hash>เปลี่ยน HEAD ของสาขาปัจจุบันในขณะที่git checkout <hash>คุณได้รับเช็คเอาท์แบบเดี่ยวซึ่งจะไม่เปลี่ยนแปลงสาขาใด ๆ และคุณสามารถกลับมาได้โดยง่ายโดยไม่ทราบรหัสแฮชดั้งเดิมของสาขาของคุณดังแสดงในคำตอบนี้
jofel

@Femaref คำถามของผู้เริ่มต้น: เนื่องจากบริบทของคำถามนี้ (เปลี่ยนเป็นการกระทำก่อนหน้านี้ชั่วคราว) ทำไมจึงเป็นข้อได้เปรียบหรือเสียเปรียบในการย้ายหรือไม่ย้าย HEAD?
บ๊องเกี่ยวกับ natty

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

15

นอกจากคำตอบอื่น ๆ ที่นี่แสดงให้คุณเห็นว่าgit checkout <the-hash-you-want>มันคุ้มค่าที่จะรู้ว่าคุณสามารถสลับกลับไปยังตำแหน่งที่คุณใช้อยู่:

git checkout @{-1}

นี่มักจะสะดวกกว่า:

git checkout what-was-that-original-branch-called-again-question-mark

อย่างที่คุณคาดไว้git checkout @{-2}จะนำคุณกลับไปยังสาขาที่คุณอยู่เมื่อสองgit checkoutวินาทีก่อนและหมายเลขอื่น ๆ ในทำนองเดียวกัน หากคุณสามารถจำได้ว่าคุณอยู่ที่ไหนสำหรับตัวเลขที่ใหญ่กว่าคุณควรได้รับเหรียญบางประเภท


น่าเศร้าสำหรับผลผลิตgit checkout @{1}ไม่ได้นำคุณไปสู่สาขาที่คุณจะไปในอนาคตซึ่งเป็นความอัปยศ


1
โปรดทราบว่าgit checkout -เป็นนามแฝงย่อสำหรับgit checkout @{-1}
Nathanael

@Nathanael OMGOD , ไม่มีทาง ... การเปลี่ยนแปลงนี้ทุกอย่าง! ดีมากขอบคุณ! …ฉันจะรวมคำตอบนี้ไว้ด้วย แต่ฉันคิดว่ามันยังมีประโยชน์ที่จะรู้เกี่ยวกับ@{n}ไวยากรณ์ทั่วไปเนื่องจากมันใช้งานได้กับคำสั่ง git จำนวนมาก ฉันพบว่าการเพิ่มชวเลขของคุณโดยไม่ทำให้คำตอบค่อนข้างสับสน แต่ฉันโหวตความคิดเห็นของคุณ - ฉันหวังว่าผู้คนจะเห็น ขอบคุณอีกครั้ง.
Benjohn

1
ไม่มีปัญหา. การสนทนานี้มีจุดสัมผัสกับคำถามจริงต่อไป โบนัสมากขึ้น! ฉันมักจะใช้ไวยากรณ์ที่เหมือนกันสำหรับการรวมคุณสมบัติในรุ่น เช่นgit merge -เพื่อรวมสาขาที่คุณเช็คเอาต์ล่าสุดในสาขาที่เช็คเอาท์ในปัจจุบัน มันเหมือนcd -ทุบตี
นาธานาเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.