ฮาร์ดรีเซ็ตไฟล์เดียว


1005

ขณะนี้ฉันมีไฟล์ที่แก้ไขแล้วสามไฟล์ในไดเรกทอรีงานของฉัน อย่างไรก็ตามฉันต้องการให้หนึ่งในนั้นถูกรีเซ็ตเป็นสถานะ HEAD

ใน SVN, ฉันต้องการใช้svn revert <filename>(ตามด้วยsvn update <filename>ถ้าจำเป็น) แต่ใน Git git reset --hardฉันควรใช้ อย่างไรก็ตามคำสั่งนี้ไม่สามารถทำงานกับไฟล์เดียว

มีวิธีใดใน Git ที่จะละทิ้งการเปลี่ยนแปลงไปยังไฟล์เดียวและเขียนทับด้วย HEAD copy อันใหม่?


3
git checkoutด้านล่างคือคำตอบ ในคอมไพล์ "ย้อนกลับ" เป็นสิ่งที่คุณทำเพื่อกระทำ "ย้อนกลับ" จะชดเชยการย้อนกลับของการส่งประวัติลงในไดเร็กทอรีการทำงานของคุณดังนั้นคุณสามารถสร้างการคอมมิทใหม่ที่ "เลิกทำ" การกระทำที่ย้อนกลับ ฉันพบว่านี่เป็นจุดที่สับสนบ่อยสำหรับผู้ที่มาคอมไพล์จาก svn
Dan Ray


หากคุณมีความสนใจว่าทำไมคุณไม่สามารถทำฮาร์ดรีเซ็ตมีเส้นทางให้ตรวจสอบคำตอบของฉันมี
ผู้ใช้

คำถามนี้สันนิษฐานว่าใครรู้ว่าฮาร์ดรีเซ็ตคืออะไร

คำตอบ:


1808

คุณสามารถใช้คำสั่งต่อไปนี้:

git checkout HEAD -- my-file.txt

... ซึ่งจะอัปเดตทั้งสำเนาการทำงานmy-file.txtและสถานะในดัชนีโดยใช้จาก HEAD

--วิธีการโดยทั่วไป: รักษาทุกอาร์กิวเมนต์หลังจากจุดนี้เป็นชื่อไฟล์ รายละเอียดเพิ่มเติมในคำตอบนี้ ขอบคุณVonC ที่ชี้เรื่องนี้ออกมา


58
คำตอบที่สมบูรณ์มากขึ้น +1;) สำหรับ '-' ดูได้ที่stackoverflow.com/questions/6561142/… (และโดยทั่วไปแล้วstackoverflow.com/questions/1192180/… )
VonC

8
นอกจากนี้อย่าลืมว่าคุณสามารถอ้างอิงการกระทำก่อนหน้าด้วยHEAD~1เพื่อระบุการกระทำสุดท้าย
Ryanmt

14
คุณสามารถออกไปHEADหากคุณเป็นหัวหน้าสาขาปัจจุบัน - ดูnorbauer.com/rails-consulting/notes/ …
cxw

4
ข้อมูลเชิงลึกใด ๆ ว่าทำไมresetคำสั่ง (ตามที่ระบุไว้) "ไม่สามารถทำการฮาร์ดรีเซ็ตด้วยพา ธ " และทำไมcheckoutคำสั่งนั้นไม่ใช้ (ไม่สามารถใช่ไหม) สำหรับการรีเซ็ตฮาร์ดทั้งชุด? (ฉันหมายถึงสาเหตุที่ได้รับการออกแบบมาอย่างดี)
Sz

1
@ cxw น่าเสียดายที่นี่ไม่เป็นความจริงเลย จาก man page ของgit checkout: "เขียนทับพา ธ ในแผนผังการทำงานโดยแทนที่ด้วยเนื้อหาในดัชนีหรือใน <tree-ish>" <tree-ish>นั่นคือถ้าถูกละไว้สิ่งใดก็ตามที่อยู่ในดัชนีจะถูกใช้เพื่อปรับปรุงแผนผังการทำงาน สิ่งนี้อาจหรือไม่อาจแตกต่างจาก HEAD
tuntap

