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ดังนั้นในขณะที่คุณได้รับการตรวจสอบออกคุณทำงานmastergit reset
คำตอบที่ได้รับการโหวตด้านบนโดยทั่วไปดีมาก แต่ฉันคิดว่าฉันจะเพิ่มคำตอบนี้เพื่อแก้ไขคำตอบหลาย ๆ อย่างด้วยความเข้าใจผิด
เปลี่ยนสาขาของคุณ
git reset --soft <ref>: <ref>รีเซ็ตตัวชี้สาขาสำหรับการตรวจสอบในขณะนี้จากสาขาการกระทำที่อ้างอิงที่ระบุ ไฟล์ในไดเรกทอรีทำงานและดัชนีของคุณจะไม่เปลี่ยนแปลง การยืนยันจากสเตจนี้จะนำคุณกลับไปยังที่ที่คุณอยู่ตรงหน้าgit resetคำสั่ง
เปลี่ยนดัชนีของคุณด้วย
git reset --mixed <ref>
หรือเทียบเท่า
git reset <ref>:
ทำอะไรและ--softจะรีเซ็ตดัชนีให้ตรงกับการคอมมิตที่การอ้างอิงที่ระบุ ในขณะที่ไม่ทำอะไรเลย (เพราะมันบอกว่าย้ายสาขาที่เช็คเอาต์ไปยังสาขาที่เช็คเอาต์) หรือเทียบเท่าเป็นคำสั่งทั่วไปและมีประโยชน์เพราะมันจะรีเซ็ตดัชนีไปยังสถานะของการกระทำครั้งล่าสุดของคุณgit reset --soft HEADgit reset --mixed HEADgit reset HEAD
เปลี่ยนไดเรกทอรีทำงานของคุณด้วย
git reset --hard <ref>: ไม่สิ่งที่--mixedไม่และยังเขียนทับไดเรกทอรีการทำงานของคุณ คำสั่งนี้คล้ายกับgit checkout <ref>ยกเว้นว่า (และนี่คือจุดสำคัญเกี่ยวกับreset) การgit resetเคลื่อนย้ายทุกรูปแบบที่การอ้างอิงสาขาHEADถูกชี้ไป
หมายเหตุเกี่ยวกับ "คำสั่งดังกล่าวและย้ายหัว":
HEADมันไม่เป็นประโยชน์ที่จะพูดคำสั่งย้าย คำสั่งใด ๆ HEADว่าการเปลี่ยนแปลงที่คุณอยู่ในกระทำของคุณย้ายประวัติศาสตร์ นั่นคือสิ่งที่HEAD เป็นตัวชี้ไปทุกที่ที่คุณอยู่ HEADเป็นคุณและจะย้ายทุกครั้งที่คุณทำ