ฉันจะสลับพื้นที่เก็บข้อมูล git ของฉันไปเป็นการกระทำที่เฉพาะเจาะจงได้อย่างไร


191

ในที่เก็บของคอมไพล์ของฉันฉันทำคอมมิท 5 อย่างด้านล่างในบันทึกคอมไพล์ของฉัน:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

ฉันจะย้อนกลับ 4 คอมมิชชันก่อนหน้าของฉันในพื้นที่ในสาขาได้อย่างไร? กล่าวอีกนัยหนึ่งฉันจะสร้างสาขาที่ไม่มีข้อผูกพัน 4 ล่าสุดของฉันได้อย่างไร (สมมติว่าฉันมี SHA ของการส่งข้อมูลนั้นจากบันทึก git)

คำตอบ:


233

วิธีสร้างสาขาใหม่ (ภายในเครื่อง):

  • ด้วยแฮชการกระทำ (หรือส่วนหนึ่งของมัน)

    git checkout -b new_branch 6e559cb
    
  • หรือย้อนกลับ 4 คอมมิทจาก HEAD

    git checkout -b new_branch HEAD~4
    

เมื่อสาขาใหม่ของคุณถูกสร้างขึ้น (ภายในเครื่อง) คุณอาจต้องการจำลองการเปลี่ยนแปลงนี้ในรีโมตชื่อเดียวกัน: ฉันจะผลักดันการเปลี่ยนแปลงของฉันไปยังสาขารีโมตได้อย่างไร


สำหรับการทิ้งช่วงสามกระทำให้ดูคำตอบ Lunaryorn ด้านล่าง


สำหรับการย้ายหัวสาขาปัจจุบันของคุณไปที่ระบุกระทำโดยไม่ต้องสร้างสาขาใหม่ให้ดูคำตอบ Arpiagar ด้านล่าง


160

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

 git checkout <commit_hash>

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


จากนั้นคุณอาจต้องการกลับไปที่การคอมมิทล่าสุด & แก้ไข HEAD ที่แยกออก:

แก้ไข Git ที่ถอดออกหัวได้หรือไม่


1
นี้จะแยกหัว ไม่สะดวก.
IgorGanapolsky

แม้ว่า<commit_hash>จะอยู่ในสาขาต่าง ๆ ซึ่งอยู่ข้างหน้า?
Ciasto piekarz

คำถามที่เชื่อมโยงเพิ่งพูดถึงgit checkout masterข้างหนึ่งหรือสองกรณีขอบที่อาจนำไปใช้กับบางสถานการณ์
i336_

66

หากคุณต้องการที่จะทิ้งสี่ล่าสุดที่ทำไปใช้:

git reset --hard HEAD^^^^

หรือคุณสามารถระบุแฮชของการคอมมิตที่คุณต้องการรีเซ็ตเป็น:

git reset --hard 6e559cb

4
ขั้นตอนนี้จะแยกออกจากกัน หากเขาทำสิ่งที่แสดงไว้ที่นี่อย่างแน่นอนเขาจะสูญเสียอันดับต้น ๆ อย่างถาวร
Jimmy Cuadra

3
ไม่จำเป็นต้องเป็นการถาวร - ใครสามารถรับ SHA ของหัวหน้าก่อนหน้านี้ผ่านทางgit reflogและรีเซ็ตกลับไป - แต่มันจะทิ้งพวกเขาไปใช่
เหลืองอำพัน

1
หากความมุ่งมั่นถูกผลักก่อนแล้วจึงรีเซ็ตพวกเขาสามารถดึงได้อีกครั้งด้วยการดึง
Rick Smith

17

เพียงแค่ชำระค่าคอมมิชชันที่คุณต้องการให้สาขาใหม่ของคุณเริ่มต้นและสร้างสาขาใหม่

git checkout -b newbranch 6e559cb95

0

ฉันจะย้อนกลับ 4 คอมมิชชันก่อนหน้าของฉันที่โลคัลในสาขาได้อย่างไร?

ซึ่งหมายความว่าคุณไม่ได้สร้างสาขาใหม่และเข้าสู่สถานะเดี่ยว วิธีใหม่ในการทำนั่นคือ:

git switch --detach revison

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