Git Pull เป็นไปไม่ได้ไฟล์ที่ไม่ได้ผสาน


90

ฉันได้อ่านคำถามที่คล้ายกันทั้งหมดเกี่ยวกับเรื่องนี้ ดูเหมือนว่าสิ่งต่อไปนี้ไม่ได้ผล:

Delete offending files
git reset --hard HEAD
git stash
git pull

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

เพิ่งลอง:

git stash
git pull

ยังไม่ได้ผล

ข้อมูลเพิ่มเติม

มีการกระทำในท้องถิ่นหนึ่งรายการและต้นน้ำก็มีการกระทำเช่นกัน ฉันได้ลองแล้วgit pull --rebaseแต่ก็ยังทำงานไม่ถูกต้อง ... นั่นทำให้ฉันมีข้อผิดพลาด - "ออกเนื่องจากความขัดแย้งที่ยังไม่ได้แก้ไข" ถ้าทำgit stash, git reset --hard HEAD, git pull --rebaseฉันได้รับข้อผิดพลาด "ดึงไม่ได้การเปลี่ยนแปลงที่ไม่ได้ผสาน ... "

คำตอบ:


202

พูดว่ารีโมตคือoriginและสาขาอยู่masterและบอกว่าคุณได้ชำระเงินแล้วmasterอาจลองทำสิ่งต่อไปนี้:

git fetch origin
git reset --hard origin/master

โดยพื้นฐานแล้วจะใช้สาขาปัจจุบันและชี้ไปที่HEADสาขาระยะไกล

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

หรือคุณสามารถใช้คำสั่งประปาเพื่อทำสิ่งเดียวกัน:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

แก้ไข: ฉันต้องการอธิบายสั้น ๆ ว่าเหตุใดจึงได้ผล

.gitโฟลเดอร์สามารถถือกระทำสำหรับจำนวนของที่เก็บใด ๆ เนื่องจากคอมมิตแฮชเป็นวิธีการตรวจสอบเนื้อหาของคอมมิตไม่ใช่แค่ค่าที่สร้างแบบสุ่มเท่านั้นจึงใช้เพื่อจับคู่ชุดคอมมิตระหว่างที่เก็บ

สาขาเป็นเพียงตัวชี้ชื่อของแฮชที่กำหนด นี่คือชุดตัวอย่าง:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

ไฟล์เหล่านี้แต่ละไฟล์มีแฮชที่ชี้ไปที่คอมมิต:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

เหล่านี้ทั้งหมดสำหรับกลไกการจัดเก็บคอมไพล์ภายในและการทำงานเป็นอิสระจากไดเรกทอรีการทำงาน โดยดำเนินการดังต่อไปนี้:

git reset --hard origin/master

git จะชี้สาขาปัจจุบันที่ค่าแฮชเดียวกับที่ต้นทาง / ต้นแบบชี้ไป จากนั้นจึงเปลี่ยนไดเร็กทอรีการทำงานให้ตรงกับโครงสร้างไฟล์ / เนื้อหาที่แฮชนั้น

หากต้องการดูสิ่งนี้ในที่ทำงานโปรดลองทำสิ่งต่อไปนี้:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

2
จากการแก้ไขที่ได้รับการอนุมัติล่าสุดได้เพิ่มคำเตือนขนาดใหญ่ในตอนต้นเช่นเดียวกับที่จะชี้ให้เห็นว่ามีการกล่าวถึงแล้ว: "จากนั้น [git] จะเปลี่ยนไดเร็กทอรีการทำงานให้ตรงกับโครงสร้างไฟล์ / เนื้อหาที่แฮชนั้น" แต่เดาว่าไม่ชัดเจนพอ
Trevor Norris


6

แก้ไขโดยใช้ชุดคำสั่งต่อไปนี้:

git reset --hard
git pull --rebase
git rebase --skip
git pull

