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ướcLệnhĐiều xảy ra
1git 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.
2git 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 requestPR 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ỗ.
5git commit -m "Sửa theo góp ý" && git pushChỉ 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ì.
8git switch main && git pullKé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ướcLệ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.
3git switch main && git pullMá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

bash
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

text
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ểuKết quả trên mainKhi nào hợp
Merge commitGiữ mọi commit của nhánh và thêm commit hợp nhấtMuốn giữ nguyên lịch sử làm việc
Squash and mergeGộp cả nhánh thành một commitMuốn main gọn, mỗi PR một commit
Rebase and mergeXếp từng commit lên trên main, không commit hợp nhấtMuố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

  1. Điều kiện nào cần có trước khi mở được Pull Request?
  2. Squash and merge khác merge commit thế nào về lịch sử main?
  3. 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).