Git pull: ข้อผิดพลาด: รายการ foo ไม่อัปเดต ไม่สามารถผสาน


87

ฉันกำลังพยายามอัปเดต repo ของฉันจากสาขาระยะไกลและได้รับข้อผิดพลาดนี้เมื่อฉันทำการ "git pull" ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในท้องถิ่นและแม้ว่าฉันจะมีฉันก็ไม่จำเป็นต้องเก็บไว้

ฉันพยายามแล้ว:

git reset --hard

และฉันได้รับปัญหาเดียวกัน

สิ่งเดียวที่ดูเหมือนว่าจะได้ผลคือการลบไฟล์ที่ละเมิดและลองดึงคอมไพล์อีกครั้ง

ฉันได้ลองgit stashแล้วตามด้วยไฟล์git pull. ไม่ไป.

แก้ไข: ใช้ PortableGit-1.6.4-preview20090729 ดังนั้นข้อบกพร่องใด ๆ ก่อนหน้านี้ที่มีข้อผิดพลาดปลอมควรได้รับการแก้ไข


ดูว่าคำอธิบายในgit.or.cz/gitwiki/GitFaqช่วยได้หรือไม่
Jakub Narębski

Ditto " สิ่งเดียวที่ดูเหมือนจะได้ผลคือการลบไฟล์ที่มีการละเมิดและลองดึงคอมไพล์อีกครั้ง " สำหรับฉันอย่างน้อยหนึ่งไฟล์ไม่ได้อยู่ในคอมไพล์ มันเป็น. ออกแบบโดยกฎตัวแทน ไม่แน่ใจว่าทำไมพวกเขาถึงเป็นบล็อค
ruffin

3
ฉันสามารถแก้ปัญหานี้ได้โดยการเรียกใช้git rm --cached learned/tests/temp_funcs.py- เนื่องจากฉันยังคงต้องการให้ไฟล์อยู่ในรายการไฟล์ที่ไม่ได้git rm --cachedติดตามฉันจึงเลิกบล็อกในกรณีนี้
ลึก

1
--abortเรื่องนี้เกิดขึ้นกับผมในระหว่างการรวมที่ผมอยากให้เป็น ไม่มีวิธีแก้ปัญหาใดที่เสนอให้ฉันยกเลิกยกเว้นการลบไฟล์ที่ละเมิด
Trevor Reid

คำตอบ:


56

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

เช่นนี้:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

21
จากคำถามเดิมคือ"ฉันเคยลอง" git stash "แล้วตามด้วย" git pull "ไม่ไป"
Charles Wood

ไม่ได้ผลสำหรับฉัน - ในกรณีของฉันฉันต้องgit rm --cachedแสดงความคิดเห็นแบบเต็ม: stackoverflow.com/questions/1248029/…
ลึก

39

สิ่งนี้อาจเกิดขึ้นหากคุณอัปเดตดัชนีเพื่อละเว้นไฟล์บางไฟล์:

git update-index --assume-unchanged <file>

จากนั้นเช่นชำระเงินสาขาอื่น:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

การบังคับให้รีเฟรชดัชนีช่วยแก้ปัญหา:

git update-index --really-refresh
<file>: needs update

ติดตามโดย:

git reset --hard 

แล้วทุกอย่างควรจะกลับมาเป็นปกติ


2
ฉันสามารถแก้ปัญหานี้ได้โดยการเรียกใช้git rm --cached learned/tests/temp_funcs.py- เนื่องจากฉันยังคงต้องการให้ไฟล์อยู่ในรายการไฟล์ที่ไม่ได้git rm --cachedติดตามฉันจึงเลิกบล็อกในกรณีนี้
ลึก

3
git update-index --really-refreshเป็นชิ้นส่วนที่ขาดหายไป! ทำได้ดีสิ่งนี้หายาก
Bernardo Dal Corno

29

ปัญหาประเภทนี้มักเกิดจากการพยายามดึงจากที่เก็บที่มีชื่อไฟล์สองชื่อที่แตกต่างกันในกรณีเท่านั้น หากคุณใช้ FAT, NTFS ในโหมดไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ (โดยพื้นฐานแล้วทุกครั้งที่มีการใช้งานภายใต้ Windows) หรือ HFS + ในโหมดไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่และมีสองไฟล์ "foobar" และ "FOOBAR" Git จะเห็นสองไฟล์ที่แตกต่างกัน ไฟล์ แต่ระบบไฟล์จะเห็นเพียงระบบเดียวซึ่งจะทำให้เกิดปัญหาทุกประเภท Git จะชำระเงินพูดว่า "FOOBAR" จากนั้นชำระเงิน "foobar" ซึ่งระบบไฟล์มองว่าเป็นเพียงการแทนที่เนื้อหาของ "FOOBAR" แต่ปล่อยให้อยู่ในตำแหน่ง ตอนนี้ใน Git ปรากฏว่า "FOOBAR" ถูกแทนที่ด้วยเนื้อหาของ "foobar" และ "foobar" ก็หายไป

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

