Git workflow
This content is not available in your language yet.
Mô hình nhánh
Phần tiêu đề “Mô hình nhánh”Dùng trunk-based: main luôn ở trạng thái phát hành được, mọi thay đổi đi qua nhánh ngắn hạn.
| Nhánh | Đặt tên | Vòng đời |
|---|---|---|
main |
— | Vĩnh viễn, luôn xanh |
| Tính năng | feat/ten-ngan |
Dưới 3 ngày |
| Sửa lỗi | fix/mo-ta-loi |
Dưới 1 ngày |
| Tài liệu | docs/pham-vi |
Ngắn |
| Hotfix | hotfix/mo-ta |
Merge thẳng, phát hành ngay |
Nhánh sống càng lâu, xung đột (conflict) càng đắt. Nhánh quá 3 ngày là dấu hiệu nên tách nhỏ công việc.
Commit
Phần tiêu đề “Commit”Theo Conventional Commits:
<type>(<scope>): <mô tả ngắn, thể mệnh lệnh, không dấu chấm cuối>Các type dùng thường xuyên:
| Type | Dùng cho |
|---|---|
feat |
Thêm tính năng |
fix |
Sửa lỗi |
docs |
Chỉ đổi tài liệu |
refactor |
Đổi cấu trúc mã, không đổi hành vi |
perf |
Cải thiện hiệu năng |
test |
Thêm hoặc sửa test |
chore |
Việc lặt vặt: phụ thuộc, cấu hình, CI |
Thay đổi phá vỡ tương thích: thêm ! sau scope và ghi BREAKING CHANGE: trong phần thân.
feat(api)!: doi dinh dang tra ve cua /users
BREAKING CHANGE: truong `name` tach thanh `firstName` va `lastName`.Vòng làm việc thường ngày
Phần tiêu đề “Vòng làm việc thường ngày”git switch main && git pull --rebasegit switch -c feat/gio-hang# ... viết mã, commit nhỏ và thường xuyên ...git push -u origin feat/gio-hangTrước khi mở pull request, đồng bộ với main bằng rebase để lịch sử thẳng:
git fetch origingit rebase origin/maingit push --force-with-leaseMerge hay rebase?
Phần tiêu đề “Merge hay rebase?”- Rebase nhánh riêng của mình lên
main: nên, lịch sử sạch, dễ đọc. - Rebase nhánh đã chia sẻ cho người khác: không, người kia sẽ phải sửa lịch sử của họ.
- Merge vào
main: dùng squash merge cho nhánh tính năng, giữmainmỗi thay đổi một commit.
Gỡ khi lỡ tay
Phần tiêu đề “Gỡ khi lỡ tay”| Tình huống | Lệnh |
|---|---|
| Sửa mô tả commit vừa tạo | git commit --amend |
| Bỏ commit cuối, giữ thay đổi trong thư mục làm việc | git reset --soft HEAD~1 |
| Bỏ hẳn commit cuối và mọi thay đổi | git reset --hard HEAD~1 |
| Cất thay đổi dở dang | git stash push -m "dang lam gio hang" |
| Lấy lại thay đổi đã cất | git stash pop |
| Lấy một commit từ nhánh khác | git cherry-pick <sha> |
| Đảo ngược commit đã đẩy lên chung | git revert <sha> |
| Tìm lại commit tưởng đã mất | git reflog |
Trên nhánh chung, đừng dùng reset; dùng revert để tạo commit đảo ngược — lịch sử của người khác
không bị viết lại.
Tìm commit gây lỗi
Phần tiêu đề “Tìm commit gây lỗi”git bisect startgit bisect bad # commit hiện tại đang lỗigit bisect good v1.4.0 # phiên bản còn chạy đúng# Git checkout từng commit ở giữa, kiểm tra rồi đánh dấu good/badgit bisect resetVới n commit, bisect chỉ cần khoảng log2(n) lần kiểm tra.