ก่อนอื่นได้รับ "สาขาของคุณล้ำหน้ากว่าต้นทาง / หลักด้วย 3 คอมมิชชัน" จากนั้นแอพของฉันกลับไปเป็นครั้งก่อนโดยมีการเปลี่ยนแปลงก่อนหน้านี้
ฉันจะได้สิ่งที่ฉันใช้ไปในช่วง 11 ชั่วโมงที่ผ่านมาได้อย่างไร
ก่อนอื่นได้รับ "สาขาของคุณล้ำหน้ากว่าต้นทาง / หลักด้วย 3 คอมมิชชัน" จากนั้นแอพของฉันกลับไปเป็นครั้งก่อนโดยมีการเปลี่ยนแปลงก่อนหน้านี้
ฉันจะได้สิ่งที่ฉันใช้ไปในช่วง 11 ชั่วโมงที่ผ่านมาได้อย่างไร
คำตอบ:
git reflogเป็นเพื่อนของคุณ. ค้นหากระทำที่คุณต้องการจะอยู่ในรายการที่และคุณสามารถตั้งค่าให้กับมัน (ตัวอย่างเช่น: git reset --hard e870e41)
(หากคุณไม่ได้กระทำการเปลี่ยนแปลงของคุณ ... คุณอาจมีปัญหา - ทำ แต่เนิ่น ๆ และทำบ่อย ๆ !)
git log HEAD@{1}ลองดูที่ git reset HEAD@{1}ถ้ารูปลักษณ์ที่เหมือนชุดขวาของกระทำแล้วคุณสามารถ
git fsck --lost-foundพวกเขาจะถูกเก็บไว้ในคอมไพล์และสามารถพบได้กลับมาอย่างง่ายดายโดยใช้คำสั่งเช่น
ก่อนที่จะตอบลองเพิ่มพื้นหลังอธิบายว่านี่HEADคืออะไร
First of all what is HEAD?HEADเป็นเพียงการอ้างอิงถึงการกระทำปัจจุบัน (ล่าสุด) ในสาขาปัจจุบัน
สามารถมีได้เพียงครั้งเดียวHEADในเวลาที่กำหนด (ไม่รวมgit worktree)
เนื้อหาของHEADถูกเก็บไว้ภายใน.git/HEADและประกอบด้วย 40 ไบต์ SHA-1 ของการกระทำปัจจุบัน
detached HEADหากคุณไม่ได้อยู่บนล่าสุดกระทำ - ความหมายที่จะชี้ไปก่อนกระทำในประวัติศาสตร์ก็เรียกว่าHEADdetached HEAD
บนบรรทัดคำสั่งจะมีลักษณะเช่นนี้ - SHA-1 แทนชื่อสาขาเนื่องจากHEADไม่ได้ชี้ไปที่ปลายของสาขาปัจจุบัน:
git checkoutgit checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
นี่จะเช็คเอาท์สาขาใหม่ที่ชี้ไปยังการส่งที่ต้องการ
คำสั่งนี้จะชำระเงินให้กับการส่งที่กำหนด
ณ จุดนี้คุณสามารถสร้างสาขาและเริ่มทำงานจากจุดนี้ใน
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# Create a new branch forked to the given commit
git checkout -b <branch name>
git reflogคุณสามารถใช้reflogเช่นกัน
git reflog จะแสดงการเปลี่ยนแปลงใด ๆ ที่มีการปรับปรุงHEADและการตรวจสอบรายการ reflog ที่ต้องการจะตั้งค่าHEADกลับไปที่การกระทำนี้
ทุกครั้งที่มีการแก้ไข HEAD จะมีรายการใหม่ใน reflog
git reflog
git checkout HEAD@{...}
สิ่งนี้จะนำคุณกลับสู่ความมุ่งมั่นที่คุณต้องการ
git reset --hard <commit_id>"ย้าย" HEAD ของคุณกลับไปยังการกระทำที่ต้องการ
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
git rebase --no-autostashเช่นกันgit revert <sha-1>"เลิกทำ" ช่วงที่กำหนดหรือกระทำ
คำสั่งรีเซ็ตจะ "เลิกทำ" การเปลี่ยนแปลงใด ๆ ที่ทำในการส่งที่กำหนด
การคอมมิทใหม่ด้วยแพทช์การเลิกทำจะถูกส่งไปในขณะที่การคอมมิชชันดั้งเดิมจะยังคงอยู่ในประวัติศาสตร์เช่นกัน
# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>
คีมานี้แสดงให้เห็นว่าคำสั่งใดทำอะไร
ที่คุณสามารถดูมีการปรับเปลี่ยนreset && checkoutHEAD
git reset --hard <commit_id>การลบHEADทำงาน! +1 สำหรับการแสดงกราฟิก !!
git reflog <branchname>จะมีประโยชน์มากเพราะคุณเห็นการเปลี่ยนแปลงของสาขาเดียว
อีกวิธีในการไปยังการคอมมิตที่ถูกลบคือการใช้git fsckคำสั่ง
git fsck --lost-found
สิ่งนี้จะให้ผลลัพธ์ที่บรรทัดสุดท้าย:
dangling commit xyz
เราสามารถตรวจสอบได้ว่ามันเป็นการกระทำแบบเดียวกันกับที่ใช้reflogในคำตอบอื่น ๆ ตอนนี้เราสามารถทำgit merge
git merge xyz
หมายเหตุ:
เราไม่สามารถรับการส่งคืนด้วยfsckถ้าเราได้รันgit gcคำสั่งแล้วซึ่งจะลบการอ้างอิงไปยังการผูกห้อย