เคล็ดลับคือการปรับฐานการเปลี่ยนแปลงใหม่ ... เรามีปัญหาในการแก้ไขข้อผิดพลาดเล็กน้อยดังนั้นเราจึงข้ามไปโดยใช้ git rebase --skip (หลังจากคัดลอกไฟล์แล้ว)


3

หากคุณเคยได้รับปัญหานี้หลังจากเรียกใช้ a git fetchแล้ว git ไม่อนุญาตให้คุณเรียกใช้git pullเนื่องจากข้อขัดแย้งในการผสาน ( ทั้งไฟล์ที่แก้ไข / ไม่ได้ผสานและทำให้คุณหงุดหงิดมากขึ้นจะไม่แสดงเครื่องหมายความขัดแย้งใด ๆ ใน ไฟล์เนื่องจากยังไม่ได้รวม) หากคุณไม่ต้องการให้งานเสียคุณสามารถดำเนินการดังต่อไปนี้

จัดเวทีไฟล์

$ git add filename

จากนั้นซ่อนการเปลี่ยนแปลงในท้องถิ่น

$ git stash

ดึงและอัปเดตไดเร็กทอรีการทำงานของคุณ

$ git pull

กู้คืนไฟล์ที่แก้ไขในเครื่องของคุณ (git จะรวมโดยอัตโนมัติหากทำได้หรือแก้ไขได้)

$ git stash pop

หวังว่ามันจะช่วยได้


2

มีวิธีแก้ไขแม้ว่าคุณจะไม่ต้องการลบการเปลี่ยนแปลงในเครื่องของคุณ เพียงแก้ไขไฟล์ที่ไม่ได้ผสาน (โดยgit addหรือgit remove) แล้วทำgit pull.


1

สมมติว่าคุณต้องการที่จะทิ้งการเปลี่ยนแปลงใด ๆ git statusที่คุณต้องตรวจสอบก่อนการส่งออกของ สำหรับไฟล์ใด ๆ ที่ระบุว่า "ได้ผสานรวม" git add <unmerged file>ถัดไปวิ่ง แล้วติดตามด้วยgit reset --hard. ซึ่งจะกำจัดการเปลี่ยนแปลงในเครื่องยกเว้นไฟล์ที่ไม่ได้ติดตาม


โอ้ใช่. อาจไม่ได้บอกว่า "ยังไม่ได้ผสาน" นอกจากนี้ยังสามารถพูดว่า "แก้ไขทั้งสองรายการ" หรืออาจจะเป็นอย่างอื่นหนึ่งหรือสองอย่าง ผลลัพธ์ของgit statusอะไร?
Ryan Stewart

หลังจากโพสต์นี้ฉันบอกสมาชิกในทีมที่จะลองgit rebase --abortและgit pull --rebaseตามข้อเสนอแนะโดยคอมไพล์
คริสเตียนสจ๊วต

1

ฉันได้รับการแก้ไขด้วย git ลบไฟล์ที่ไม่ได้ผสานในเครื่อง

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

เมื่อฉันส่งคอมมิตคอมมิตในภายหลัง:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

0

คำตอบของ Ryan Stewart เกือบจะอยู่ที่นั่นแล้ว ในกรณีที่คุณไม่ต้องการลบการเปลี่ยนแปลงในเครื่องจริงๆมีขั้นตอนการทำงานที่คุณสามารถใช้เพื่อรวม:

  • git statusวิ่ง จะให้รายชื่อไฟล์ที่ไม่ได้ผสาน
  • รวมเข้าด้วยกัน (ด้วยมือ ฯลฯ )
  • วิ่ง git commit

Git จะส่งเพียงการรวมเข้ากับคอมมิตใหม่ (ในกรณีของฉันฉันมีไฟล์เพิ่มเติมในดิสก์ซึ่งไม่รวมอยู่ในคอมมิตนั้น)

จากนั้น Git จะถือว่าการผสานสำเร็จและช่วยให้คุณก้าวไปข้างหน้าได้

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