Git ngăn chặn việc pull file về máy cục bộ nếu có thay đổi chưa lưu hoặc file chưa theo dõi sẽ bị ghi đè bởi thao tác hợp nhất. Bạn có thể dùng phương pháp force pull để ép Git kéo thay đổi mong muốn.
Hướng dẫn này trình bày, kèm ví dụ, cách force pull nội dung kho Git. Chúng ta sẽ thảo luận lệnh git pull và fetch, cũng như cách dùng tùy chọn reset để buộc pull.
Pull là gì?
Thao tác Git pull tải xuống tất cả metadata và file từ kho từ xa, cập nhật kho cục bộ dựa trên dữ liệu lấy được. Pull dùng để đồng bộ file cục bộ với phiên bản từ xa. Bạn phải pull nếu muốn tải thay đổi người khác đã làm trên kho từ xa. Pull không diễn ra tự động.
Pull không thể thực hiện khi có file chưa theo dõi sẽ bị ghi đè – nghĩa là bạn có file trên nhánh cục bộ chưa thêm vào Git và sẽ bị thay thế nếu pull diễn ra. Cũng không thể pull nếu có thay đổi chưa lưu trên máy cục bộ sẽ bị ghi đè.
Git: Force Pull
Chúng ta làm việc trên kho ck-git chứa code dự án web. Đồng nghiệp vừa cập nhật file README.md. Chúng ta cũng sửa file đó trên máy nhưng chưa push lên kho.
Thử pull thay đổi:
git pull
Lệnh trả về lỗi:
error: Your local changes to the following files would be overwritten by merge: README.md Please, commit your changes or stash them before you can merge.
Có ba lựa chọn: commit thay đổi, stash chúng, hoặc buộc Git pull (sẽ ghi đè file cục bộ).
Để force pull, hãy fetch thay đổi rồi reset kho về trạng thái kho từ xa. Bắt đầu bằng fetch:
git fetch --all
Lệnh này lấy tất cả metadata thay đổi từ kho từ xa. Tiếp theo, sao lưu nhánh hiện tại để không mất công việc khi code bị ghi đè:
git branch backup
Tạo nhánh mới tên "backup". Bây giờ reset kho để hiển thị nội dung kho từ xa:
git reset --hard origin/master
Tùy chọn --hard tải tất cả file từ kho từ xa vào bản sao làm việc cục bộ, ghi đè mọi thay đổi bạn đã làm. origin/master chỉ nhánh master từ kho từ xa origin. Nếu kho dùng nhánh/remote khác, dùng công thức:
git reset --hard <remote>/<branch>
Lệnh git reset đưa kho về commit mới nhất vừa fetch.
Lưu thay đổi chưa commit
Bạn có thể lưu thay đổi chưa commit bằng git stash. Lệnh này "giấu" code để dùng sau:
git stash
Tất cả thay đổi sẽ lưu trong stash. Khi muốn dùng lại, "pop" stash:
git stash pop
Xem thêm hướng dẫn git stash chi tiết.
Kết luận
Bạn có thể buộc kho Git pull nội dung từ kho từ xa. Cần fetch nội dung trước, sau đó reset thay đổi về nhánh trên kho từ xa mong muốn. Bây giờ bạn đã sẵn sàng force pull như chuyên gia!