Tạo Pull Request
Xem thửVấn đề cần giải quyết
Bạn vừa làm xong tính năng giỏ hàng. Nếu đẩy thẳng vào main, không ai xem lại, lỗi sẽ lọt vào bản phát hành. Cách làm của các đội hiện đại là mở một Pull Request (PR): đề xuất hợp nhất nhánh của bạn vào main, kèm nơi để đồng đội thảo luận và review trước khi merge. Trên GitLab nó tên là Merge Request.
Sau bài này, bạn có thể
- Giải thích Pull Request là tính năng của nền tảng, không phải lệnh của Git.
- Đi qua quy trình: nhánh, commit, push, mở PR, nhận góp ý, merge.
- Viết một PR nhỏ, rõ ràng và dễ review.
Tiên quyết: bài git push và khái niệm nhánh.
Vì sao cần PR
- Review code: đồng đội xem, góp ý và phát hiện lỗi sớm.
- Ngữ cảnh: mô tả vì sao thay đổi, liên kết issue, gắn ảnh chụp màn hình.
- Cổng chất lượng: chạy CI (test, lint, build) tự động trước khi merge.
- Lịch sử quyết định: các cuộc thảo luận được lưu lại lâu dài.
Thử và quan sát
Hãy dự đoán: reviewer yêu cầu sửa trong lúc PR đang mở. Bạn cần tạo PR mới hay chỉ push thêm commit vào nhánh cũ? Chạy mô phỏng toàn bộ vòng đời, rồi bấm biến thể để so sánh cách merge dạng squash.
Đang tải Animation…
Bảng bước (bản đọc tĩnh của mô phỏng)
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | git switch -c feature/cart && git commit -m "Thêm giỏ hàng" | Làm việc trên nhánh riêng, không đụng main. |
| 2 | git push -u origin feature/cart | Đẩy nhánh lên remote. Chỉ từ lúc này mới có thể mở Pull Request. |
| 3 | (trên nền tảng) Open pull request | PR là trang trên nền tảng đề xuất hợp nhất feature/cart vào main. Nó không phải lệnh của Git. |
| 4 | (CI và reviewer) | CI chạy tự động. Reviewer đọc và yêu cầu sửa một chỗ. |
| 5 | git commit -m "Sửa theo góp ý" && git push | Chỉ cần push thêm commit vào cùng nhánh; PR tự cập nhật, không tạo PR mới. |
| 6 | (Approve) | Reviewer duyệt và CI xanh, PR sẵn sàng merge. |
| 7 | (Merge pull request) | Nền tảng merge trên remote: tạo commit hợp nhất M. Lúc này máy bạn chưa biết gì. |
| 8 | git switch main && git pull | Kéo main về máy bạn để có commit hợp nhất. Sau đó có thể xóa nhánh tính năng. |
Biến thể: Squash and merge
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | (Squash and merge) | Nền tảng gộp F1 và F2 thành một commit duy nhất S trên main. Lịch sử main thẳng và gọn. |
| 2 | (Delete branch) | Xóa nhánh tính năng trên remote vì đã hoàn thành. |
| 3 | git switch main && git pull | Máy bạn nhận S. Các commit F1, F2 gốc chỉ còn ở nhánh cục bộ feature/cart nếu bạn chưa xóa. |
Giải đáp. Chỉ cần push thêm commit vào cùng nhánh: PR tự cập nhật, bạn không tạo PR mới sau mỗi góp ý. Pull Request chỉ tồn tại sau khi nhánh đã được push lên máy chủ, và việc merge xảy ra trên máy chủ, nên cuối cùng bạn phải git pull để lấy commit hợp nhất về máy.
Quy trình điển hình
git switch -c feature/gio-hang
git add .
git commit -m "Thêm chức năng giỏ hàng"
git push -u origin feature/gio-hang
Sau đó vào GitHub, GitLab hoặc Bitbucket mở Pull Request từ feature/gio-hang vào main.
Vòng đời một PR
Mở PR -> CI chạy -> Reviewer góp ý -> Bạn sửa và push thêm commit
-> Được duyệt (approve) -> Merge -> Xóa nhánh
Vòng lặp nằm ở giữa: mỗi lần reviewer yêu cầu sửa, bạn push thêm commit và PR quay lại trạng thái chờ duyệt.
Các kiểu merge
| Kiểu | Kết quả trên main | Khi nào hợp |
|---|---|---|
| Merge commit | Giữ mọi commit của nhánh và thêm commit hợp nhất | Muốn giữ nguyên lịch sử làm việc |
| Squash and merge | Gộp cả nhánh thành một commit | Muốn main gọn, mỗi PR một commit |
| Rebase and merge | Xếp từng commit lên trên main, không commit hợp nhất | Muốn lịch sử thẳng |
Mẹo viết PR tốt
- Tiêu đề rõ ràng; mô tả ngắn gọn cái gì và vì sao.
- Giữ PR nhỏ: dễ review, ít lỗi.
- Trả lời từng góp ý; push commit sửa thay vì tạo PR mới.
- Đảm bảo CI xanh trước khi nhờ duyệt.
- Sau khi merge, nên xóa nhánh tính năng để kho gọn.
Hiểu lầm thường gặp
- "Pull Request là lệnh của Git." Nó là tính năng của nền tảng đặt trên nhánh đã push.
- "Mỗi góp ý cần một PR mới." Chỉ cần push thêm commit vào cùng nhánh.
- "Merge xong là máy tôi có ngay." Merge diễn ra trên máy chủ; bạn cần
git pull.
Tự kiểm tra
- Điều kiện nào cần có trước khi mở được Pull Request?
- Squash and merge khác merge commit thế nào về lịch sử
main? - Reviewer yêu cầu sửa. Bạn làm gì và PR có tự cập nhật không?
Đáp án gợi ý. (1) Nhánh phải được push lên máy chủ. (2) Squash gộp cả nhánh thành một commit; merge commit giữ mọi commit và thêm commit hợp nhất. (3) Sửa, commit và push vào cùng nhánh; PR tự cập nhật.
Điều cần nhớ
- Pull Request là tính năng của nền tảng, đặt trên nhánh đã push.
- Góp ý thì push thêm commit, không mở PR mới.
- Merge xảy ra trên máy chủ; sau đó
git pull. - PR nhỏ, CI xanh, mô tả rõ vì sao.
- Chương sau: Làm việc với nhánh.
Nguồn tham khảo
Tài liệu GitHub Docs về pull request; Pro Git, chương 6 "GitHub" (git-scm.com/book).