ดูเหมือนจะยกเลิกการเปลี่ยนแปลงใน Git ไม่ได้


125

หลังจากเห็นสิ่งต่อไปนี้จากบรรทัดคำสั่ง:

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

ฉันพยายามละทิ้งการเปลี่ยนแปลงของฉันโดยพิมพ์คำสั่ง:

git checkout -- index.htm

แต่เมื่อฉันเรียกใช้สถานะคอมไพล์ใหม่มันก็เหมือนเดิมทุกประการ ดูเหมือนว่าการชำระเงินจะไม่ทำงาน ฉันทำอะไรผิดหรือเปล่า? ฉันใช้ GIT 1.6.1.2 บน windows / cygwin

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

4
ไม่git checkout HEAD -- index.htm(การตรวจสอบออกจากรัฐมุ่งมั่นที่ผ่านมาแทนการตรวจสอบออกจากดัชนี) ผลงาน?
Jakub Narębski

3
git checkout HEAD -- index.htmทำงานให้ฉัน!
Ben Tideswell

คำตอบ:


52

สิ่งนี้รบกวนฉันมาระยะหนึ่งแล้วเกือบทุก repo ที่ฉันตรวจสอบมีการเปลี่ยนแปลงที่ฉันไม่สามารถทิ้งได้ เรื่องสั้นขนาดยาวฉันลองทำทุกข้อแล้วไม่มีอะไรได้ผล นี่คือสิ่งที่ฉันทำเพื่อให้สิ่งต่างๆกลับมาเป็นปกติ (บน Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard

7
หลังจากลองทุกอย่างข้างต้นนี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉัน (บน Windows)
Anders

ขอบคุณ! เช่นเดียวกับที่ Anders บอกวิธีนี้ก็ใช้ได้ผลสำหรับฉันเช่นกัน ฉันแทนที่ autocrlf ด้วย # autocrlf
David

37

นี่คือประสบการณ์ของฉันตั้งค่าตัวแปรต่อไปนี้ใน.git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

จากนั้นเรียกใช้$ git checkout HEAD .และใช้งานได้ แต่$ git checkout -- .ไม่แปลก!

* git เวอร์ชัน 1.9.3


35

ไฟล์มีการเปลี่ยนแปลงอะไรบ้างgit diff? ใน windows ฉันพบปัญหาเกี่ยวกับการสิ้นสุดบรรทัดที่ทำให้เกิดปัญหาเช่นนี้ ในกรณีที่ดูที่การตั้งค่าสิ่งที่คุณมีและgit config core.autocrlf git config core.safecrlfมีบางอย่างที่เป็นเอกสารสำหรับการตั้งค่าเหล่านี้ที่นี่

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

หากคุณพบปัญหาที่เกิดขึ้นgit checkoutจากนั้นgit statusแสดงว่าไฟล์ยังคงถูกแก้ไขและgit diffแสดงว่าไฟล์มีการแก้ไขในทุกบรรทัดในไฟล์นั่นคือปัญหาที่คุณพบ

core.autocrlf

ถ้าเป็นจริงทำให้ git แปลง CRLF ที่ท้ายบรรทัดในไฟล์ข้อความเป็น LF เมื่ออ่านจากระบบไฟล์และแปลงกลับกันเมื่อเขียนไปยังระบบไฟล์ ตัวแปรสามารถตั้งค่าเป็นอินพุตได้ซึ่งในกรณีนี้การแปลงจะเกิดขึ้นเฉพาะในขณะที่อ่านจากระบบไฟล์ แต่ไฟล์จะถูกเขียนด้วย LF ที่ท้ายบรรทัด ปัจจุบันเส้นทางใดที่ต้องพิจารณา "ข้อความ" (กล่าวคืออยู่ภายใต้กลไก autocrlf) จะพิจารณาจากเนื้อหาทั้งหมด

core.safecrlf

หากเป็นจริงให้ตรวจสอบคอมไพล์ว่าการแปลง CRLF ตามที่ควบคุมโดย core.autocrlf สามารถย้อนกลับได้ Git จะตรวจสอบว่าคำสั่งแก้ไขไฟล์ในผังงานไม่ว่าโดยตรงหรือโดยอ้อม ตัวอย่างเช่นการคอมมิตไฟล์ตามด้วยการตรวจสอบไฟล์เดียวกันควรให้ไฟล์ต้นฉบับในโครงสร้างงาน หากไม่ใช่กรณีนี้สำหรับการตั้งค่าปัจจุบันของ core.autocrlf git จะปฏิเสธไฟล์ ตัวแปรสามารถตั้งค่าเป็น "เตือน" ได้ซึ่งในกรณีนี้ git จะเตือนเฉพาะเกี่ยวกับการแปลงที่ไม่สามารถย้อนกลับได้ แต่ดำเนินการต่อไป ...


core.autocrlf = true core.safecrlf ยังไม่ได้ตั้งค่า ควรตั้งค่านี้เป็น true สำหรับ windows หรือไม่ อะไรคือความแตกต่างระหว่างทั้งสอง?

ฉันจะบอกว่าปล่อยให้ทั้งคู่ออกไปถ้าคุณใช้ git svn ฉันได้เพิ่มรายละเอียดเพิ่มเติม
1800 INFORMATION

4
ฉันสมมติว่าเขาหมายถึงหมุนมันอย่างน้อย 90 องศา
vijrox

2
เมื่อฉันตั้งค่าทั้ง core.autocrlf และ core.safecrlf เป็น true ฉันสามารถละทิ้งการเปลี่ยนแปลงที่ตรวจพบในไฟล์ที่กระทำผิดโดยเรียกใช้ 'git reset --hard HEAD'
Aleksey

19

ฉันคิดว่าคุณต้องผ่าน -f

จากหน้าคน ( man git-checkout, GIT-CHECKOUT (1)):

-f, - บังคับ
ดำเนินการแม้ว่าดัชนีหรือโครงสร้างการทำงานจะแตกต่างจาก HEAD นี้จะใช้เพื่อโยนออกไปการเปลี่ยนแปลงในท้องถิ่น

ตัวอย่างเช่นยกเลิกการเปลี่ยนแปลงในสาขาปัจจุบันและเปลี่ยนไปใช้สาขาอื่น:

git checkout -f master

7
ผ่าน -f เพื่ออะไร? จะเป็นการดีที่จะทำให้คำตอบสมบูรณ์
PandaWood

@ แมทตั้งใจจะไม่ชำระเงินสาขาอื่น คำตอบมาจากปี 2009 ดังนั้นฉันจำไม่ได้จริงๆ แต่เมื่อพิจารณาจากคำถามฉันคิดว่าฉันตั้งใจจะผ่าน-fไปที่การชำระเงิน - <ชื่อไฟล์> เหมือนในgit checkout -f -- filename
hasen

@hasen ความคิดเห็นทั้งสามที่คุณขอให้ชี้แจงนั่นคือเหตุผลที่ฉันเพิ่ม "ตัวอย่างเช่น" ตัวอย่างไม่ได้กีดกันการใช้งานอื่น ๆ ของ-f
Matt H

ทำงานให้ฉัน git checkout -f masterโยน "อยู่ใน 'master'" แต่การเปลี่ยนแปลงหายไป
Christian

12

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

git diff index.htm

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

git config core.filemode false

หรือเปลี่ยน git .config ในโปรแกรมแก้ไขข้อความของคุณโดยการเพิ่ม

[หลัก]

filemode = false

หลังจากดำเนินการแล้วคุณสามารถใช้ไฟล์

git รีเซ็ต HEAD index.htm

และไฟล์ควรจะหายไป

(ฉันได้รับทั้งหมดนี้จากคำตอบของฉันจะทำการเปลี่ยนแปลงโหมดละเว้น git ได้อย่างไร (chmod)?และการอัปเดต-file-permissions-only-in-git )


ขอบคุณมาก! ไม่มีคำแนะนำอื่นใดที่ใช้ได้ผลสำหรับฉันในการกำจัดการเปลี่ยนแปลงโหมดไฟล์
Thorkil Værge

6

คุณใช้ OSX หรือ Windows? หากเป็นเช่นนั้นปัญหาอาจเกิดจากการมีสองไฟล์ที่มีชื่อเดียวกันโดยใช้ตัวพิมพ์ต่างกัน เช่น. index.htm และ Index.htm

Windows และ OSX โดยค่าเริ่มต้นจะใช้ระบบไฟล์ที่ไม่คำนึงถึงขนาดตัวพิมพ์ซึ่งขัดแย้งกับคอมไพล์ที่คำนึงถึงตัวพิมพ์เล็กและใหญ่


2

ฉันมีปัญหานี้และหลังจากลองทำตามทั้งหมดข้างต้นแล้วก็ไม่มีอะไรได้ผล

สิ่งที่ได้ผลสำหรับฉันคือการลบไดเร็กทอรีที่มีไฟล์อยู่จากนั้นทำgit statusและตรวจสอบให้แน่ใจว่าไฟล์ทั้งหมดใน dir นั้นถูกทำเครื่องหมายว่าถูกลบแล้ว หลังจากนั้นฉันก็ทำgit checkout -fและทุกอย่างก็กลับมาเป็นปกติ


1

ฉันกำลังทำlibGDXโปรเจ็กต์อยู่Android Studioและฉันต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดที่ฉันได้ทำไปและไม่มีอะไรได้ผลสำหรับฉันวิธีแก้ปัญหาที่ฉันคิดขึ้นมาคือทำการเปลี่ยนแปลงทั้งหมดในสาขาใหม่

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

จากนั้นคุณสามารถลบTRASHสาขาได้หากต้องการ


1

ฉันมีปัญหาเดียวกันไม่มีอะไรจากความคิดเห็นด้านบนที่ใช้งานได้ ปรากฎว่าระบบไฟล์ของฉันไม่คำนึงถึงขนาดตัวพิมพ์ (ค่าเริ่มต้นของ osx แต่ windows อาจทำงานเหมือนกัน) และมีไฟล์ที่มีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กอยู่ในไดเร็กทอรีเดียวกันโดยมีเนื้อหาต่างกัน เนื่องจากในคอมพิวเตอร์ของฉันทั้งสองชื่อชี้ไปที่ไฟล์เดียวกันสถานะ git จึงแสดงการแก้ไขเสมอไม่ว่าฉันจะทำอะไรก็ตาม ในการแก้ไขปัญหา:

  • ฉันต้องลบไฟล์ใดไฟล์หนึ่งออกจากคอมพิวเตอร์เครื่องอื่นและส่งไปที่ repo

  • ลบเวอร์ชันท้องถิ่นทั้งหมดอย่างสมบูรณ์

  • ทำ git clone ตั้งแต่เริ่มต้น


0

ฉันมีปัญหาคล้ายกันซึ่งไม่อนุญาตให้ฉันทิ้งไฟล์ที่ไม่มีอยู่หรือมีการเปลี่ยนแปลง ฉันใช้ Visual Studio ในที่ทำงานและพบว่าสิ่งนี้เกิดขึ้นเมื่อเปลี่ยนสาขาในขณะที่แอปกำลังทำงาน

git checkoutและการพยายามทิ้งไม่ได้ช่วยอะไร มันใช้ไม่ได้หรือแค่บอกว่าฉันไม่ได้รับอนุญาต

โซลูชันที่ใช้งานได้:

  1. เข้าสู่Safe Mode
  2. ทิ้งไฟล์

การเริ่มต้นใหม่เป็นความเจ็บปวด แต่วิธีนี้ได้ผลเร็วกว่าการลอง 100 สิ่ง


0

มีวิธีง่ายๆ หากสิ่งนี้เกิดขึ้น (โดยปกติจากการปิด Windows โดยไม่คาดคิดหรือการถ่ายโอนข้อมูลหน่วยความจำ) และคุณไม่สามารถละทิ้งการเปลี่ยนแปลงของคุณและแม้แต่สลับไปมาระหว่างสาขา (Git บอกว่าคุณไม่มีสิทธิ์เพียงพอ) ในWindowsสภาพแวดล้อมshow all hidden files and foldersจากตัวเลือกโฟลเดอร์ ไปที่ไดเร็กทอรี GIT ของคุณ (ควรจะขึ้นต้นด้วย.git) และลบ"index.lock"ไฟล์ จากนั้น Git ควรให้คุณทำอะไรก็ได้ที่คุณต้องการทำ


0

ฉันลงเอยด้วยการทำgit stashตามด้วยการgit stash cleanกำจัดบางส่วน ไม่เห็นการกำหนดค่า cr / lf อัตโนมัติในเนื้อหา. git / หรือ ~ / .git


0

ในกรณีของฉันฉันไม่สามารถยกเลิกการเปลี่ยนแปลงที่เกี่ยวข้องกับไดเร็กทอรี เช่นเมื่อฉันรัน git diff ฉันจะเห็นสิ่งนี้: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

ดังนั้นฉันจึงเรียกไดเร็กทอรีนั้นและเรียกใช้สถานะคอมไพล์ในนั้น มันอยู่ในสถานะแยก HEAD แล้วฉันก็วิ่งเข้าไปที่git checkout masterนั่น นั่นคือสิ่งที่เหมาะสมสำหรับฉัน แต่สิ่งนี้ไม่เป็นประโยชน์สำหรับสถานการณ์ที่ถามในที่นี่


0

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

git status update

ที่ควรช่วยแก้ไขสิ่งต่างๆ (ในกรณีนี้โดยเฉพาะ)


0

ฉันมีปัญหาเกี่ยวกับสิทธิ์ใน Windows และต้องทำicacls containingFolder /reset /t /l /cแล้วดับเบิลคลิกที่โฟลเดอร์เพื่อรับสิทธิ์กลับคืน


0

ฉันมี. gitattributes ที่มีเนื้อหาต่อไปนี้:

* text=auto eol=lf

เพื่อแก้ไขปัญหานี้ให้แก้ไข.gitattributesเพื่อลบบรรทัดนี้ซึ่งช่วยคลายการสิ้นสุดบรรทัด จากนั้นgit reset --hard HEADคืนไฟล์และ.gitattributesไฟล์


0

สำหรับฉันปัญหานี้เกิดขึ้นจากการรวมกันของการดาวน์โหลดภาพ Git-LFS ที่อัปโหลดผ่าน Netlify CMS และให้บริการที่แตกต่างกันโดยตัวจัดการ Netlify Large Media

วิธีแก้ปัญหาของฉันคือแสดงความคิดเห็น / ลบแถวเหล่านี้ออกจากของฉัน~/.gitconfigเพื่อให้ดูเหมือนด้านล่างจากนั้นตรวจสอบgit statusอีกครั้ง

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

หรือคุณสามารถเพิ่มตัวกรองภายในเครื่องได้มากขึ้นผ่านทาง.gitconfigรากของ repo และเขียนทับกฎตัวกรองสำหรับ lfs ที่นั่น

หวังว่านี่จะช่วยเพื่อน ๆ


-1

ฉันยังประสบปัญหาที่คล้ายกันและขั้นตอนต่อไปนี้ช่วยฉันได้:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

หวังว่ามันจะช่วยคนอื่น ๆ เช่นกัน

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