Vấn đề
Nếu bạn vừa cập nhật Git gần đây—cụ thể là phiên bản 2.27.0 trở lên—bạn có thể đã thấy một đoạn văn bản dài 10 dòng mỗi khi chạy git pull. Điều này xảy ra vì Git nhận thấy nhánh cục bộ (local branch) và máy chủ từ xa (remote server) đều đã có những thay đổi độc lập. Trước đây, Git mặc định sẽ gộp (merge) các thay đổi này. Hiện nay, các nhà phát triển muốn bạn chỉ định rõ ràng cách xử lý những tình huống này để tránh làm lộn xộn lịch sử commit.
Cảnh báo đầy đủ trông như thế này:
hint: Pulling without specifying how to reconcile divergent branches is discouraged.
hint: You can replace this hint by running one of the following commands periodically:
hint:
hint: git config pull.rebase false # merge (chiến lược mặc định)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # chỉ fast-forward
Cách khắc phục nhanh: Chọn chiến lược của bạn
Để tắt cảnh báo này, bạn cần chọn một quy trình làm việc (workflow) ưa thích. Bạn có thể thiết lập các tùy chọn này trên toàn hệ thống (global) cho mọi dự án trên máy tính hoặc cục bộ (local) cho chỉ một kho lưu trữ (repository).
Tùy chọn 1: Merge tiêu chuẩn (Tốt nhất cho người mới bắt đầu)
Đây là hành vi cổ điển của Git. Khi bạn pull, Git tạo ra một "merge commit" mới để liên kết công việc cục bộ và các thay đổi từ xa lại với nhau. Nó bảo tồn lịch sử chính xác như những gì đã xảy ra. Bạn sẽ thấy rõ nơi các nhánh gộp lại trong biểu đồ lịch sử.
# Thiết lập global cho tất cả dự án
git config --global pull.rebase false
# Hoặc chỉ thiết lập cho dự án hiện tại
git config pull.rebase false
Tùy chọn 2: Rebase (Tốt nhất để có lịch sử sạch)
Rebase là tùy chọn cho những người thích sự ngăn nắp. Thay vì một merge commit, Git sẽ nhấc các commit cục bộ của bạn lên và đặt các thay đổi từ xa xuống dưới chúng. Kết quả là một đường thẳng hoàn hảo trong git log. Nhiều đội ngũ chuyên nghiệp ưu tiên cách này vì nó giúp việc xem lại mã nguồn (code review) dễ dàng theo dõi hơn.
# Thiết lập global cho tất cả dự án
git config --global pull.rebase true
# Hoặc chỉ thiết lập cho dự án hiện tại
git config pull.rebase true
Tùy chọn 3: Chỉ Fast-Forward (Cách tiếp cận an toàn nhất)
Hãy coi đây là thiết lập "an toàn là trên hết". Git sẽ chỉ hoàn tất việc pull nếu nó có thể di chuyển con trỏ nhánh của bạn về phía trước mà không cần tạo merge commit. Nếu bạn có các commit cục bộ chưa có trên máy chủ, Git sẽ dừng lại và yêu cầu bạn xử lý tình huống theo cách thủ công. Điều này ngăn chặn các lần tự động gộp lộn xộn ngoài ý muốn.
# Thiết lập global cho tất cả dự án
git config --global pull.ff only
# Hoặc chỉ thiết lập cho dự án hiện tại
git config pull.ff only
Bạn nên chọn cái nào?
Hầu hết các lập trình viên chia thành hai nhóm. Nếu bạn đang làm việc trong một nhóm nhỏ hoặc dự án cá nhân, Tùy chọn 1 (Merge) là con đường ít trở ngại nhất. Tuy nhiên, nếu bạn làm việc tại một công ty yêu cầu lịch sử commit phải nguyên sơ, Tùy chọn 2 (Rebase) có khả năng là tiêu chuẩn bắt buộc.
Bạn chỉ cần sử dụng một chiến lược cụ thể một lần duy nhất? Bạn không nhất thiết phải thay đổi toàn bộ cấu hình. Chỉ cần thêm một cờ (flag) vào lệnh của bạn:
git pull --rebase
# HOẶC
git pull --no-rebase
Xác minh
Đừng chỉ nghe lời chúng tôi—hãy tự mình xác minh thay đổi. Chạy lệnh sau để kiểm tra các thiết lập hiện tại của bạn:
git config --global -l | grep pull
Nếu bạn thấy pull.rebase=false hoặc pull.rebase=true, đoạn văn bản "hint" gây phiền nhiễu sẽ không bao giờ làm lộn xộn terminal của bạn nữa. Lần tới khi bạn pull, Git sẽ thực hiện ngay hành động mà bạn đã chọn.
Những điểm chính cần lưu ý
- Rõ ràng thì tốt hơn: Git đang dần loại bỏ các thiết lập mặc định "ngầm định". Nó muốn bạn chọn một quy trình làm việc phù hợp với phong cách của nhóm.
- Phạm vi rất quan trọng: Sử dụng
--globalsẽ thay đổi hành vi cho mọi kho lưu trữ trên máy tính của bạn. Bỏ qua nó sẽ chỉ ảnh hưởng đến tệp.git/configtrong thư mục hiện tại. - Không còn bất ngờ: Cảnh báo này chỉ kích hoạt khi cả bạn và phía máy chủ từ xa đều có những tiến triển riêng biệt. Nếu chỉ máy chủ có commit mới, Git sẽ thực hiện một lệnh fast-forward đơn giản mà không phàn nàn gì.

