“ git rm --cached x” เทียบกับ“ git reset head - x”?


163

GitRef.org - พื้นฐาน :

git rmจะลบรายการออกจากพื้นที่จัดเตรียม สิ่งนี้แตกต่างจากgit reset HEADไฟล์ "unstages" เล็กน้อย โดย "unstage" ฉันหมายถึงมันเปลี่ยนพื้นที่การแสดงละครกลับเป็นสิ่งที่อยู่ที่นั่นก่อนที่เราจะเริ่มแก้ไขสิ่งต่างๆ git rmในทางกลับกันเพียงแค่เตะไฟล์ออกจากสเตจทั้งหมดเพื่อที่จะไม่รวมอยู่ในสแน็ปช็อตการส่งครั้งต่อไปดังนั้นจึงเป็นการลบอย่างมีประสิทธิภาพ

โดยค่าเริ่มต้น a git rm fileจะลบไฟล์ออกจากพื้นที่จัดเตรียมทั้งหมดและปิดดิสก์ของคุณ> (ไดเรกทอรีทำงาน) git rm --cachedที่จะออกจากแฟ้มในไดเรกทอรีการทำงานที่คุณสามารถใช้

แต่อะไรคือความแตกต่างระหว่างgit rm --cached asdและgit reset head -- asd?

คำตอบ:


219

มีสามที่ที่ไฟล์สามารถพูดได้ - ต้นไม้ดัชนีและสำเนาการทำงาน เมื่อคุณเพิ่มไฟล์ลงในโฟลเดอร์คุณกำลังเพิ่มไฟล์ลงในสำเนาที่ใช้งานได้

เมื่อคุณทำบางสิ่งเช่นgit add fileคุณเพิ่มลงในดัชนี และเมื่อคุณส่งมอบคุณจะเพิ่มเข้าไปในต้นไม้เช่นกัน

มันอาจจะช่วยให้คุณรู้จักการตั้งค่าสถานะทั่วไปอีกสามค่าในการรีเซ็ต git

รีเซ็ต git [- <mode>] [ <commit>]

แบบฟอร์มนี้ตั้งค่าส่วนหัวสาขาปัจจุบันเป็น<commit>และอาจปรับปรุงดัชนี (รีเซ็ตเป็นต้นไม้ของ<commit>) และแผนผังการทำงานขึ้นอยู่กับ<mode>ซึ่งต้องเป็นหนึ่งในสิ่งต่อไปนี้: -
soft

ห้ามแตะไฟล์ดัชนีหรือแผนผังการทำงานเลย (แต่จะรีเซ็ตส่วนหัวเป็น<commit>เหมือนทุกโหมดที่ทำได้) สิ่งนี้จะทำให้ไฟล์ที่ถูกเปลี่ยนแปลงทั้งหมดของคุณ "การเปลี่ยนแปลงที่จะเกิดขึ้น" เนื่องจากสถานะ git จะถูกใส่เข้าไป

--mixed

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

--hard

รีเซ็ตดัชนีและแผนผังการทำงาน การเปลี่ยนแปลงใด ๆ กับไฟล์ที่ถูกติดตามในแผนผังการทำงานตั้งแต่<commit>ถูกยกเลิก

ตอนนี้เมื่อคุณทำสิ่งที่ชอบgit reset HEAD- สิ่งที่คุณกำลังทำอยู่จริงgit reset HEAD --mixedและมันจะ "รีเซ็ต" ดัชนีเป็นสถานะก่อนที่คุณจะเริ่มเพิ่มไฟล์ / เพิ่มการแก้ไขดัชนี (ผ่านgit add) ในกรณีนี้สำเนาการทำงานและ index (หรือ staging) ซิงค์กันแล้ว แต่คุณทำให้ HEAD และดัชนีตรงกันเมื่อทำการรีเซ็ต

git rmในทางกลับกันจะลบไฟล์ออกจากไดเรกทอรีการทำงานและดัชนีและเมื่อคุณส่งไฟล์จะถูกลบออกจากทรีเช่นกัน git rm --cachedอย่างไรก็ตามจะลบไฟล์ออกจากดัชนีเพียงอย่างเดียวและเก็บไว้ในสำเนาการทำงานของคุณ นี่คือสิ่งที่ตรงกันข้ามgit add file ในกรณีนี้คุณสร้างดัชนีให้แตกต่างจาก HEAD และการทำงานโดยที่ HEAD มีไฟล์เวอร์ชันที่คอมมิทไว้ก่อนหน้านี้สำเนาการทำงานมีการแก้ไขครั้งล่าสุดหากเนื้อหาใด ๆ หรือจาก HEAD ของ ไฟล์และคุณลบไฟล์ออกจากดัชนี การคอมมิทจะซิงค์ดัชนีและแผนผังและไฟล์จะถูกลบ


