Git config for mono repo
Git basic
git fetch origin
Dùng để tải toàn bộ lịch sử commit, branch, tag mới nhất từ remote server (origin) về local. Nhưng hoàn toàn không merge hay thay đổi bất kỳ dòng code nào.
1.1 Cơ chế của git fetch
Trong git local bạn có 2 loại nhánh:
- Nhánh local:
main,feature/login - Nhánh Remote-tracking: ví dụ
origin/main,origin/Release_R1.0.0-A
Khi chạy git fetch origin: Git liên hệ với server origin để xem có commit hoặc nhánh mới nào không. -> Git kéo dữ liệu đó về và cập nhật vào các nhánh origin/<tên-nhánh> trong thư mục .git/.
git pull origin
git pull = git fetch + git merge
Quy trình
Lưu ý.
- Cherry-pick từ commit gốc trên feature branch, đừng cherry-pick commit squash đã merge vào A (SHA khác, dễ conflict). Nên làm PR#2 ngay khi PR#1 xong, đừng chờ PR#1 được merge.
- Dùng
-xđể có dòng cherry picked from. giúp dễ truy vết. - Commit nhỏ, mỗi commit một ý và luôn có ticket ID. Cherry pick một khoảng commit sạch hơn so với một commit khổng lồ.
- Khi conflic ở PR#2, giải quyết xong dùng
git cherry-pick --continue. Nếu thấy sai hướng,git cherry-pick --abort
Nếu nhảy nhiều Release: dùng worktree
Đừng stash rồi đổi branch liên tục. Mỗi release làm 1 thư mục riêng.
-
Mỗi worktree có
target/vànode_modulesriêng, cầnnpm civà build lại từ đầu. -
Nếu không muốn dùng worktree: git stash push -u -m "ABC-123 wip", hoặc tốt hơn là commit WIP rồi git commit --amend sau.
Sau cherry-pick, commit nào "tương đương" đã có bên kia
git cherry -v origin/R1.0.0 HEAD
Daily
Mỗi ngày chỉ cần gỡ conflict nếu có.
Nếu branch bạn đã push (PR draft), sau khi rebase dùng
Chỉ làm vậy nếu branch đó chỉ có mình bạn dùng.
Check Conflict sớm
Lệnh cuối in ra conflict nếu có.
Note
git fetch origin
git rebase origin/R_1.0.0 (giải quyết conflict nếu có).
Gộp các commit vụn/WIP thành commit sạch đẹp (git rebase -i hoặc squash).
Build và test lại toàn bộ.
Push lên remote (nếu đã từng push bản WIP trước đó thì lúc này mới dùng --force-with-lease).
Giải quyết bằng git rebase (Khuyên dùng - Giữ lịch sử commit phẳng, sạch) Quy trình này đặt các commit của bạn lên trên commit mới nhất của release, giúp commit history thẳng và dễ cherry-pick sang branch release thứ hai.
Đảm bảo thư mục làm việc sạch sẽ: Kiểm tra xem còn file nào chưa commit không:
Bash git status (Nếu còn code dở dang, hãy commit lại hoặc cất tạm bằng git stash).
Kéo dữ liệu mới nhất từ remote về:
Bash git fetch origin Bắt đầu rebase vào nhánh release mục tiêu:
Bash git rebase origin/Release_IA_R6.X.X-AMS Git sẽ dừng lại tại commit gây ra conflict và thông báo danh sách các file bị đụng độ.
Xử lý conflict trong IDE (VS Code / IntelliJ):
Mở các file bị conflict (các file có dấu hiệu <<<<<<<, =======, >>>>>>>).
Chọn giữ code của bạn (Accept Current Change), giữ code của release (Accept Incoming Change), hoặc kết hợp cả hai theo đúng logic nghiệp vụ.
Lưu các file đã sửa.
Đánh dấu file đã giải quyết và tiếp tục rebase:
Bash
git add
Build và test lại toàn bộ:
Chạy build (Maven/npm/yarn) và test cục bộ để đảm bảo code sau khi ghép không bị vỡ logic hay lỗi cú pháp.
Đẩy code đè lên remote feature branch: Vì rebase làm thay đổi commit hash, bạn phải dùng cờ an toàn --force-with-lease:
Bash git push --force-with-lease origin feature/ticket-1 Lúc này trên Azure DevOps, PR của bạn sẽ tự động cập nhật và biến mất trạng thái conflict.