กรณีอื่นที่คุณสามารถแก้ไขได้คือเมื่อเกิดการเปลี่ยนชื่อที่เปลี่ยนกรณีของไฟล์ ตัวอย่างเช่นสมมติว่าที่เก็บ Git มีการเปลี่ยนชื่อจาก "EXAMPLE" เป็น "example" ก่อนที่ Git จะตรวจสอบเวอร์ชันใหม่โปรแกรมจะพยายามตรวจสอบเพื่อให้แน่ใจว่าไม่ได้เขียนทับไฟล์ที่มีอยู่บางไฟล์ที่คุณมีในดิสก์ เนื่องจากคิดว่า "ตัวอย่าง" เป็นชื่อไฟล์ใหม่ระบบจะถามระบบไฟล์ว่ามีอยู่หรือไม่และระบบไฟล์จะเห็น "EXAMPLE" และตอบว่าใช่ดังนั้น Git จะปฏิเสธที่จะตรวจสอบเวอร์ชันใหม่เนื่องจากคิดว่าจะมีการเขียนทับ ไฟล์ที่ไม่ถูกติดตาม ในกรณีนี้หากคุณไม่มีการเปลี่ยนแปลงในท้องถิ่นที่คุณสนใจวิธีง่ายๆgit reset --hard <revision-to-checkout>โดยทั่วไปจะเพียงพอที่จะทำให้คุณผ่านพ้นปัญหาและไปสู่การแก้ไขใหม่ได้ เพียงพยายามอย่าลืมเปลี่ยนชื่อไฟล์เป็นชื่ออื่นที่แตกต่างกันเฉพาะในกรณีที่คุณใช้ระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่เพราะจะทำให้เกิดปัญหาเช่นนี้


14

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับโพสต์ของ @Brian Campbell (เนื่องจากการรีเซ็ตฮาร์ดก็ไม่ได้ผลเช่นกัน) ฉันต้องการชี้ให้เห็นถึงกรณีขอบที่หยุดฉัน

ฉันได้ย้ายไฟล์OldFileไปยังโฟลเดอร์อื่นและเปลี่ยนชื่อNewFileใหม่ จากนั้นฉันตั้งค่าสถานะไฟล์เป็นassume-unchanged .

นี่เป็นการป้องกันไม่ให้ฉันเปลี่ยนสาขาและไม่มีที่เก็บเพื่อบันทึกหรือกระทำที่จะผลักดัน ปัญหาคือฉันไม่ได้ทำการเปลี่ยนแปลงไฟล์นี้ด้วยชื่อใหม่ก่อนตั้งค่าassume-unchangedสถานะ ดังนั้นฉันจึงตั้งค่ากลับไปno-assume-unchangedกำหนดมันแล้วตั้งค่ากลับไปassume-unchangedและฉันสามารถเปลี่ยนสาขาได้อีกครั้ง


1
คำตอบนี้ทำให้ฉันมาถูกทางแล้วขอบคุณ ฉันใช้ "git ls-files -v | grep '^ [[: lower:]]' | awk '{print $ 2}' | xargs git update-index --no-Assum-unchanged" เพื่อรีเซ็ตค่าสถานะที่ไม่เปลี่ยนแปลง จากนั้นฉันก็สามารถรีเซ็ต - ฮาร์ดได้โดยไม่มีข้อผิดพลาด
ocroquette

ฉันคิดว่าสิ่งนี้ใช้ได้กับไฟล์ที่ทำเครื่องหมาย 'ไม่เปลี่ยนแปลง' เช่นกันฉันมีปัญหาเดียวกันในการเพิกเฉยต่อการเปลี่ยนแปลงไฟล์ในเครื่องที่มีชื่อเดิม ความคิดเห็นของคุณเตือนฉันว่าฉันได้ทำเครื่องหมายไฟล์นั้นแล้วขอบคุณ!
Jake_

