ทำไม git ถึงบอกว่า“ pull เป็นไปไม่ได้เพราะคุณมี unmerged files”?


197

เมื่อฉันพยายามดึงไดเรกทอรีโครงการของฉันใน terminal ฉันเห็นข้อผิดพลาดต่อไปนี้:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

ทำไม git ถึงพูด"Pull is not possible because you have unmerged files"และฉันจะแก้ไขมันได้อย่างไร?


1
ในกรณีของฉันฉันเพิ่งใช้คำสั่งเหล่านี้ "git เพิ่ม" จากนั้น "git commit -m" Test "และในท้ายที่สุด" git push "ข้อผิดพลาดถูกลบออก
Akhzar Nazir

คุณเพียงแค่ต้องเพิ่ม "$ git เพิ่ม <file>" ... เพื่ออัปเดตสิ่งที่จะกระทำหรือกู้คืน (เพื่อยกเลิกการเปลี่ยนแปลงในไดเรกทอรีการทำงาน) จากนั้นยอมรับ "$ git กระทำ" จากนั้น "$ git push" เพื่อสรุปการผสาน
find_X

ในกรณีที่ช่วย: ฉันได้สังเกตเห็นว่าเพิ่งทำ "git เพิ่ม" จากนั้นยืนยันว่าไม่ได้ทำงาน ฉันต้องเพิ่มแต่ละไฟล์ตามชื่อจากนั้นส่งและดึง / ดัน
ouonomos

คำตอบ:


215

สิ่งที่เกิดขึ้นในปัจจุบันคือคุณมีไฟล์บางชุดซึ่งคุณได้ลองผสานก่อนหน้านี้ แต่ไฟล์เหล่านั้นแสดงถึงความขัดแย้งที่ผสานเข้าด้วยกัน git add file.name && git commit -m "removed merge conflicts"จะเป็นการดีถ้าหนึ่งได้รับการผสานความขัดแย้งเขาควรจะแก้ไขปัญหาด้วยตนเองและกระทำการเปลี่ยนแปลงโดยใช้ ขณะนี้ผู้ใช้รายอื่นได้อัปเดตไฟล์ที่เป็นปัญหาในพื้นที่เก็บข้อมูลของเขาและได้ผลักดันการเปลี่ยนแปลงของเขาไปที่ repo ทั่วไปต้นน้ำ

มันเกิดขึ้นที่การผสานของคุณขัดแย้งจาก (อาจ) การกระทำครั้งสุดท้ายไม่ได้รับการแก้ไขดังนั้นไฟล์ของคุณจะไม่ถูกผสานทั้งหมดและด้วยเหตุนี้การตั้งค่าสถานะU( unmerged) สำหรับไฟล์ ดังนั้นตอนนี้เมื่อคุณทำ a git pullคอมไพล์กำลังทิ้งข้อผิดพลาดเนื่องจากคุณมีไฟล์บางเวอร์ชันซึ่งไม่สามารถแก้ไขได้อย่างถูกต้อง

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

ตัวอย่างการทำซ้ำและการแก้ไขปัญหา:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

ก่อนอื่นให้เราสร้างโครงสร้างที่เก็บ

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

ตอนนี้เราอยู่ใน repo_clone และถ้าคุณทำgit pullมันจะทำให้เกิดความขัดแย้ง

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

หากเราเพิกเฉยต่อความขัดแย้งในโคลนและทำพันธะเพิ่มเติมในธุรกรรมซื้อคืนเดิมทันที

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

แล้วเราก็ทำgit pullเราได้

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

โปรดทราบว่าfileขณะนี้อยู่ในสถานะ unmerged และถ้าเราทำgit statusเราสามารถเห็นได้อย่างชัดเจน:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

ดังนั้นเพื่อแก้ไขปัญหานี้เราต้องแก้ไขความขัดแย้งที่เราไม่สนใจก่อนหน้านี้ก่อน

repo_clone $ vi file

และตั้งค่าเนื้อหาเป็น

text2
text1
text1

จากนั้นเพิ่มและดำเนินการเปลี่ยนแปลง

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts

