จะกู้คืนไดเร็กทอรีทั้งหมดจากประวัติของที่เก็บ git ได้อย่างไร


93

ฉันต้องการกู้คืนไดเร็กทอรีทั้งหมด (เรียกซ้ำ) จากประวัติของที่เก็บ git ของฉัน

มีเพียง 1 สาขา (หลัก)

ฉันรู้ว่าข้อผิดพลาดรวมอยู่ที่ไหน

ฉันสามารถใช้แฮช sha1 ของพาเรนต์คอมมิตเพื่อกู้คืนสถานะของไดเร็กทอรีเหมือนเดิมก่อนที่จะรวมข้อผิดพลาดได้หรือไม่

ฉันคิดเกี่ยวกับสิ่งนี้:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

แต่มันไม่ได้ผล


7
ลองเพิ่ม '-' ระหว่างการแก้ไขและเส้นทาง:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós

สิ่งนี้ช่วยได้ ขอบคุณมาก.
ที่สุด

1
@ CarlosCampderrósเขียนว่าเป็นคำตอบจริงและรวบรวม 15 คะแนนของคุณก่อนที่คนอื่นจะทำ;)
ralphtheninja

@MagnusSkog ฉันไม่แน่ใจว่าจะได้ผลดังนั้นฉันจึงแสดงความคิดเห็นเพื่อตรวจสอบ ตอนนี้ฉันแน่ใจว่ามันใช้งานได้ฉันได้เขียนมันไว้เป็นคำตอบ :)
Carlos Campderrós

2
คำใบ้ทั่วไป "มันใช้ไม่ได้" ไม่มีประโยชน์มากนัก บอกให้เราทราบว่าเหตุใดจึงใช้งานไม่ได้โดยเอาท์พุทข้อผิดพลาด (ตัดแต่งหากยาวมาก)
me_and

คำตอบ:


160

ลองเพิ่ม '-' ระหว่างการแก้ไขและเส้นทาง:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

และหากคุณต้องการกู้คืนไดเร็กทอรีจากคอมมิตก่อนหน้าคุณสามารถแทนที่คอมมิตแฮชด้วย HEAD ~ 1 ตัวอย่างเช่น:

git checkout HEAD~1 -- path/to/the/folder/ 

คำสั่งเดียวกันจุดประสงค์เกือบต่างกัน: stackoverflow.com/questions/953481/…
cregox

20
มีปัญหาอย่างหนึ่ง: OP ไม่ได้ระบุว่าไดเรกทอรียังคงมีอยู่หรือไม่ ในการกู้คืนไดเร็กทอรีที่มีอยู่ให้อยู่ในสถานะของการคอมมิตเนื้อหาของไดเร็กทอรีควรถูกลบออกก่อน ในกรณีอื่นไฟล์ที่มีอยู่ซึ่งไม่มีอยู่ในคอมมิตเก่าจะไม่ถูกลบออก
Alberto

7
+1 @Alberto เห็นด้วยแน่นอน ฉันทำrm -Rf path/to/the/folderแล้วgit checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- ผลลัพธ์: พา ธ นั้นมีไฟล์เดียวกันกับในคอมมิตนั้นไม่มีความแตกต่างและไม่มีไฟล์พิเศษที่ถูกสร้างขึ้นหลังจากคอมมิตนี้ ซึ่งเป็นสิ่งที่ฉันต้องการ
therobyouknow

2
สิ่งที่ไม่--ทำอะไร?
Ray Foss

2
@RayFoss จะบอก git ว่าพารามิเตอร์ต่อไปนี้คือไฟล์ (มิฉะนั้นอาจสับสนกับคอมมิตแฮชสาขาหรืออย่างอื่น) โดยปกติแล้วพวกเขาไม่จำเป็น แต่ก็ไม่เจ็บที่จะวางไว้
Carlos Campderrós

3

มีสองวิธีง่ายๆในการดำเนินการนี้:

หากการกระทำที่มีข้อผิดพลาดรวมเฉพาะข้อผิดพลาดให้ใช้git revertเพื่อสลับผลของข้อผิดพลาดนั้น

ถ้าไม่ใช่เส้นทางง่ายๆคือ:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

ถ้าคุณทำเพียงแค่git checkout <SHA-ID>นั้นมันจะย้ายคุณไปที่ sha-comm ชั่วคราว

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


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