Tài liệu này mô tả các vấn đề:
- Mô hình branch
- Trình tự thực hiện một task
- Các lệnh git thường gặp
- Một branch được coi như một "phiên bản" của code base, nhằm phục vụ cho một mục đích nào đó
- Mỗi branch gồm nhiều commit, mỗi commit là một "lần sửa đổi" code base.
Các branch được chia thành hai loại như sau:
- Là những branch tồn tại trong suốt quá trình phát triển (lifetime).
- Protected, không nên thực hiện các hành động sau:
- Xóa branch
- Rebase, cherry-pick, hoặc bất cứ hành động thay đổi cấu trúc tree commit
Các branch chính bao gồm:
- Là branch chứa code hoàn thiện nhất (sau khi code, review, test) và có thể bàn giao hoặc deploy lên production server
- Thường được deploy trên môi trường production.
- Là branch chứa code mới nhất trong quá trình phát triển (sau khi code, review), đang đợi test và fixbug.
- Thường được deploy trên môi trường testing.
- Là những branch chỉ tồn tại trong một giai đoạn nào đó của quá trình phát triển (limited)
- Vòng đời của một branch phụ:
- Tách nhánh (checkout) từ một trong các branch chính
- Chỉnh sửa code
- Hợp nhất (merge) với một hoặc cả hai branch chính
- Xóa branch
Các branch phụ có thể bao gồm:
- Dùng để phát triển tính năng mới hoặc fixbug trong quá trình phát triển.
- Checkout từ
develop. Merge vàodevelop - Tùy theo chức năng, có thể đặt tên với tiền tố
feature-,enhancement-,bug-hoặc đơn giản là chỉ dùng thống nhất tiền tốfeature- - Các task không có redmine issue, nên được đặt với tiền tố
support- - Quy ước đặt tên:
feature-{redmine-issue-id}-mô-tả-ngắn-gọn
Ví dụ với task phát triển cho issue 20001, sẽ được đặt tên là:
feature-20001-create-user-page
- Dùng để chuyển giao code từ branch
developsang branchmaster - Checkout từ
develop. Merge vào cảmastervàdevelop - Trong trường hợp code release có bug, có thể tạm tách branch
release-fix-từ branchrelease-, fixbug và merge vào branchrelease-. Trong trường hợp này bắt buộc phải merge lại branchrelease-vào branchdevelop- - Trong trường hợp code release không có bug, thông thường sẽ không cần phải merge lại branch
release-vào branchdevelop- - Quy ước đặt tên:
release-X.X
Với X.X là phiên bản (version) của application tại thời điểm release, ví dụ với phiên bản là 0.1, sẽ được đặt tên là:
release-0.1
- Dùng để fixbug phát sinh trên môi trường production sau khi đã release.
- Checkout từ
master. Merge vào cảmastervàdevelop - Quy ước đặt tên:
hotfix-X.X.Y
Với X.X là phiên bản (version) vừa release, Y là thứ tự bản hotfix, ví dụ với phiên bản là 0.1, bản fix thứ nhất, sẽ được đặt tên là:
hotfix-0.1.1
-
Nhằm đánh dấu các version của application, xuất
changelogkhi có yêu cầu -
Các thời điểm cần đánh dấu tag (lightweight tag):
- Bắt đầu dự án
git tag v0.1- Ngay trước khi merge code release
git tag v0.2- Ngay trước khi merge code hotfix
git tag v0.2.1 -
Xuất
changelog
git log --no-merges v0.2...v0.1
- Một task cần phải được thực hiện trên một branch phụ, không được thực hiện trực tiếp trên branch chính
- Một task trước khi merge vào branch chính cần được
- Merge code mới nhất từ branch chính đã checkout
- Tối thiểu hóa số commit phát sinh, tốt nhất nên là 1 commit trên 1 branch phụ
- Viết commit message theo đúng quy ước
- Tạo merge request
- Review code
Giả sử một developer cần làm một task được giao bởi redmine issue 20001, các bước mà anh ta cần thực hiện như sau:
- Chuyển branch hiện tại sang
developgit checkout develop - Lấy code mới nhất từ remote
git pull origin `develop` - Tách sang nhánh mới
git checkout -b feature-20001
- ....
-
Xem trạng thái hiện tại trên branch
git status -
Add/Update/Remove các file code thay đổi
git add file.php git add -u file2.php git rm file3.phpLưu ý: Có thể add folder để tăng tốc dộ, tuy nhiên không nên sử dụng lệnh
git add . -
Kiểm tra lại lần cuối trạng thái staged
git status -
Tạo commit
git commitLưu ý: Không nên sử dụng lệnh
git commit -mđể tránh việc viết commit message oneline.Quy ước về viết commit message:
- Bao gồm hai phần: subject (%s) và body (%b)
- Subject không quá 50 kí tự
- Body markdown. bắt buộc có tag
Resolves - Mỗi phần tách nhau bởi một dòng trắng
- Ví dụ:
Init code for login function (L001 page) {BLANK LINE} - Add login route, controller, view - Add AuthService, SmsNotification, CreatedUserEvent - Resolves #20001 {BLANK LINE}
- Kiểm tra số lượng commit từ commit tree:
git log --oneline -10
- Nếu có 2 commit trở lên tính từ merge request gần nhất thì cần phải gộp các commit này với nhau:
git rebase -i HEAD~2
use f (fixup) option
(Chú ý: HEAD~2 là ví dụ với trường hợp cần gộp 2 commit, trường hợp cần gộp 3 commit là HEAD~3, tương tự HEAD~4, ...)
- Cập nhật git reference
git fetch origin - Trong trường hợp nhánh develop đã có sự thay đổi, cần cập nhật
git pull --rebase origin develop - Sửa conflict
- Push code
git push origin feauture-20001 - Tạo merge request với nhánh develop trên Github, Gitlab, ...
- Assign merge request cho người review code
- Trong trường hợp review code có comment, developer cần sửa lại code theo comment
- Thực hiện lại các bước 3.2.3 (với commit message bất kỳ)
- Rebase code (để merge code với commit đã có trước đó)
git rebase -i HEAD~2 use f (fixup) option - Thực hiện lại bước 3.2.4
- Push code
git push -f origin feature-20001
- Dùng chức năng merge và xóa branch trên Github, Gitlab
- Hoặc sử dụng lệnh
git merge --no-ff feature-20001 git push origin :feature-20001

