Tại sao git lại nói rằng Pull Pull là không thể bởi vì bạn có các tập tin chưa được trộn lẫn?


195

Khi tôi cố gắng kéo thư mục dự án của mình vào terminal, tôi thấy lỗi sau:

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'.

Tại sao git nói "Pull is not possible because you have unmerged files", và làm thế nào tôi có thể giải quyết nó?


1
Trong trường hợp của tôi, tôi chỉ sử dụng các lệnh này "git add." sau đó "git commit -m" Test "và cuối cùng là" git đẩy ". Lỗi được xóa
Akhzar Nazir

Bạn chỉ cần thêm "$ git add <file>" ... để cập nhật những gì sẽ được cam kết hoặc khôi phục (để loại bỏ các thay đổi trong thư mục làm việc) sau đó cam kết "$ git commit", sau đó "$ git đẩy" để kết thúc hợp nhất.
find_X

Trong trường hợp nó giúp: Tôi đã nhận thấy rằng chỉ cần thực hiện "git add." sau đó cam kết không hoạt động. Tôi đã phải thêm các tệp riêng lẻ theo tên, sau đó cam kết và kéo / đẩy.
ouonomos

Câu trả lời:


212

Điều hiện đang xảy ra là, bạn có một tập hợp các tệp nhất định mà bạn đã thử hợp nhất trước đó, nhưng chúng đã tạo ra xung đột hợp nhất. Lý tưởng nhất, nếu một người có xung đột hợp nhất, anh ta nên giải quyết chúng bằng tay và cam kết thay đổi bằng cách sử dụng git add file.name && git commit -m "removed merge conflicts". Bây giờ, một người dùng khác đã cập nhật các tệp được đề cập trên kho lưu trữ của anh ấy và đã đẩy các thay đổi của anh ấy lên repo ngược dòng chung.

Điều đó xảy ra, rằng xung đột hợp nhất của bạn từ (có thể) cam kết cuối cùng không được giải quyết, do đó các tệp của bạn không được hợp nhất hoàn toàn, và do đó cờ U( unmerged) cho các tệp. Vì vậy, bây giờ, khi bạn thực hiện một git pull, git đang đưa ra lỗi, bởi vì bạn có một số phiên bản của tệp, không được giải quyết chính xác.

Để giải quyết vấn đề này, bạn sẽ phải giải quyết các xung đột hợp nhất trong câu hỏi và thêm và cam kết các thay đổi, trước khi bạn có thể thực hiện git pull .

Tái tạo mẫu và giải quyết vấn đề:

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

Đầu tiên, chúng ta hãy tạo cấu trúc kho lưu trữ

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

Bây giờ chúng tôi đang ở repo_clone và nếu bạn làm điều git pullđó, nó sẽ xuất hiện xung đột

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.

Nếu chúng ta bỏ qua các xung đột trong bản sao và thực hiện thêm các cam kết trong repo ban đầu bây giờ,

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

Và sau đó chúng tôi làm một git pull, chúng tôi nhận được

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'.

Lưu ý rằng filebây giờ đang ở trạng thái không trộn lẫn và nếu chúng ta làm một git status, chúng ta có thể thấy rõ điều tương tự:

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

Vì vậy, để giải quyết vấn đề này, trước tiên chúng tôi cần giải quyết xung đột hợp nhất mà chúng tôi đã bỏ qua trước đó

repo_clone $ vi file

và đặt nội dung của nó thành

text2
text1
text1

và sau đó thêm nó và cam kết thay đổi

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

1
Để hoàn thành, tôi sẽ thêm câu trả lời của @ Pawan để sử dụng 'git mergetool' để giải quyết xung đột. Bước thứ hai đến cuối cùng có thể không thực tế lắm ("giải quyết hợp nhất ... [bằng cách đặt] ... nội dung của nó thành: [một số văn bản]").
không thể phủ nhận

Ngoài ra, bạn có thể hợp nhất bằng lời khuyên của @ user261. Dù bằng cách nào, tôi nghĩ rằng thêm một bước về cách hợp nhất theo nghĩa thực tế sẽ hoàn thành câu trả lời này.
không thể phủ nhận

3
Câu trả lời này hoạt động thực sự tốt khi bạn có các xung đột đơn giản để khắc phục trên các tệp đơn lẻ. Ví dụ, một hoặc hai dòng mã khác nhau. Nếu bạn có nhiều tệp đã được sửa đổi nhiều, đây là một sửa chữa khó khăn. Nhưng nó lái xe về nhà ý tưởng rằng với Git, bạn nên cam kết thường xuyên để tránh những xung đột khó khăn.
Vaughn D. Taylor