1
เพื่อให้เสร็จสมบูรณ์ฉันจะเพิ่มคำตอบของ @ Pawan เพื่อใช้ 'git mergetool' เพื่อแก้ไขข้อขัดแย้ง ขั้นตอนที่สองถึงครั้งสุดท้ายอาจไม่สามารถใช้งานได้จริงมาก ("แก้ไขการรวม ... [โดยการตั้งค่า] ... เนื้อหาเป็น: [ข้อความบางข้อความ" ")
undeniablyrob

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

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

46

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

รีโมต: A <- B <- C <- D
local: A <- B *
(* หมายถึงคุณมีหลายไฟล์ที่ถูกแก้ไข แต่ไม่ได้คอมมิท)

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

ตัวเลือกที่หนึ่ง: ทิ้งการเปลี่ยนแปลง
คุณสามารถใช้git checkoutสำหรับไฟล์ที่ไม่รวมแต่ละไฟล์หรือคุณสามารถใช้git reset --hard HEADเพื่อรีเซ็ตไฟล์ทั้งหมดในสาขาของคุณเป็น HEAD โดยวิธีการ HEAD ในสาขาท้องถิ่นของคุณคือ B โดยไม่มีเครื่องหมายดอกจัน หากคุณเลือกตัวเลือกนี้แผนภาพจะกลายเป็น:

รีโมต: A <- B <- C <- D
local: A <- B

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

ท้องถิ่น: A <- B <- C <- D

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

<<<<<<< HEAD
// รุ่นรหัสของคุณ
=======
// รุ่นรหัสของรีโมท
>>>>>>>

Git กำลังนำเสนอคุณด้วยรหัสสองรุ่น รหัสที่อยู่ในเครื่องหมาย HEAD นั้นเป็นรุ่นจากสาขาท้องถิ่นปัจจุบันของคุณ รุ่นอื่นคือสิ่งที่มาจากระยะไกล เมื่อคุณได้เลือกรุ่นของรหัส (และลบรหัสอื่น ๆ พร้อมกับเครื่องหมาย) git addคุณสามารถเพิ่มแต่ละไฟล์ไปยังพื้นที่การแสดงละครของคุณโดยการพิมพ์ ขั้นตอนสุดท้ายคือส่งมอบผลลัพธ์ของคุณโดยพิมพ์git commit -m ข้อความที่เหมาะสม ณ จุดนี้ไดอะแกรมของเรามีลักษณะดังนี้:

รีโมต: A <- B <- C <- D
local: A <- B <- C '

ที่นี่ฉันได้ติดป้ายความมุ่งมั่นที่เราเพิ่งสร้างขึ้นในฐานะ C 'เพราะมันแตกต่างจากการส่งมอบ C ในระยะไกล ตอนนี้ถ้าคุณพยายามที่จะดึงคุณจะได้รับข้อผิดพลาดไปข้างหน้าอย่างรวดเร็ว Git ไม่สามารถเล่นเปลี่ยนแปลงในระยะไกลในสาขาของคุณเพราะทั้งสองสาขาและระยะไกลได้แยกออกมาจากบรรพบุรุษร่วมกันกระทำของคุณบี ณ จุดนี้ถ้าคุณต้องการที่จะดึงคุณทั้งสองสามารถทำอีกgit mergeหรือgit rebaseสาขาของคุณในระยะไกล

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


33

มีทางออกที่ง่ายไป แต่ก่อนอื่นคุณต้องเรียนรู้สิ่งต่อไปนี้

vimdiff

หากต้องการลบความขัดแย้งคุณสามารถใช้

git mergetool

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


2
ฉันจะบอกว่าไม่จำเป็นต้องใช้vimdiff (คุณสามารถใช้เครื่องมือผสาน / diff ใด ๆ ที่คุณเลือกเช่น WinMerge หรือ FileMerge ในตัวของ OSX เป็นต้น) ต้องบอกว่านี่เป็นส่วนเสริมที่ยอดเยี่ยมสำหรับคำตอบของ @ mu
undeniablyrob

32

หากคุณไม่ต้องการรวมการเปลี่ยนแปลงและยังต้องการอัปเดตภายในเครื่องของคุณให้เรียกใช้:

git reset --hard HEAD  

สิ่งนี้จะรีเซ็ตค่าท้องถิ่นของคุณด้วย HEAD แล้วดึงรีโมตของคุณโดยใช้ git pull

หากคุณยืนยันการรวมแล้วในพื้นที่ (แต่ยังไม่ได้เปลี่ยนเป็นรีโมต) และต้องการเปลี่ยนกลับเป็น:

git reset --hard HEAD~1 

7

หากคุณต้องการดึงสาขาระยะไกลลงเพื่อเรียกใช้ในพื้นที่ (พูดเพื่อตรวจสอบหรือทดสอบวัตถุประสงค์) และเมื่อ$ git pullคุณได้รับข้อขัดแย้งในการรวมเครื่อง:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)