136

รีเซ็ตเป็นหัว:

หากต้องการฮาร์ดรีเซ็ตไฟล์เดี่ยวเป็น HEAD:

git checkout @ -- myfile.ext

โปรดทราบว่าสั้นสำหรับ@ HEADคอมไพล์รุ่นเก่ากว่าอาจไม่รองรับรูปแบบย่อ

รีเซ็ตเป็นดัชนี:

หากต้องการฮาร์ดรีเซ็ตไฟล์เดียวไปยังดัชนีโดยสมมติว่าดัชนีนั้นไม่ว่างเปล่ามิฉะนั้นเป็น HEAD:

git checkout -- myfile.ext

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


1
เกิดอะไรขึ้นกับ "-" ก่อน myfile.ext
Lance Kind

3
@ LanceKind ตามที่ฉันเข้าใจมันใช้เพื่อแบ่งเขตรายชื่อไฟล์ที่ตามมา ก็ไม่มีกรณีที่เมื่อคอมไพล์ตีความขัดแย้งอย่างไม่ถูกต้อง
คิวเมนตัส

2
ไม่ใช่แค่ชื่อไฟล์ การประชุมที่ใช้กันอย่างแพร่หลายแยกตัวเลือกจากข้อโต้แย้งตำแหน่งในสาธารณูปโภคต่างๆ ดูman bashหน้า ยังกล่าวถึงในคำตอบนี้: unix.stackexchange.com/a/187548/142855
boweeb

1
อัตภาพที่จะใช้ในการบอกโปรแกรม-- I've finished specifying "options", and from here on, everything will be a positional argument.อัตภาพ "ตัวเลือก" เป็นสัญญาณเหมือน--recursiveที่สามารถปรากฏในลำดับใด ๆ rm -rfหรือแม้กระทั่งนำมารวมกันในรูปแบบสั้นของพวกเขาเช่นเดียวกับ ในทางตรงกันข้าม "อาร์กิวเมนต์ตำแหน่ง" เป็นเหมือนอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันในภาษาโปรแกรม: ตำแหน่งของพวกเขาในรายการโทเค็นกำหนดสิ่งที่โปรแกรมจะทำกับพวกเขา (เหล่านี้มักเป็นชื่อไฟล์) --ขจัดความกำกวมซึ่งเป็นสิ่งที่
iono


18

ตั้งแต่Git 2.23 (สิงหาคม 2019) คุณสามารถใช้restore( ข้อมูลเพิ่มเติม ):

git restore pathTo/MyFile

ด้านบนจะคืนค่าMyFileในHEAD(การส่งครั้งล่าสุด) ในสาขาปัจจุบัน

หากคุณต้องการได้รับการเปลี่ยนแปลงจากการกระทำอื่น ๆ คุณสามารถย้อนกลับไปที่ประวัติการกระทำ คำสั่งด้านล่างจะได้รับMyFileสองคอมมิตก่อนหน้านี้ ตอนนี้คุณต้องใช้ตัวเลือก-s( --source) ตั้งแต่ตอนนี้คุณใช้master~2และไม่master(ค่าเริ่มต้น) ตามที่คุณกู้คืนแหล่งที่มา:

git restore -s master~2 pathTo/MyFile

นอกจากนี้คุณยังสามารถรับไฟล์จากสาขาอื่น!

git restore -s my-feature-branch pathTo/MyFile

1
วิธีที่ง่ายที่สุดจนถึงตอนนี้ น่าเสียดายที่คำตอบนี้ไม่ได้รับความสนใจเพียงพอ
singrium


4

คุณสามารถใช้คำสั่งด้านล่างเพื่อรีเซ็ตไฟล์เดียว

git checkout HEAD -- path_to_file/file_name

แสดงรายการไฟล์ที่เปลี่ยนแปลงทั้งหมดเพื่อรับpath_to_file/filenameด้วยคำสั่งด้านล่าง

