git thay thế phiên bản địa phương bằng phiên bản từ xa


148

Làm cách nào tôi có thể bảo git bỏ qua tệp cục bộ của mình và lấy tệp từ chi nhánh từ xa mà không cố gắng hợp nhất và gây ra xung đột?


1
Xem SO trả lời " lệnh git để tạo một nhánh giống như một nhánh khác " để biết tất cả các cách có thể hiện tại để mô phỏnggit merge -s their .
VonC

Nó sẽ hữu ích nếu bạn có thể cung cấp thêm một số chi tiết. Bạn có muốn áp dụng nội dung của tất cả các tệp từ nhánh từ xa hoặc chỉ một số tệp (tức là giữ một số phiên bản / thay đổi cục bộ) không? Bạn có bất kỳ lịch sử địa phương mà bạn muốn giữ? (Điều này có thể quan trọng nếu có bất kỳ chi nhánh hoặc kho lưu trữ nào khác đã kết hợp lịch sử địa phương của bạn.) Nếu bạn muốn giữ lịch sử địa phương của mình, bạn dự định làm gì với nó sau này? (Bạn có thể để lại một thẻ chỉ vào lịch sử địa phương và chỉ cần đặt lại chi nhánh của bạn về những gì điều khiển từ xa có, hoặc bạn có thể muốn hợp nhất các ứng dụng của họ).
Chris Johnsen

1
Ngoài ra còn có một chủ đề như thế này trong câu hỏi Đặt lại nhánh kho lưu trữ cục bộ giống như kho lưu trữ từ xa ĐẦU
mico

Câu trả lời:


169

Đây là giải pháp an toàn nhất:

git stash

Bây giờ bạn có thể làm bất cứ điều gì bạn muốn mà không sợ xung đột.

Ví dụ:

git checkout origin/master

Nếu bạn muốn bao gồm các thay đổi từ xa trong nhánh chính, bạn có thể làm:

git reset --hard origin/master

Điều này sẽ khiến bạn phân nhánh "master" để trỏ đến "origin / master".


90
Có thể đáng để chỉ ra rằng điều này sẽ tách ra TRƯỚC - người hỏi có thể thích ở lại chi nhánh vớigit stash; git fetch origin; git reset --hard origin/master
Mark Longair

10
Tôi nghĩ nhận xét của Mark Longair là câu trả lời thực sự cho câu hỏi này

đó là câu trả lời hữu ích nhất đối với tôi +1
Andres

Làm thế nào để trở lại nhà nước trước git stash? git stash listtrống rỗng
Leo

Tôi muốn ôm bạn
Ugur Kazdal

45

Tôi hiểu câu hỏi như thế này: bạn muốn thay thế hoàn toàn nội dung của một tệp (hoặc một lựa chọn) từ thượng nguồn. Bạn không muốn ảnh hưởng trực tiếp đến chỉ mục (vì vậy bạn sẽ trải qua add + commit như bình thường).

Đơn giản chỉ cần làm

git checkout remote/branch -- a/file b/another/file

Nếu bạn muốn làm điều này cho các cây con rộng rãi và thay vào đó muốn ảnh hưởng trực tiếp đến chỉ mục sử dụng

git read-tree remote/branch:subdir/

Sau đó, bạn có thể (tùy chọn) cập nhật bản sao làm việc của mình bằng cách thực hiện

git checkout-index -u --force

2
Đây chính xác là những gì tôi muốn. Cảm ơn.
Ứng dụng tự động

11

Sự hiểu biết của tôi là, ví dụ, bạn đã lưu sai một tệp bạn đã cập nhật cho mục đích thử nghiệm. Sau đó, khi bạn chạy "trạng thái git", tệp sẽ xuất hiện dưới dạng "Đã sửa đổi" và bạn nói một số từ xấu. Bạn chỉ muốn phiên bản cũ trở lại và tiếp tục hoạt động bình thường.

Trong kịch bản đó, bạn có thể chạy lệnh sau:

git checkout -- path/filename

10

Tôi sẽ kiểm tra tệp từ xa từ "chính" (kho lưu trữ từ xa / nguồn gốc) như thế này:

git checkout master <FileWithPath>

Ví dụ: git checkout thành phần chính / indexTest.html


Đối với tôi đã làm việc như thế này "từ xa kiểm tra git / nguồn gốc / chủ <my-file>"
saravanakumar

4

Sử dụng -shoặc --strategytùy chọn kết hợp với -Xtùy chọn. Trong câu hỏi cụ thể của bạn, bạn muốn giữ tất cả các tệp từ xa và thay thế các tệp cục bộ cùng tên.

Thay thế xung đột bằng phiên bản từ xa

git merge -s recursive -Xtheirs upstream/master  

sẽ sử dụng phiên bản repo từ xa của tất cả các tệp xung đột.

Thay thế xung đột bằng phiên bản cục bộ

git merge -s recursive -Xours upstream/master

sẽ sử dụng phiên bản repo cục bộ của tất cả các tệp xung đột.

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.