46

Bạn đang cố gắng thêm một cam kết mới vào chi nhánh địa phương trong khi thư mục làm việc của bạn không sạch. Kết quả là, Git đang từ chối thực hiện việc kéo. Xem xét các sơ đồ sau để hình dung rõ hơn về kịch bản:

từ xa: A <- B <- C <- D
cục bộ: A <- B *
(* chỉ ra rằng bạn có một số tệp đã được sửa đổi nhưng không được cam kết.)

Có hai lựa chọn để đối phó với tình huống này. Bạn có thể loại bỏ các thay đổi trong tệp của mình hoặc giữ lại chúng.

Tùy chọn một: Vứt bỏ các thay đổi
Bạn có thể sử dụng git checkoutcho từng tệp chưa được trộn hoặc bạn có thể sử dụng git reset --hard HEADđể đặt lại tất cả các tệp trong nhánh của mình thành CHÍNH. Nhân tiện, CHÍNH trong chi nhánh địa phương của bạn là B, không có dấu hoa thị. Nếu bạn chọn tùy chọn này, sơ đồ sẽ trở thành:

từ xa: A <- B <- C <- D
cục bộ: A <- B

Bây giờ khi bạn kéo, bạn có thể chuyển nhanh chi nhánh của mình với các thay đổi từ chủ. Sau khi kéo, nhánh của bạn sẽ trông giống như chủ:

cục bộ: A <- B <- C <- D

Tùy chọn hai: Giữ lại các thay đổi
Nếu bạn muốn giữ các thay đổi, trước tiên bạn sẽ muốn giải quyết bất kỳ xung đột hợp nhất nào trong mỗi tệp. Bạn có thể mở từng tệp trong IDE của mình và tìm các ký hiệu sau:

<<<<<<< ĐẦU
// phiên bản của mã
=======
// phiên bản của từ xa của mã
>>>>>>>

Git đang giới thiệu cho bạn hai phiên bản mã. Mã chứa trong các dấu hiệu CHÍNH là phiên bản từ chi nhánh địa phương hiện tại của bạn. Các phiên bản khác là những gì đến từ xa. Khi bạn đã chọn một phiên bản mã (và loại bỏ mã khác cùng với các điểm đánh dấu), bạn có thể thêm từng tệp vào khu vực tổ chức của mình bằng cách nhập git add. Bước cuối cùng là cam kết kết quả của bạn bằng cách gõ git commit -m với một thông điệp thích hợp. Tại thời điểm này, sơ đồ của chúng tôi trông như thế này:

từ xa: A <- B <- C <- D
cục bộ: A <- B <- C '

Ở đây tôi đã gắn nhãn cho cam kết mà chúng ta vừa thực hiện là C 'vì nó khác với cam kết C trên điều khiển từ xa. Bây giờ, nếu bạn cố gắng kéo, bạn sẽ gặp lỗi không chuyển tiếp nhanh. Git không thể phát các thay đổi trong điều khiển từ xa trên nhánh của bạn, bởi vì cả nhánh của bạn và điều khiển từ xa đã chuyển hướng khỏi cam kết tổ tiên chung B. Tại thời điểm này, nếu bạn muốn kéo, bạn có thể thực hiện một thao tác khác git mergehoặc git rebasenhánh của bạn trên điều khiển từ xa.

Để thành thạo Git đòi hỏi phải có khả năng hiểu và thao tác các danh sách liên kết đơn hướng. Tôi hy vọng lời giải thích này sẽ giúp bạn suy nghĩ đúng hướng về việc sử dụng Git.


33

Có một giải pháp đơn giản cho nó. Nhưng trước tiên bạn sẽ cần học những điều sau đây

vimdiff

Để loại bỏ tâm sự, bạn có thể sử dụng

git mergetool

Lệnh trên về cơ bản mở tệp cục bộ, tệp hỗn hợp, tệp từ xa (tổng cộng 3 tệp) cho mỗi tệp bị xung đột. Các tệp cục bộ & từ xa chỉ để bạn tham khảo và sử dụng chúng, bạn có thể chọn những gì cần bao gồm (hoặc không) trong tệp hỗn hợp. Và chỉ cần lưu và thoát khỏi tập tin.


2
Tôi sẽ nói rằng vimdiff là không bắt buộc (bạn có thể sử dụng bất kỳ công cụ hợp nhất / khác nào bạn chọn, chẳng hạn như WinMerge hoặc FileMerge tích hợp của OSX, v.v.). Phải nói rằng, đây là một bổ sung tuyệt vời cho câu trả lời của @ mu.
không thể phủ nhận