ผมสังเกตเห็นว่าหลังจากที่คำสั่งไม่แสดงความแตกต่างใด ๆ แต่แสดงให้เห็นความแตกต่างเช่นถ้ามันจะยังคงเก็บไว้ชั่วคราว แต่แสดงให้เห็นไฟล์ที่เป็น ดูเหมือนจะไม่สอดคล้องกัน git rm --cachedgit diffgit diff --cachedgit statusUntracked
haridsv

7
ไม่เป็นไร ... git reset --mixedฉันควรจะใช้ ฉันเป็นเพียงเล็กน้อยสับสนโดยคำสั่งที่อยู่ฝั่งตรงข้ามของgit rm --cached git addถ่ายอย่างแท้จริงมันไม่ถูกต้องและอาจทำให้เกิดความเสียหาย ในกรณีของฉันฉันใช้git addเพื่อเพิ่มไฟล์ที่แก้ไขไปยังพื้นที่จัดเตรียมและต้องการตรงข้ามกับ "ที่เพิ่ม" ไม่ใช่การเพิ่มเริ่มต้นของไฟล์ คำตอบของ Greg Hewgill ช่วยให้ฉันเห็นภาพชัดเจนขึ้น
haridsv

12
ฉันพบว่าการใช้งานสำเนาต้นไม้และต้นไม้ทำงานสับสนเล็กน้อย ต้นไม้ทำงานเป็นต้นไม้ที่ทำงานหรือต้นไม้?
Nealv

3
ดังที่ @haridsv พูดถึงการพูดว่าgit rm --cached'ตรงข้ามกับgit add file' นั้นทำให้เข้าใจผิด เป็นผู้ใกล้ชิดที่จะเป็นตรงข้ามของgit reset file git add file
Matt Browne

@Nealv ล่าช้า แต่สำหรับคนอื่น ๆ ที่พบหัวข้อนี้: สำเนาการทำงานต้นไม้และต้นไม้การทำงานทั้งหมดอ้างถึงสิ่งเดียวกัน (ในบริบทของคอมไพล์)
De Novo

83

บางทีตัวอย่างจะช่วย:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

กับ

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

โปรดทราบว่าหากคุณไม่ได้เปลี่ยนแปลงอะไรอีกการกระทำที่สองจะไม่ทำอะไรเลย


3
คุณบอกฉันได้ไหมว่ายัติภังค์สองเท่า - หลังจากที่ HEAD แปลว่าอะไร?
yuva

30
@yuva: --ใช้เพื่อแยกตัวเลือกคำสั่งจากชื่อไฟล์ หากมีทั้งสาขาและชื่อไฟล์asdแล้วgit reset HEAD asdจะคลุมเครือ คำ--ว่า "ทุกอย่างที่ตามมานี้เป็นชื่อไฟล์"
Greg Hewgill

เป็นgit reset HEAD <file>เช่นเดียวกับgit rm --cached <file>และจากนั้นgit add --intent-to-add <file>?
แอลกอฮอล์เป็นสิ่งชั่วร้าย

1
@ ไม่มีแอลกอฮอล์ยกเว้นในกรณีพิเศษ ดูนี้ดีเยี่ยมคำตอบสั้น
De Novo

45

git rm --cached fileจะลบไฟล์ออกจากสเตจ นั่นคือเมื่อคุณส่งไฟล์จะถูกลบออก git reset HEAD -- fileจะรีเซ็ตไฟล์ในพื้นที่จัดเตรียมไปยังสถานะที่เคยทำไว้กับ HEAD เช่นจะยกเลิกการเปลี่ยนแปลงใด ๆ ที่คุณทำตั้งแต่เริ่มทำงานครั้งล่าสุด หากการเปลี่ยนแปลงนั้นเกิดขึ้นเมื่อทำการเพิ่มไฟล์ใหม่ไฟล์เหล่านั้นจะเทียบเท่ากัน


7
เมื่อรวมกับความคิด (ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ) ที่git rm --cached fileค่อนข้างตรงกันข้ามgit addคำตอบนี้ทำให้ฉันมีความรู้สึกอย่างมากและค่อนข้างกระชับ เกือบจะสั้นเท่ากับความคิดเห็นนี้)
rbatt

2
@rbatt เพียงที่จะนำความคิดเห็นที่นี่เช่นกันและชี้แจงไม่ได้เป็นตรงข้ามของgit rm --cached file git add fileพฤติกรรมนี้ตรงข้ามgit add fileกับกรณีที่คุณเพิ่มไฟล์ใหม่ที่ไม่ได้ติดตามก่อนหน้านี้ ในทุกกรณีอื่น ๆ ที่ตรงข้ามของมีgit add file ยังย้อนกลับในกรณีแรก (เพิ่มไฟล์ที่ไม่ได้ติดตาม) และในทุกกรณีซึ่งเป็นสาเหตุที่เป็นสิ่งที่ git แนะนำให้ทำถ้าคุณต้องการย้อนกลับ git เพิ่ม git reset HEAD filegit reset HEAD filegit add file
De Novo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.