2010-11-11 7 views

Trả lời

502

Nếu bạn có nghĩa là bạn muốn kéo để ghi đè lên thay đổi địa phương, làm việc hợp nhất, nếu như cây làm việc đã được sạch sẽ, tốt, làm sạch cây làm việc:

git reset --hard 
git pull 

Nếu có tập tin địa phương untracked bạn có thể sử dụng git clean để xóa chúng. Sử dụng git clean -f để xóa các tệp không được theo dõi, -df để xóa các tệp và thư mục không được theo dõi và -xdf để xóa các tệp hoặc thư mục không được theo dõi hoặc bị bỏ qua.

Nếu mặt khác bạn muốn giữ lại những sửa đổi địa phương bằng cách nào đó, bạn muốn sử dụng stash để ẩn chúng đi trước khi kéo, rồi áp dụng lại chúng sau đó:

git stash 
git pull 
git stash pop 

Tôi không nghĩ rằng nó làm cho bất kỳ theo nghĩa đen, nghĩa là theo mặc định, bỏ qua các thay đổi - một nửa kéo được hợp nhất và cần phải hợp nhất các phiên bản nội dung đã cam kết với các phiên bản được tìm nạp.

+3

Nếu sau khi 'git reset' các tệp của bạn vẫn khác với điều khiển từ xa, hãy đọc http://stackoverflow.com/questions/1257592/removing-files-saying-old-mode-100755-new-mode-100644-from-unstaged- thay đổi-in –

+1

Git là điều kỳ lạ nhất từ ​​trước tới nay. Git reset - đã xong. Sau đó, trạng thái git: Chi nhánh của bạn đứng trước 2 lần commit. – shailenTJ

+11

@shailenTJ "Thay đổi cục bộ" ở đây có nghĩa là các thay đổi không được cam kết, chứ không phải cam kết cục bộ. 'git reset --hard' ảnh hưởng đến cái cũ, chứ không phải cái sau. Nếu bạn muốn đặt lại hoàn toàn về trạng thái của từ xa, 'git reset --hard origin/' - nhưng thường và trong trường hợp này, hai cam kết bạn đang đi trước đó là công việc bạn đã làm, chứ không phải thứ bạn muốn ném xa. – Cascabel

7

Nhìn vào git stash để đặt tất cả thay đổi cục bộ của bạn vào "tệp stash" và hoàn nguyên về lần commit cuối cùng. Tại thời điểm đó, bạn có thể áp dụng các thay đổi đã lưu trữ của mình hoặc loại bỏ chúng.

7

Nếu bạn đang trên Linux:

git fetch 
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done 
git pull 

Vòng lặp for sẽ xóa tất cả các file theo dõi được thay đổi trong repo địa phương, vì vậy git pull sẽ làm việc mà không cần bất kỳ vấn đề.
Điều đẹp nhất về điều này là chỉ có các tệp được theo dõi sẽ bị ghi đè bởi các tệp trong repo, tất cả các tệp khác sẽ bị bỏ quên.

+0

Tôi nghĩ bạn có nghĩa là "các tệp được theo dõi" chính xác là những gì tôi cần, cảm ơn. – Ali

15

Lệnh dưới không hoạt động luôn. Nếu bạn làm thế chỉ:

$ git checkout thebranch 
Already on 'thebranch' 
Your branch and 'origin/thebranch' have diverged, 
and have 23 and 7 different commits each, respectively. 

$ git reset --hard 
HEAD is now at b05f611 Here the commit message bla, bla 

$ git pull 
Auto-merging thefile1.c 
CONFLICT (content): Merge conflict in thefile1.c 
Auto-merging README.md 
CONFLICT (content): Merge conflict in README.md 
Automatic merge failed; fix conflicts and then commit the result. 

và vân vân ...

Để thực sự bắt đầu lại, tải thebranch và ghi đè lên tất cả thay đổi địa phương của bạn, chỉ cần làm:


$ git checkout thebranch 
$ git reset --hard origin/thebranch 

Điều này sẽ hoạt động tốt.

$ git checkout thebranch 
Already on 'thebranch' 
Your branch and 'origin/thebranch' have diverged, 
and have 23 and 7 different commits each, respectively. 

$ git reset --hard origin/thebranch 
HEAD is now at 7639058 Here commit message again... 

$ git status 
# On branch thebranch 
nothing to commit (working directory clean) 

$ git checkout thebranch 
Already on 'thebranch' 
+2

CÓ. Đây là những gì tôi cần cho một cách tiếp cận cuối cùng "không cung cấp cho một F về những gì địa phương". Cảm ơn. :) – Adambean

120

Đối với tôi sau đây làm việc:

(1) Đầu tiên lấy tất cả thay đổi:

$ git fetch --all 

(2) Sau đó thiết lập lại tổng thể:

$ git reset --hard origin/master 

(3) Kéo/cập nhật:

$ git pull 
+5

Làm việc tuyệt vời cho tôi khi gặp nhiều rắc rối với câu trả lời hàng đầu. Cảm ơn! –

+1

điều này thậm chí hoạt động khi u đã cam kết thay đổi địa phương ur, nhưng vẫn u muốn hoàn nguyên – agsachin

+1

Điều này nên là câu trả lời hàng đầu :) – Purus

0

này sẽ lấy chi nhánh hiện tại và cố gắng để làm một tua đi để làm chủ:

git fetch && git merge --ff-only origin/master 
4
git fetch --all && git reset --hard origin/master