กู้คืนไฟล์จากคอมมิทเก่าในคอมไพล์


188

ฉันมีความมุ่งมั่นเก่าที่ฉันทำไม่กี่สัปดาห์ที่ผ่านมา ฉันต้องการกู้คืนไฟล์เดียวจากการส่ง ฉันจะทำอย่างไร


คำตอบ:


222
git checkout 'master@{7 days ago}' -- path/to/file.txt

สิ่งนี้จะไม่เปลี่ยน HEAD แต่จะเขียนทับไฟล์ในเครื่อง path/to/file.txt

ดูman git-rev-parseเพื่อดูรายละเอียดการแก้ไขที่เป็นไปได้ที่นั่น (แน่นอนว่าแฮชธรรมดา (เช่นdd9bacb) จะทำอย่างดี)

อย่าลืมทำการเปลี่ยนแปลง (หลังจากตรวจทาน ... )


15
Wow, @heneryville และ sehe จริง ๆ แล้วฉันคิดว่า '7 วันก่อน' เป็นเมตาสำหรับคุณที่จะคิดออกว่ากระทำอะไร TY!
AnneTheAgile

7
ส่วนที่ 2 เมื่อต้องการเลือกการส่งแบบพิเศษรูปแบบข้างต้นจะไม่ทำงาน ใช้สิ่งที่ Urs แสดงด้านล่างแทนการชำระเงินคอมไพล์ commShaNumber - path / to / file.txt ต่อstackoverflow.com/questions/215718/ …
AnneTheAgile

2
@AnneTheAgile ในความเป็นจริงที่ยังคงตรงไวยากรณ์เดียวกันผมเพิ่งเกิดขึ้นให้เป็นตัวอย่างที่ "ซับซ้อน" ของrevision-specificationนับว่าเป็นสิ่งที่ OP ถาม :)
sehe

1
หากการกระทำของคุณถูกใช้เพื่อลบไฟล์ที่คุณพยายามกู้คืนให้ใช้shacommit~1(เช่น:) git checkout 0f4bbdcd~1 -- path/to/file.txtเพื่อรับการกระทำทันทีก่อน
sdlins

90
  1. git checkout [Revision_Key] -- path/to/fileตรวจสอบไฟล์จากเครื่องเก่าของคุณกระทำผ่านทาง
  2. เพิ่มกระทำส่งตามความเหมาะสม

3
git checkoutสามารถจัดการไฟล์เดียว (ดูคำตอบโดย sehe) ไม่จำเป็นต้องคัดลอกและวาง
Koraktor

1
คีย์การแก้ไขคือ SHA1 สำหรับการส่งหรือไม่
IslandCow

1
แต่โดยทั่วไปแล้วจะเป็นอักขระ 6 ถึง 8 ตัวแรกของ SHA1 เพียงพอที่จะระบุการแก้ไข
Urs Reupke

2
@IslandCow ไม่มีพวกเขาสามารถ sha1 แต่ยังสาขาแท็กหรือสิ่งอื่นใดที่จุดที่จะต้องกระทำเช่นHEAD, ORIG_HEADหรือใด ๆ ของผู้ใช้ร่วมกับ^/ ~/ @สไตล์สัญกรณ์
Alois Mahdal

2
คุณระบุว่าควรจะ "เพิ่ม" ไฟล์หลังจากนั้น แต่นั่นไม่ถูกต้อง ไฟล์ไม่ได้อยู่ในพื้นที่จัดเตรียม เพิ่มแล้ว
xApple

9

ฉันต้องการกู้คืนไฟล์ล่าสุดที่คอมมิทเข้าไปในคอมไพล์ ดังนั้นเพื่อที่จะย้ำและให้มุมมองอื่นคุณต้องทำสิ่งนี้โดยใช้สองขั้นตอนต่อไปนี้:

  1. git log -3
    สิ่งนี้แสดงการกระทำล่าสุดสามรายการ อ่านความคิดเห็นและชื่อผู้แต่งเพื่อที่คุณจะได้ จำกัด รุ่นที่คุณต้องการ จดบันทึกรหัสการส่งข้อมูลแบบยาวนั้น ๆ (เช่น b6b94f2c19c456336d60b9409fb1e373036d3d71) สำหรับเวอร์ชันการส่งที่คุณต้องการ

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    ส่งรหัสยืนยันและชื่อไฟล์ที่คุณต้องการกู้คืน ตรวจสอบให้แน่ใจว่าคุณมีช่องว่างก่อนและหลังเครื่องหมายขีดคั่นคู่

มีหลายวิธีที่จะทำ แต่อันนี้ง่ายกว่าที่ฉันจำได้ หวังว่าจะช่วย

หมายเหตุ:หากคุณอยู่ในพา ธ / โฟลเดอร์โปรเจ็กต์คุณไม่จำเป็นต้องพิมพ์พา ธ ของไฟล์แบบเต็มในคำสั่งเช็คเอาต์


สุดยอดคอมเม้นท์เลยทีเดียว เนื่องจากคำตอบซึ่งเป็นคำตอบที่ยอมรับถือว่าเป็นไฟล์ที่ต้องดึงข้อมูลจะถูกส่งขึ้นต้นน้ำอย่างไรก็ตามคำสั่งนี้จะดึง / เรียกคืนไฟล์ที่มีอยู่ในเครื่องเท่านั้น
ot0

1
เพิ่งลองสิ่งนี้ในโฟลเดอร์รูทของ repo คอมไพล์ในพื้นที่ของฉัน ฉันยังต้องการให้เส้นทางสัมพัทธ์กับไฟล์ เพียงแค่ให้ - [ชื่อไฟล์] ด้วยตัวของมันเองไม่ทำงาน
user2784627

@ ot0 ไม่ไม่คิดอย่างนั้น พวกเขาคือคำตอบเดียวกันทั้งหมด
แมตต์

4

git checkout <tree-ish> -- <pathspec>พูดถึงคำตอบทั้งหมด ในฐานะของ git v2.23.0 มีวิธีการกู้คืนคอมไพล์ใหม่ซึ่งควรถือว่าเป็นส่วนหนึ่งของสิ่งที่git checkoutรับผิดชอบ ดูไฮไลท์ของการเปลี่ยนแปลงในบล็อก GitHub

พฤติกรรมเริ่มต้นของคำสั่งนี้คือการคืนค่าสถานะของแผนภูมิการทำงานที่มีเนื้อหามาจากsourceพารามิเตอร์ (ซึ่งในกรณีของคุณจะเป็นแฮชการกระทำ)

สมมติว่าแฮชการคอมมิชชันเป็นabcdefคำสั่งจะมีลักษณะดังนี้:

git restore --source=abcdef file_name

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

git restore --source=abcdef --worktree --staged file_name

หรือชื่อตัวเลือกสั้น ๆ :

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