Git: ไม่สามารถเลิกทำการเปลี่ยนแปลงในเครื่องได้ (ข้อผิดพลาด: เส้นทาง…ถูกเลิกรวมแล้ว)


337

ฉันได้ติดตามสถานะของต้นไม้ที่ใช้งานได้

$ git status foo/bar.txt
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

มีไฟล์foo/bar.txtอยู่และฉันต้องการให้มันเป็น "ไม่เปลี่ยนแปลงสถานะ" อีกครั้ง (คล้ายกับ 'svn revert'):

$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M       foo/bar.txt

ตอนนี้มันเริ่มสับสน

$ git status foo/bar.txt
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo/bar.txt
#
# 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:   foo/bar.txt
#

ไฟล์เดียวกันในทั้งสองส่วนใหม่และแก้ไข? ฉันควรทำอย่างไรดี?


7
ฉันหวังว่าใครบางคนสามารถอธิบายได้ว่าเราจะเข้าสู่สถานการณ์นี้ได้อย่างไรทำไมมันถึงเกิดขึ้นและทำไมการแก้ปัญหาถึงได้ผล
Marcos Dione

1
ฉันได้เข้าสู่สถานการณ์นี้เมื่อฉันโผล่ที่ซ่อนของฉันหลังจากที่ rebase ซึ่งทำให้ฉันมีความขัดแย้งในการรวม (ป๊อปที่ซ่อนไม่รวม) .... เพื่อแก้ไขมันฉันได้ "ชำระเงิน - พวกเขา" .... เห็นได้ชัดว่า การเปลี่ยนแปลงยังคงอยู่ที่นั่น .... เพื่อลบสิ่งเหล่านั้น .. ฉันลองเช็คเอาต์ไฟล์อีกครั้ง
Arindam Roychowdhury

คำตอบ:


557

คุณทำผิดวิธี คุณตั้งใจจะรีเซ็ตก่อนเพื่อยกเลิกการเปลี่ยนแปลงไฟล์จากนั้นเช็คเอาต์เพื่อยกเลิกการเปลี่ยนแปลงในเครื่อง

ลองสิ่งนี้:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt

ขอบคุณ; ทำงานเหมือนจับใจ! ฉันต้องคอมมิชชัน ( ไม่ใช่กับ -a arg, การเปลี่ยนแปลงที่เกี่ยวข้องถูกจัดเตรียมไว้แล้ว) จากนั้นฉันสามารถกด / ดึงได้เหมือนปกติ
แพทริค

18
สำหรับฉันต้องมี: <br/> $ git reset - foo / bar.txt <br/> เช็คเอาต์ $ git - foo / bar.txt <br/> (โปรดสังเกตส่วนเสริม "-" ในระหว่าง)
มกราคม

4
ไวยากรณ์ที่ดีคือ "git reset HEAD file1 file2 ... " แล้ว "git checkout - file1 file2 ... "
โทมัส Decaux

1
มันน่าขบขันอยู่เสมอเมื่อคำตอบที่ได้รับการโหวตสูงสุดโดยทั่วไปบอกว่า "คุณกำลังทำผิด" :)
nathanchere

4
คำอธิบาย (ในสิ่งที่ทำ) จะได้รับที่ดี ...
Kissaki



-2
git checkout foo/bar.txt

คุณลองทำไหม (ไม่มีคำหลัก HEAD)

ฉันมักจะยกเลิกการเปลี่ยนแปลงของฉันด้วยวิธีนี้


1
ข้อผิดพลาดทั่วไปเมื่อพยายามcheckoutอยู่ท่ามกลางการผสาน: $ git co path/to/file= result => error: path 'path/to/file' is unmerged => ดังนั้นก่อนอื่นให้เรียกใช้: $ git reset path/to/fileแล้วจึงgit checkout path/to/fileควรทำงาน
ไมเคิล

2
การไม่ระบุ HEAD จะทำให้การเช็คเอาต์คอมไพล์ออกจากดัชนีซึ่งเป็นการดำเนินการที่อ่อนแอ (แหล่งเนื้อหาคือดัชนีแทนที่จะเป็น HEAD) นอกจากนี้ฉันไม่คิดว่าจะสร้างความแตกต่างในกรณีนี้ได้เลย - ด้วยปัญหาเฉพาะที่คำถามระบุไว้ ไม่คุณพยายามที่?
Kissaki

-4

ฉันพบว่าคอมไพล์สะสมมีประโยชน์มากสำหรับการจัดการชั่วคราวของสถานะ 'สกปรก' ทั้งหมด


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