git reset --soft
มีจำนวนของคำตอบอยู่ที่นี่ด้วยความเข้าใจผิดเกี่ยวกับการ ในขณะที่มีเงื่อนไขเฉพาะซึ่งgit reset --soft
จะเปลี่ยนHEAD
(เริ่มจากสถานะแยกเดี่ยว) โดยทั่วไป (และสำหรับการใช้งานที่ตั้งใจ) จะย้ายอ้างอิงสาขาที่คุณได้ตรวจสอบในปัจจุบัน แน่นอนมันไม่สามารถทำได้ถ้าคุณไม่มีสาขาที่เช็คเอาท์ (ดังนั้นเงื่อนไขเฉพาะที่git reset --soft
จะเปลี่ยนเท่านั้นHEAD
)
git reset
ฉันได้พบนี้จะเป็นวิธีที่ดีที่สุดที่จะคิดเกี่ยวกับ คุณไม่ได้เป็นเพียงการเคลื่อนย้ายHEAD
( ทุกอย่างไม่ว่า ) คุณยังย้ายเตะสาขาmaster
เช่น นี้จะคล้ายกับสิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้git commit
(ย้ายสาขาในปัจจุบันพร้อมด้วยHEAD
) ยกเว้นแทนการสร้าง (และจะย้ายไปบริการ) ใหม่กระทำคุณย้ายไปก่อนกระทำ
ตรงนี้คือจุดของreset
, เปลี่ยนสาขาHEAD
อื่นที่ไม่ใช่ใหม่กระทำไม่เปลี่ยนแปลง คุณสามารถเห็นสิ่งนี้ได้ในตัวอย่างเอกสาร:
เลิกคอมมิชชันทำให้เป็นหัวข้อย่อย
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- คุณได้ทำข้อผูกพันบางอย่าง แต่ตระหนักว่าพวกเขาก่อนวัยอันควรจะอยู่ในสาขา "ต้นแบบ" คุณต้องการขัดพวกเขาในสาขาหัวข้อดังนั้นสร้าง "topic / wip" branch ออกจาก HEAD ปัจจุบัน
- กรอกลับสาขาหลักเพื่อกำจัดการกระทำทั้งสาม
- สลับไปที่สาขา "หัวข้อ / wip" และทำงานต่อไป
จุดประสงค์ของชุดคำสั่งนี้คืออะไร คุณต้องการที่จะย้ายสาขาที่นี่master
ดังนั้นในขณะที่คุณได้รับการตรวจสอบออกคุณทำงานmaster
git reset
คำตอบที่ได้รับการโหวตด้านบนโดยทั่วไปดีมาก แต่ฉันคิดว่าฉันจะเพิ่มคำตอบนี้เพื่อแก้ไขคำตอบหลาย ๆ อย่างด้วยความเข้าใจผิด
เปลี่ยนสาขาของคุณ
git reset --soft <ref>
: <ref>
รีเซ็ตตัวชี้สาขาสำหรับการตรวจสอบในขณะนี้จากสาขาการกระทำที่อ้างอิงที่ระบุ ไฟล์ในไดเรกทอรีทำงานและดัชนีของคุณจะไม่เปลี่ยนแปลง การยืนยันจากสเตจนี้จะนำคุณกลับไปยังที่ที่คุณอยู่ตรงหน้าgit reset
คำสั่ง
เปลี่ยนดัชนีของคุณด้วย
git reset --mixed <ref>
หรือเทียบเท่า
git reset <ref>
:
ทำอะไรและ--soft
จะรีเซ็ตดัชนีให้ตรงกับการคอมมิตที่การอ้างอิงที่ระบุ ในขณะที่ไม่ทำอะไรเลย (เพราะมันบอกว่าย้ายสาขาที่เช็คเอาต์ไปยังสาขาที่เช็คเอาต์) หรือเทียบเท่าเป็นคำสั่งทั่วไปและมีประโยชน์เพราะมันจะรีเซ็ตดัชนีไปยังสถานะของการกระทำครั้งล่าสุดของคุณgit reset --soft HEAD
git reset --mixed HEAD
git reset HEAD
เปลี่ยนไดเรกทอรีทำงานของคุณด้วย
git reset --hard <ref>
: ไม่สิ่งที่--mixed
ไม่และยังเขียนทับไดเรกทอรีการทำงานของคุณ คำสั่งนี้คล้ายกับgit checkout <ref>
ยกเว้นว่า (และนี่คือจุดสำคัญเกี่ยวกับreset
) การgit reset
เคลื่อนย้ายทุกรูปแบบที่การอ้างอิงสาขาHEAD
ถูกชี้ไป
หมายเหตุเกี่ยวกับ "คำสั่งดังกล่าวและย้ายหัว":
HEAD
มันไม่เป็นประโยชน์ที่จะพูดคำสั่งย้าย คำสั่งใด ๆ HEAD
ว่าการเปลี่ยนแปลงที่คุณอยู่ในกระทำของคุณย้ายประวัติศาสตร์ นั่นคือสิ่งที่HEAD
เป็นตัวชี้ไปทุกที่ที่คุณอยู่ HEAD
เป็นคุณและจะย้ายทุกครั้งที่คุณทำ