Giải quyết xung đột bằng các thay đổi từ xa khi kéo từ Git từ xa


297

Tôi đang cố gắng kéo mã từ repo GitHub của mình lên máy chủ của mình, nhưng quá trình kéo không thành công do xung đột hợp nhất. Tôi không muốn giữ bất kỳ thay đổi nào có thể xảy ra trên máy chủ cục bộ của mình kể từ lần kéo cuối cùng.

Vậy có cách nào để tôi có thể buộc Git ghi đè lên với bất kỳ phiên bản nào trong GitHub, thay vì làm phiền tôi về các xung đột không?



4
@nvm: Không. Đây là về xung đột hợp nhất thực sự, không phải các tập tin chưa được xử lý sẽ bị ghi đè.
Cascabel

Câu trả lời:


491

Nếu bạn thực sự muốn loại bỏ các cam kết bạn đã thực hiện tại địa phương, tức là không bao giờ có lại chúng trong lịch sử, bạn sẽ không hỏi cách kéo - kéo có nghĩa là hợp nhất và bạn không cần phải hợp nhất. Tất cả bạn cần làm là đây:

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Cá nhân tôi khuyên bạn nên tạo một nhánh sao lưu tại ĐẦU hiện tại của bạn trước để nếu bạn nhận ra đây là một ý tưởng tồi, bạn đã không mất dấu vết của nó.

Mặt khác, nếu bạn muốn giữ các cam kết đó và làm cho nó trông giống như bạn đã hợp nhất với nguồn gốc và khiến việc hợp nhất chỉ giữ các phiên bản từ gốc, bạn có thể sử dụng ourschiến lược hợp nhất:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master

1
Trong khối thứ hai của lệnh git có .. nên có 'git fetch origin' sau lệnh thứ hai không?
David Tuite

@David: Có, bạn nên tìm nạp từ nguồn gốc tại một số điểm. Xin lỗi, tôi coi đó là ngầm.
Cascabel

2
Không có gì có thể để lại ngụ ý khi nói đến tôi và git ;-). Nghiêm túc mà nói, cảm ơn một triệu. Câu trả lời của bạn chính xác là những gì tôi đang tìm kiếm.
David Tuite

1
Điều này sẽ làm việc nếu nguồn gốc thực sự ở phía trước? như trong, tôi cũng có thể sử dụng nó nếu tôi không có bất kỳ cam kết nào trước mắt và trên thực tế, chi nhánh có thể được chuyển tiếp nhanh không?
Jared Forsyth

1
Cảm ơn! Làm cho nó có vẻ dễ dàng.
sholsinger

137

Bạn có thể sử dụng câu trả lời từ liên kết trùng lặp được chỉ ra bởi nvm.

Hoặc bạn có thể giải quyết xung đột bằng cách sử dụng các thay đổi của họ (nhưng một số thay đổi của bạn có thể được giữ nếu chúng không xung đột với phiên bản từ xa):

git pull -s recursive -X theirs

3
Dường như không làm việc cho tôi. Tôi nhận được "lỗi: công tắc không xác định` X '"bằng cách sử dụng git git phiên bản 1.5.6.5. Tôi có cần nâng cấp lên phiên bản không ổn định không?
David Tuite

Ngoài ra, Antoine, nếu bạn muốn lấy phiên bản gốc của mọi thứ, không chỉ là nội dung mâu thuẫn, bạn có thể - xem câu trả lời của tôi.
Cascabel

2
@David Bạn có thể nhận phiên bản git gần đây cho debian từ backports.debian.org
Arrowmaster

2
Điều này thật đúng với gì mà tôi đã tìm kiếm!
micahblu

2
@CeesTimmerman Không đúng, ít nhất là trong git mới nhất. Xtùy chọn được chuyển qua để hợp nhất chiến lược, chỉ recursivekhi hợp nhất hai đầu, do đó lệnh của bạn sẽ phàn nàn "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- thật đáng tiếc, vì Xcó thể được đặt trong cấu hình (ví dụ git config pull.twohead theirs) nhưng skhông thể.
OJFord
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.