2013-02-28 33 views
61

Tôi đã đọc tất cả các câu hỏi tương tự về vấn đề này; có vẻ như không ai trong số những người sau đây đã làm việc:Git Pull là không thể, Unmerged Files

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

Gần như mọi kết hợp, thay đổi stashing và kéo từ kho lưu trữ, dẫn đến các tệp không thể nén. 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 sử dụng băng thông và internet với nhà phát triển đang cố thực hiện việc này). Làm thế nào để tôi làm điều này?

Chỉ cần cố gắng:

git stash 
git pull 

Cũng không làm việc.

More Info

Có một địa phương cam kết, và thượng lưu có một cam kết là tốt. Tôi đã cố gắng git pull --rebase nhưng nó vẫn không hoạt động đúng ... Điều đó cho tôi lỗi - "thoát vì một cuộc xung đột chưa được giải quyết". Nếu tôi làm git stash, git reset --hard HEAD, git pull --rebase, tôi nhận được lỗi "kéo không phải là có thể, thay đổi Đã hủy hợp nhất ..."

Trả lời

146

Nói xa là origin và chi nhánh là master, và nói rằng bạn đã có master kiểm tra ra, có thể thử như sau:

git fetch origin 
git reset --hard origin/master 

này về cơ bản chỉ mất chi nhánh hiện tại và chỉ nó vào HEAD của nhánh từ xa.

CẢNH BÁO: Như đã nêu trong các ý kiến, này sẽ vứt bỏ thay đổi địa phương của bạnghi đè lên với bất cứ thứ gì về nguồn gốc.

Hoặc bạn có thể sử dụng hệ thống ống nước lệnh để làm cơ bản giống nhau:

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

EDIT: Tôi muốn giải thích ngắn gọn lý do tại sao các công trình này.

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

Chi nhánh chỉ là một con trỏ được đặt tên cho một băm đã cho. Dưới đây là một ví dụ thiết lập:

$ 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 file chứa một hash trỏ đến một cam kết:

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

Đây là tất cả đối với cơ chế lưu trữ git nội bộ, và làm việc một cách độc lập của thư mục làm việc . Bằng cách thực hiện như sau:

git reset --hard origin/master 

git sẽ trỏ nhánh hiện tại với cùng giá trị băm có nguồn gốc/điểm chính. 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 băm đó.

Để thấy điều này tại nơi làm việc đi trước và thử những điều sau đây:

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 
+0

Tôi không thể kiểm tra vì vậy tôi không có ý tưởng nếu điều này làm việc - nhưng tôi upvoted cho một giải pháp tốt –

+3

@timothyov Điều này là đúng, nhưng dựa trên câu hỏi tôi cảm thấy đó là ngụ ý. –

+1

Từ chỉnh sửa gần đây đã được thêm vào cảnh báo lớn ngay từ đầ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 tin tại băm đó." Nhưng đoán rằng không đủ rõ ràng. –

1

Giả sử bạn muốn vứt bỏ mọi thay đổi bạn có, đầu tiên 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 nhấn" bên cạnh, hãy chạy git add <unmerged file>. Sau đó theo dõi với git reset --hard. Điều đó sẽ git loại bỏ bất kỳ thay đổi địa phương, ngoại trừ các tập tin untracked.

+0

Đã thêm một số thông tin khác, tính năng này chưa hoạt động đúng cách –

+0

Ồ, đúng vậy. Nó có thể không nói "unmerged". Nó cũng có thể nói "cả hai sửa đổi" hoặc có thể một hoặc hai thứ khác. Đầu ra của 'trạng thái git' là gì? –

+0

http://prntscr.com/ufyqw –

3

Giải Quyết, sử dụng các thiết lập lệnh sau:

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

Bí quyết là để rebase những thay đổi ... Chúng tôi đã có một số rắc rối rebasing một tầm thường cam kết, và vì vậy chúng tôi chỉ đơn giản là bỏ qua nó bằng cách sử git rebase --skip (sau khi đã sao chép các tập tin).

1

tôi đã giải quyết với git loại bỏ các tập tin Đã hủy hợp nhất tại địa phương.

$ 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: Câu trả lời

$ 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 là gần như ở đó. Trong trường hợp bạn thực sự không muốn xóa thay đổi địa phương của bạn, có một công việc bạn có thể sử dụng để hợp nhất:

  • Run git status. Nó sẽ cung cấp cho bạn một danh sách các tập tin chưa được nhấn chìm.
  • Merge chúng (bằng tay, vv)
  • Run git commit

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

Git sau đó xem hợp nhất thành công và cho phép bạn tiến lên phía trước.

0

Nếu bạn đã từng xảy ra để có được vấn đề này sau khi chạy một git git fetch và sau đó không cho phép bạn chạy git pull vì một cuộc xung đột nhập (cả sửa đổi/files Đã hủy, và để làm cho bạn thất vọng nhiều, nó đã giành' t hiển thị cho bạn bất kỳ điểm đánh dấu xung đột nào trong tệp vì nó chưa được hợp nhất). Nếu bạn không muốn mất việc, bạn có thể làm như sau.

giai đoạn tệp.

$ git add filename 

sau đó chặn 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 tin sửa đổi địa phương của bạn (git sẽ tự động hợp nhất nếu nó có thể, nếu không giải quyết nó)

$ git stash pop 

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