git status

1

คุณสามารถใช้คำสั่งต่อไปนี้:

git reset -- my-file.txt

ซึ่งจะอัปเดตทั้งสำเนาการทำงานของmy-file.txtเมื่อเพิ่ม


ห้ามเปลี่ยนเนื้อหาของไฟล์ที่แก้ไขตามที่ร้องขอ
Rafael

เมื่อคุณเพิ่มในที่เก็บคุณแก้ไขไฟล์หรือไม่
ADDYQU

1
นั่นไม่ใช่จุดที่เฉพาะเจาะจง @ADDQU คำถามคือวิธี "ฮาร์ดรีเซ็ต" ไฟล์ไม่ใช่เพื่อลบออกจากรายการที่จัดฉาก
ราฟาเอล

@Rafael คุณถูกต้อง แต่ฉันต้องการแจ้งให้คุณทราบว่ามีวิธีเกินไป
ADDYQU

0

คุณสามารถใช้คำสั่งต่อไปนี้:

git checkout filename

หากคุณมีสาขาที่มีชื่อไฟล์เดียวกันคุณต้องใช้คำสั่งนี้:

git checkout -- filename

1
สิ่งนี้จะไม่ "ฮาร์ดรีเซ็ต" ไฟล์ - เพียงคัดลอกสถานะดัชนีไปยังแผนผังการทำงาน "ฮาร์ดรีเซ็ต" จะรีเซ็ตดัชนีเป็นครั้งแรก
อา

-21

วิธีที่ง่ายสะดวกและตรงไปตรงมาที่จะพาคุณออกจากน้ำร้อนโดยเฉพาะถ้าคุณไม่สบายใจกับ git:

  1. ดูบันทึกของไฟล์ของคุณ

    git log myFile.js

    กระทำ 1023057173029091u23f01w276931f7f42595f84f ผู้แต่ง: kmiklas วันที่: อังคาร 7 ส.ค. 09:29:34 2018 -0400

    JIRA-12345 - การปรับโครงสร้างด้วยสถาปัตยกรรมใหม่

  2. หมายเหตุแฮชของไฟล์:

    1023057173029091u23f01w276931f7f42595f84f

  3. แสดงไฟล์โดยใช้แฮช ตรวจสอบให้แน่ใจว่าเป็นสิ่งที่คุณต้องการ:

    git แสดง 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js

  4. เปลี่ยนเส้นทางไฟล์เป็นสำเนาโลคัล

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js> myFile.07aug2018.js

  5. สำรองไฟล์ปัจจุบันของคุณ

    cp myFile.js myFile.bak.js

  6. เปิดไฟล์ทั้งสองในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ

    vim myFile.js
    vim myFile.07aug2018.js

  7. คัดลอก n 'วางรหัสจาก myFile.07aug2018.js ไปยัง myFile.js และบันทึก

  8. ยอมรับและผลักดัน myFile.js

  9. ดูบันทึกอีกครั้งและยืนยันว่าไฟล์ของคุณอยู่ในตำแหน่งที่ถูกต้อง

  10. บอกให้ลูกค้าของคุณดึงสิ่งล่าสุดดูอย่างมีความสุขมันทำงานได้กับเวอร์ชั่นเก่า

ไม่ใช่วิธีที่เซ็กซี่ที่สุดหรือเป็นแบบ git-centric และเป็น "manual" reset / reversion แต่ใช้งานได้ มันต้องการความรู้เกี่ยวกับคอมไพล์น้อยที่สุดและไม่รบกวนประวัติศาสตร์การกระทำ


2
คำตอบนี้มีความซับซ้อนและเกิดข้อผิดพลาดมากกว่าโซลูชั่นใด ๆ ที่ลงวันที่ก่อนวันจริง
Artif3x

2
ทำไมทุกคนควรใช้โซลูชันนี้! คำตอบที่แท้จริงเป็นเพียงคำสั่งง่ายๆ
Milad Rahimi

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