Bỏ qua để đến nội dung

Git workflow

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.

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`.
Terminal window
git switch main && git pull --rebase
git switch -c feat/gio-hang
# ... viết mã, commit nhỏ và thường xuyên ...
git push -u origin feat/gio-hang

Trước khi mở pull request, đồng bộ với main bằng rebase để lịch sử thẳng:

Terminal window
git fetch origin
git rebase origin/main
git push --force-with-lease
  • 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ữ main mỗi thay đổi một commit.
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.

Terminal window
git bisect start
git bisect bad # commit hiện tại đang lỗi
git 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/bad
git bisect reset

Với n commit, bisect chỉ cần khoảng log2(n) lần kiểm tra.