5
ผมมีปัญหาเดียวกัน. โดยพื้นฐานแล้ว "ถือว่าไม่เปลี่ยนแปลง" เป็นคุณลักษณะที่ชั่วร้าย เมื่อคุณใช้งานแล้วจะทำให้การชำระเงินสาขาอื่นเป็นเรื่องยากมาก แม้ว่าคุณจะใช้checkout -fมันจะล้มเหลว
John Henckel

13

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


11
จากคำถาม: "ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในท้องถิ่น ... "
Charles Wood

มันเป็นข้อผิดพลาดของคอมไพล์หรือเป็นความเสียหายของที่เก็บ git
Warren P

12

ผมเห็นปัญหาที่คล้ายกัน (Windows 10): ผมในและอยากจะไปbranchA masterฉันมีการเปลี่ยนแปลงที่ผิดปกติบางอย่างก่อนอื่นฉันgit stashก็git checkout -f masterยังได้รับไฟล์Entry 'fileName' not uptodate. Cannot merge.

git status ไม่ได้แสดงสิ่งที่จะกระทำ

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


1
นี่เป็นทางออกเดียวสำหรับคำถามนี้ที่ได้ผลสำหรับฉัน ฉันได้รับข้อผิดพลาดเกี่ยวกับ.gitignoreไฟล์! แม้ว่าฉันจะไม่ได้ทำการเปลี่ยนแปลงใด ๆ กับมันและคอมไพล์ก็ไม่อนุญาตให้ฉัน "ซ่อน" มันไว้ (เพราะไม่มีการเปลี่ยนแปลงในท้องถิ่น duh!) ดังนั้นฉันจึงย้าย.gitignoreไฟล์ออกไปนอกที่เก็บ (เป็นประเภทของ "การสำรองข้อมูล") จากนั้นทำการgit reset --hard"แก้ไข" ที่เก็บให้อยู่ในสถานะที่มีสติ
Masked Man

git statusแสดงให้ฉันเห็นว่าไฟล์ใดมีการเปลี่ยนแปลงและบอกใบ้ว่าฉันสามารถใช้git restore myFileแทนการลบได้ซึ่งได้ผล
Noumenon

7

อาจมีปัญหากับสิทธิ์ของไฟล์ Git กำลังกำหนดเวอร์ชันด้วยเว้นแต่ว่า config จะระบุไว้เป็นอย่างอื่น เพียงแค่เพิ่มคำตอบนี้สำหรับผู้ที่มีปัญหาเกือบ แต่ไม่เหมือน


5

คุ้มค่าที่จะลอง:

คุณช่วยตั้งค่าสำหรับการอัปเดตนี้ให้ตั้งค่าพารามิเตอร์ configcore.trustctimeเป็นเท็จได้ไหม

core.trustctime

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


2
พบดีสิ่งนี้ใช้งานได้จริงสำหรับฉันเมื่อฉันเห็นข้อความแสดงข้อผิดพลาดด้านบนเมื่อเรียกใช้ "git reset --merge" เมื่อฉันตั้งค่าพารามิเตอร์นี้เป็นเท็จมันจะกำจัดข้อผิดพลาด
DemitryT

1
ทำงานให้ฉันเมื่อตรวจสอบความขัดแย้งกับสาขาอื่นโดยใช้ "git merge <feature> --no-ff --no-commit" แล้วเปลี่ยนกลับด้วย "git merge --abort" Xcode คือ "สิ่งที่อยู่นอก Git" ในกรณีนี้ ขอบคุณเกือบ 10 ปีต่อมา!
Ralfonso

@Ralfonso เกือบสิบปีต่อมาคุณยินดีมากที่สุด :)
VonC

2

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


0

ผมมีข้อผิดพลาดเดียวกันหลังจากสถานการณ์ที่git statusกล่าวว่าnew file: foo.cppสำหรับไฟล์ไม่ได้ถูกเพิ่มลงในพื้นที่การจัดเตรียม เช่นภายใต้หัวข้อ "การเปลี่ยนแปลงที่ไม่จัดฉากสำหรับการกระทำ" แปลกมากซึ่งมักจะไม่เกิดขึ้น

วิธีแก้ไข: git add foo.cppแล้วgit stashทำงานอีกครั้ง


0

ฉันพยายามทำการผสานคอมไพล์ - เกี่ยวกับ คำสั่ง git restore your_file ได้แก้ไขปัญหาให้ฉันแล้ว

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