5

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

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

การผสานรวมเนื้อหาของไฟล์สองไฟล์เข้าด้วยกัน ขณะนี้ไฟล์ในเครื่องของคุณแตกต่างจากไฟล์บนเซิร์ฟเวอร์ระยะไกล การรวมจะต้องทำบนเซิร์ฟเวอร์ระยะไกล ดังนั้นหากคุณจัดวางไฟล์ที่ถูกแก้ไขแล้วผลักมันการเปลี่ยนแปลงของคุณจะถูกเพิ่มเข้าไปในไฟล์ในที่เก็บ จากนั้นไฟล์ของคุณจะซิงค์และคุณสามารถดึงทั้งโครงการด้วยการเปลี่ยนแปลงอื่น ๆ ฉันพบหนังสือความช่วยเหลือ git เป็นประโยชน์อย่างมากเมื่อฉันเริ่มใช้ git คุณสามารถค้นหาได้ที่นี่: git-scm.com/book/en/Getting-Started
นิค

โปรดทราบว่าฉันไม่ใช่ OP "การรวมไฟล์" เป็นคำศัพท์ที่ไม่เหมาะสม พูดอย่างเคร่งครัดคุณผสานกระทำ แต่ไม่ใช่ไฟล์
jub0bs

อาใช่ว่าเป็นเรื่องจริง apoligies ของฉัน ฉันพยายามที่จะให้คำตอบง่ายๆ
Nick

ถ้าคุณมีข้อขัดแย้งในการรวมการคอมมิชชันคุณต้องมีไฟล์ที่ขัดแย้งและไม่รวมไฟล์และคุณจะต้องรวมมันเข้าด้วยกัน
Edward Thomson

3

ขั้นตอนในการปฏิบัติตาม:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

ขอบคุณ Sarbasish


2

มีปัญหาเดียวกันกับฉัน
ในกรณีของฉันขั้นตอนดังต่อไปนี้ -

  1. ลบไฟล์ทั้งหมดที่กำลังเริ่มต้นด้วยสัญลักษณ์U (ไม่รวม) เช่น-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. ดึงรหัสจากต้นแบบ

$ git pull origin master
  1. ตรวจสอบสถานะแล้ว

 $ git status

นี่คือข้อความที่ปรากฏ -
และมี 2 และ 1 การกระทำที่แตกต่างกันตามลำดับ คุณมีเส้นทางที่ไม่ได้จม
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

เส้นทางที่ไม่รวม:
(ใช้ "git เพิ่ม ... " เพื่อทำเครื่องหมายความละเอียด)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. เพิ่มการเปลี่ยนแปลงใหม่ทั้งหมด -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. กระทำการเปลี่ยนแปลงในหัว -

$ git commit -am "resolved conflict of the app."
  1. กดรหัส -

$ git push origin master

การเลี้ยวใดที่อาจแก้ไขได้ด้วยภาพนี้ - ป้อนคำอธิบายรูปภาพที่นี่


1

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

ความขัดแย้งในการผสานจะได้รับการแก้ไข


-1

เพียงรันคำสั่งนี้:

git reset --hard

3
คุณควรอธิบายว่าคำสั่งทำอะไรเพราะบางคนจะผิดหวังมากหากพวกเขาลองและพบว่ามันลบการเปลี่ยนแปลงในท้องถิ่นทั้งหมดของพวกเขาในปัจจุบัน: /
Joseph Budin

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