Git Pull là không thể, các tệp chưa được hợp nhất


89

Tôi đã đọc tất cả các câu hỏi tương tự về điều này; có vẻ như không có cách nào sau đây hoạt động:

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

Gần như mọi sự kết hợp, lưu trữ các thay đổi và kéo từ kho lưu trữ, dẫn đến các tệp không thể hợp nhất. Tôi muốn loại bỏ tất cả các thay đổi cục bộ và chỉ sử dụng điều khiển từ xa, nhưng tôi không thể sao chép lại (giới hạn băng thông và sử dụng internet do nhà phát triển đang cố gắng thực hiện điều này). Làm thế nào để tôi làm điều này?

Vừa thử:

git stash
git pull

Cũng không hoạt động.

Thêm thông tin

Có một cam kết cục bộ và phần thượng nguồn cũng có một cam kết. Do đó, tôi đã thử git pull --rebasenhưng nó vẫn không hoạt động bình thường ... Điều đó khiến tôi gặp lỗi - "thoát ra do xung đột chưa được giải quyết". Nếu làm vậy git stash, git reset --hard HEAD, git pull --rebase, tôi nhận được lỗi "không thể kéo, các thay đổi chưa được hợp nhất ..."

Câu trả lời:


199

Giả sử điều khiển từ xa là originvà chi nhánh master, và nói rằng bạn đã thanh toán master, có thể thử các cách sau:

git fetch origin
git reset --hard origin/master

Về cơ bản, điều này chỉ lấy nhánh hiện tại và trỏ nó đến HEADnhánh của xa.

CẢNH BÁO : Như đã nêu trong các nhận xét, điều này sẽ loại bỏ các thay đổi cục bộ của bạnghi đè lên bất kỳ thứ gì có trên nguồn gốc .

Hoặc bạn có thể sử dụng các lệnh về hệ thống ống nước để thực hiện cơ bản tương tự:

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

CHỈNH SỬA: Tôi muốn giải thích ngắn gọn tại sao điều này hoạt động.

Các .gitthư mục có thể giữ các cam kết đối với bất kỳ số lượng kho. Vì hàm băm cam kết thực sự là một phương pháp xác minh nội dung của cam kết chứ không chỉ là một giá trị được tạo ngẫu nhiên, nó được sử dụng để khớp các tập hợp cam kết giữa các kho lưu trữ.

Một nhánh chỉ là một con trỏ được đặt tên đến một hàm băm nhất định. Đây là một tập hợp ví dụ:

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

Mỗi tệp này chứa một hàm băm trỏ đến một cam kết:

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

Tất cả đều dành cho cơ chế lưu trữ git nội bộ và hoạt động độc lập với thư mục làm việc . Bằng cách làm như sau:

git reset --hard origin/master

git sẽ trỏ nhánh hiện tại đến cùng giá trị băm mà origin / master trỏ tới. Sau đó, nó thay đổi mạnh mẽ thư mục làm việc để phù hợp với cấu trúc / nội dung tệp tại hàm băm đó.

Để thấy điều này tại nơi làm việc, hãy tiếp tục và thử những cách sau:

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
Từ bản chỉnh sửa được chấp thuận gần đây, thêm cảnh báo lớn ở đầu, giống như chỉ ra rằng nó đã được đề cập: "Sau đó, [git] mạnh mẽ thay đổi thư mục làm việc để phù hợp với cấu trúc / nội dung tệp tại hàm băm đó." Nhưng đoán rằng điều đó không đủ rõ ràng.
Trevor Norris


5

Đã giải quyết bằng cách sử dụng bộ lệnh sau:

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

Bí quyết là để căn cứ lại các thay đổi ... Chúng tôi đã gặp một số khó khăn khi khôi phục lại một cam kết nhỏ, và vì vậy chúng tôi chỉ cần bỏ qua nó bằng cách sử dụng git rebase --skip (sau khi đã sao chép các tệp).


3

Nếu bạn tình cờ gặp sự cố này sau khi chạy a git fetchvà sau đó git không cho phép bạn chạy git pulldo xung đột hợp nhất ( cả tệp đã sửa đổi / chưa hợp nhất và để khiến bạn bực bội hơn, nó sẽ không hiển thị cho bạn bất kỳ dấu xung đột nào trong vì nó chưa được hợp nhất). Nếu không muốn mất công, bạn có thể làm như sau.

giai đoạn tệp.

$ git add filename

sau đó lưu trữ các thay đổi cục bộ.

$ git stash

kéo và cập nhật thư mục làm việc của bạn

$ git pull

khôi phục tệp đã sửa đổi cục bộ của bạn (git sẽ tự động hợp nhất nếu có thể, nếu không, hãy giải quyết nó)

$ git stash pop

Hy vọng nó sẽ giúp ích.


2

Có một giải pháp ngay cả khi bạn không muốn xóa các thay đổi cục bộ của mình. Chỉ cần sửa các tệp chưa hợp nhất (bằng git addhoặc git remove). Sau đó làm git pull.


1

Giả sử bạn muốn loại bỏ bất kỳ thay đổi nào bạn có, trước tiên hãy kiểm tra đầu ra của git status. Đối với bất kỳ tệp nào có nội dung "chưa được hợp nhất" bên cạnh, hãy chạy git add <unmerged file>. Sau đó, theo dõi với git reset --hard. Điều đó sẽ giúp loại bỏ mọi thay đổi cục bộ ngoại trừ các tệp chưa được kiểm tra.


Ô đúng rồi. Nó có thể không nói "chưa hợp nhất". Nó cũng có thể nói "cả hai đều được sửa đổi" hoặc có thể là một hoặc hai điều khác. Đầu ra của là git statusgì?
Ryan Stewart

Sau khi đăng này tôi đang nói sự thành viên trong nhóm để thử git rebase --abortgit pull --rebasetheo đề nghị của git
Christian Stewart

1

Tôi đã giải quyết bằng git loại bỏ tệp chưa được hợp nhất cục bộ.

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

Khi tôi gửi git commit sau đó:

$ 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

Câu trả lời của Ryan Stewart gần như đã có. Trong trường hợp bạn thực sự không muốn xóa các thay đổi cục bộ của mình, có một quy trình công việc bạn có thể sử dụng để hợp nhất:

  • Chạy đi git status. Nó sẽ cung cấp cho bạn một danh sách các tệp chưa hợp nhất.
  • Hợp nhất chúng (bằng tay, v.v.)
  • Chạy git commit

Git sẽ chỉ cam kết các hợp nhất thành một cam kết mới. (Trong trường hợp của tôi, tôi có thêm các tệp được bổ sung trên đĩa, các tệp này không được gộp chung vào cam kết đó.)

Sau đó, Git coi việc hợp nhất thành công và cho phép bạn tiếp tục.

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.