Cấu hình pull.rebase và rebase.autoStash: Giữ Git log thẳng hàng, không lo mất code dở

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Hai cách Git xử lý khi bạn kéo code về máy

Giả sử bạn đang sửa dở 3 file trong sprint task thì đồng nghiệp báo vừa push hotfix lên main. Bạn cần kéo ngay bản vá đó về. Lệnh quen thuộc là git pull. Tuy nhiên, đằng sau lệnh này, Git có hai cơ chế hòa trộn mã nguồn rất khác nhau.

1. Git Pull mặc định (Chiến lược Merge)

Mặc định, nếu local đã có commit mới, git pull sẽ tự tạo thêm một commit trung gian: Merge commit. Kiểu như: Merge branch 'main' of github.com:....

Trong một nhóm khoảng 6–8 lập trình viên push code liên tục, chỉ sau 1 tuần, git log --graph sẽ biến thành một mạng nhện chằng chịt. Lịch sử commit bị phân mảnh nghiêm trọng. Khi cần dùng git bisect để truy vết bug, bạn sẽ tốn gấp đôi thời gian vì phải nhảy qua hàng chục nhánh rẽ không cần thiết.

2. Git Pull với cờ Rebase

git pull --rebase xử lý theo tư duy khác: sắp xếp lại dòng thời gian.

Git tạm nhấc các commit cục bộ của bạn ra ngoài. Tiếp theo, Git kéo toàn bộ commit mới từ remote về trước. Cuối cùng, Git đặt từng commit của bạn lên trên đỉnh nhánh đó. Lịch sử dự án giữ nguyên một đường thẳng tuyến tính (linear history). Ai nhìn vào cũng thấy rõ thứ tự tính năng được phát triển.

Nút thắt: Code đang viết dở (Dirty Working Tree)

Vấn đề là chúng ta hiếm khi commit trước khi pull. Thường trong máy vẫn còn vài dòng code test dở dang.

Khi gặp thay đổi chưa commit, git pull --rebase sẽ dừng lại và báo lỗi ngay lập tức: “error: cannot rebase: You have unstaged changes”. Lúc này, quy trình thủ công khá phiền phức:

  1. Gõ git stash để cất code tạm thời.
  2. Gõ git pull --rebase kéo code mới.
  3. Gõ git stash pop khôi phục lại code đang viết.

Chỉ cần quên bước 3, bạn sẽ ngỡ ngàng tưởng mình vừa bị xóa sạch code.

So sánh trực tiếp các giải pháp

Dưới đây là bảng đối chiếu giữa ba cách tiếp cận thường gặp:

  • Giữ nguyên pull mặc định: Dễ dùng, an toàn cho fresher vì không ghi đè commit hash. Điểm trừ là sinh ra quá nhiều merge commit rác (trung bình 15–30 commit thừa mỗi sprint), làm loãng lịch sử repo.
  • Chạy pull –rebase thủ công: Cây commit sạch và thẳng hàng. Dù vậy, thao tác gõ 3 lệnh stash > pull > pop lặp đi lặp lại rất dễ sót bước khi đang vội.
  • Bật pull.rebase kết hợp rebase.autoStash: Tự động hóa 100%. Bạn chỉ cần gõ đúng một lệnh git pull. Git sẽ tự cất thay đổi dở dang, rebase nhánh và tự khôi phục lại code cho bạn.

Kinh nghiệm áp dụng thực tế trong team

Tại một dự án fintech quy mô 10 developer mà tôi từng tham gia, nhóm từng mất gần 3 tiếng trước giờ release chỉ để gỡ các lỗi conflict do merge commit chéo gây ra. Có trường hợp code cũ vô tình đè lên code mới đã review.

Sau khi thống nhất cả team bật cấu hình rebase kèm autoStash, tình trạng này biến mất. Tần suất conflict giảm rõ rệt. Đồ thị Git log luôn thẳng tắp, giúp lead duyệt PR và cherry-pick commit sang nhánh release cực kỳ nhẹ nhàng.

Cấu hình này đặc biệt phù hợp nếu bạn:

  • Làm việc theo mô hình Agile/Scrum, thường xuyên rebase nhánh tính năng vào develop.
  • Muốn log rõ ràng để hệ thống CI/CD tự động trích xuất changelog theo Conventional Commits.
  • Thích thao tác nhanh, không muốn bận tâm đến việc stash code thủ công mỗi ngày.

Các bước cấu hình chi tiết

Bạn chỉ cần mở terminal và chạy 2 lệnh bên dưới. Thiết lập này chỉ cần làm một lần duy nhất.

Cấu hình áp dụng cho toàn bộ máy (Global – Khuyên dùng)

# 1. Đặt rebase làm cơ chế mặc định cho git pull
git config --global pull.rebase true

# 2. Tự động stash trước khi rebase và trả lại code ngay sau đó
git config --global rebase.autoStash true

Cấu hình riêng cho một dự án cụ thể (Local)

Nếu repository của công ty có chính sách riêng yêu cầu giữ nguyên merge commit, hãy chỉ áp dụng cục bộ cho dự án cá nhân:

cd /path/to/my-project
git config pull.rebase true
git config rebase.autoStash true

Kiểm tra lại thiết lập

Để đảm bảo Git đã ghi nhận cấu hình, hãy chạy lệnh:

git config --global --get-regexp "pull|rebase"

Màn hình hiển thị kết quả như sau là hoàn tất:

pull.rebase true
rebase.autostash true

Trải nghiệm thực tế trên terminal

Sau khi thiết lập, giả sử bạn đang chỉnh sửa file services/auth.go mà chưa commit. Khi có cập nhật mới từ remote, bạn chỉ cần gõ:

git pull

Git sẽ tự động xử lý toàn bộ các khâu ngầm:

Created autostash: 8f2c1b4
First, rewinding head to replay your work on top of it...
Fast-forwarded main to origin/main.
Applying autostash: 8f2c1b4
Applied autostash.

File auth.go của bạn vẫn giữ nguyên trạng thái sửa dở. Toàn bộ commit mới từ server đã được kéo về êm thấm. Lịch sử commit thẳng hàng, rõ ràng và không hề xuất hiện một merge commit thừa nào.

Share: