Cú lừa lúc 2 giờ sáng mang tên ‘git pull’
2 giờ sáng, server production gặp lỗi logic nghiêm trọng. Mình cần kéo gấp bản hotfix của đồng nghiệp để deploy ngay lập tức. Trong cơn ngái ngủ, mình gõ vội git pull origin master với hy vọng mọi thứ sẽ ổn.
Kết quả? Một dòng thông báo đỏ rực: “Automatic merge failed; fix conflicts and then commit the result.”. Tệ hơn, lịch sử commit xuất hiện một cái “Merge branch…” vô nghĩa, làm rối tung sơ đồ Git vốn đang sạch đẹp.
Sai lầm này khiến mình mất thêm 30 phút quý giá chỉ để dọn dẹp đống hỗn độn. Nếu bạn vẫn dùng git pull như một bản năng, đã đến lúc dừng lại. Hãy cùng mổ xẻ xem chúng ta đang thực sự làm gì với repository của mình.
So sánh hai hướng tiếp cận: Cẩn trọng vs. Tiện lợi
Cả hai lệnh đều lấy dữ liệu từ remote (GitHub, GitLab…). Tuy nhiên, cách chúng xử lý dữ liệu lại khác biệt hoàn toàn.
1. Git Fetch: Chế độ “Xem trước” an toàn
Chạy git fetch giống như việc bạn tải tờ báo mới về nhưng chưa mở ra đọc. Git liên lạc với server, tải dữ liệu mới nhưng không thay đổi bất kỳ file nào trong thư mục làm việc của bạn.
git fetch origin
Lúc này, Git cập nhật các Remote Tracking Branches (như origin/main). Bạn có thể thong thả so sánh code local và server trước khi quyết định gộp chúng lại. Tách cà phê của bạn vẫn an toàn, không lo bị đổ thêm thứ gì lạ vào.
2. Git Pull: Tiện nhưng đầy rủi ro
Thực tế, git pull là một lệnh kép. Nó thực hiện git fetch, sau đó tự động chạy git merge để gộp thay đổi vào branch hiện tại.
git pull origin main
Sự tiện lợi này là con dao hai lưỡi. Nếu code hai bên lệch nhau, Git ép bạn xử lý conflict ngay lập tức. Bạn mất đi cơ hội xem xét trước những thay đổi đó ảnh hưởng thế nào đến tính năng mình đang viết.
Tại sao Git Fetch lại là lựa chọn của Senior?
Kiểm soát hoàn toàn lịch sử
Bạn có thể dùng lệnh git log HEAD..origin/main. Nó cho phép bạn xem chính xác những commit nào sắp nạp vào máy mình. Không có bất ngờ, không có hoảng loạn.
Tránh tạo ra “mạng nhện” trong Git Graph
Trong một team 8 người mình từng quản lý, việc lạm dụng git pull tạo ra hàng chục merge commit dư thừa mỗi tuần. Điều này làm biểu đồ Git trông như một mớ bòng bong. Dùng fetch giúp bạn có quyền chọn rebase để giữ lịch sử thẳng tắp.
Workflow chuẩn từ dự án thực tế
Để giữ code sạch, mình khuyến khích anh em áp dụng hai quy trình sau:
Trường hợp 1: Muốn lịch sử commit sạch đẹp (Clean History)
Sử dụng fetch kết hợp với rebase. Cách này giúp các commit của bạn luôn nằm trên cùng một đường thẳng với server.
git fetch origin
git rebase origin/main
Hoặc dùng lệnh tắt: git pull --rebase origin main. Team mình đã giảm được 70% các merge commit rác nhờ thói quen này.
Trường hợp 2: Kiểm tra kỹ trước khi gộp
Đây là quy trình bắt buộc khi làm task quan trọng hoặc khi server đang ở trạng thái nhạy cảm:
git fetch origin: Cập nhật thông tin mới nhất.git diff main origin/main: So sánh chi tiết từng dòng code.git merge origin/main: Chỉ gộp khi đã chắc chắn mọi thứ ổn.
Xử lý khi bị Diverged History
Thông báo “Your branch and ‘origin/main’ have diverged” xuất hiện khi cả local và remote đều có commit mới. Đừng lo, hãy xử lý bình tĩnh:
Bước 1: git fetch origin để lấy thông tin mới nhất.
Bước 2: Kiểm tra tình hình bằng git log --oneline --graph --all.
Bước 3: Giải quyết sai khác. Nếu muốn lịch sử sạch, hãy chọn git rebase origin/main. Nếu muốn giữ nguyên vết gộp, chọn git merge origin/main.
Mẹo nhỏ cho dân chuyên
Bạn có thể cấu hình Git luôn ưu tiên rebase khi pull để đỡ phải gõ nhiều:
git config --global pull.rebase true
Từ khi áp dụng dòng này, số lượng conflict vô lý trong team mình giảm hẳn. Sơ đồ commit trông chuyên nghiệp và dễ debug hơn nhiều.
Lời kết
Ghi nhớ đơn giản: git fetch để xem, git pull để lấy và gộp. Trong môi trường chuyên nghiệp, hiểu rõ mình đang nạp cái gì vào source code là điều tiên quyết. Đừng để một phút lười biếng phá hỏng công sức cả ngày. Hãy thong thả fetch, kiểm tra log, rồi mới quyết định bước tiếp theo.