32

Nếu bạn không muốn hợp nhất các thay đổi và vẫn muốn cập nhật cục bộ của mình thì hãy chạy:

git reset --hard HEAD  

Điều này sẽ thiết lập lại cục bộ của bạn với HEAD và sau đó kéo điều khiển từ xa bằng git pull.

Nếu bạn đã cam kết hợp nhất cục bộ (nhưng chưa được đẩy vào điều khiển từ xa) và cũng muốn hoàn nguyên nó:

git reset --hard HEAD~1 

6

Nếu bạn muốn kéo xuống một chi nhánh từ xa để chạy cục bộ (nói để xem xét hoặc kiểm tra mục đích) và khi $ git pullbạn gặp xung đột hợp nhất cục bộ:

$ 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

Bạn có một số tệp cục bộ cần được hợp nhất trước khi bạn có thể kéo. Bạn có thể kiểm tra các tệp và sau đó kéo để ghi đè lên các tệp cục bộ của bạn.

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

Sáp nhập kết hợp nội dung của hai tập tin. Hiện tại các tệp cục bộ của bạn khác với các tệp trên máy chủ từ xa. Việc hợp nhất phải được thực hiện trên máy chủ từ xa. Vì vậy, nếu bạn giai đoạn các tệp đã chỉnh sửa của mình và đẩy chúng, các thay đổi của bạn sẽ được thêm vào các tệp trên kho lưu trữ. Sau đó, các tệp của bạn sẽ được đồng bộ hóa và bạn có thể kéo toàn bộ dự án với các thay đổi khác. Tôi thấy cuốn sách trợ giúp git rất hữu ích khi tôi bắt đầu sử dụng git. Bạn có thể tìm thấy nó ở đây: git-scm.com/book/en/Getting-Started
Nick

Lưu ý rằng tôi không phải là OP. "Sáp nhập tập tin" là thuật ngữ không đúng. Nói đúng ra, bạn hợp nhất các cam kết, không phải các tệp.
jub0bs

À đúng, đó là sự thật, những lời xin lỗi của tôi. Tôi đã cố gắng đưa ra một câu trả lời đơn giản
Nick

Chà, nếu bạn có xung đột khi hợp nhất một cam kết, thì có, bạn sẽ có các tệp xung đột, không được trộn lẫn và bạn sẽ cần hợp nhất chúng.
Edward Thomson

3

Các bước để làm theo:

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)

Cảm ơn, Sarbasish


2

Có vấn đề tương tự với tôi
Trong trường hợp của tôi, các bước như dưới đây-

  1. Đã xóa tất cả các tệp đang được bắt đầu với ký hiệu U (chưa trộn) . như-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Kéo mã từ chủ

$ git pull origin master
  1. Đã kiểm tra trạng thái

 $ git status

Đây là thông điệp mà nó xuất hiện-
và có 2 và 1 cam kết khác nhau tương ứng. Bạn có những con đường không hợp nhất.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Đường dẫn không được trộn:
(sử dụng "git add ..." để đánh dấu độ phân giải)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Đã thêm tất cả các thay đổi mới -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Cam kết thay đổi trên đầu-

$ git commit -am "resolved conflict of the app."
  1. Đã đẩy mã -

$ git push origin master

Lần lượt nào có thể giải quyết vấn đề với hình ảnh này - nhập mô tả hình ảnh ở đây


1

Khi xảy ra xung đột hợp nhất, bạn có thể mở tệp riêng lẻ. Bạn sẽ nhận được các biểu tượng "<<<<<<< hoặc >>>>>>>". Chúng đề cập đến những thay đổi của bạn và những thay đổi hiện diện trên remote. Bạn có thể tự chỉnh sửa phần được yêu cầu. sau đó lưu tập tin và sau đó làm: git add

Các xung đột hợp nhất sẽ được giải quyết.


-1

Chỉ cần chạy lệnh này:

git reset --hard

3
Bạn nên giải thích những gì lệnh thực hiện, bởi vì một số người sẽ rất thất vọng nếu họ thử và phát hiện ra rằng nó đã xóa tất cả các thay đổi cục bộ hiện tại của họ: /
Joseph Budin

Điều này hoạt động nếu bạn chỉ sao chép các thay đổi của mình sang nguồn tạm thời bên ngoài .. nếu bạn chỉ có một vài tệp ví dụ tệp cấu hình cho một dự án thì thật hoàn hảo. Thực hiện lệnh và sau đó hoàn nguyên các thay đổi của bạn. Làm việc cho tôi!
cwiggo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.