Tổng quan và Centralized Workflow

Xem thử

Vấn đề cần giải quyết

Một đội mới có bốn người bắt đầu dự án. Có người muốn ai cũng push thẳng lên main cho nhanh, người khác muốn mọi thay đổi phải qua review, và một người đề nghị chia thành develop, release, hotfix như sách giáo khoa. Không ai sai hoàn toàn: không có workflow đúng cho mọi đội. Một Git workflow là quy ước về cách cả đội dùng Git nhất quán, và bạn chọn nó theo văn hóa, quy mô và nhịp phát hành.

Sau bài này, bạn có thể

  • Nêu ba tiêu chí đánh giá một workflow và áp dụng để so sánh bốn workflow phổ biến.
  • Mô tả Centralized Workflow, ưu nhược điểm và nỗi đau lớn nhất của nó.
  • Chọn workflow phù hợp bằng cách trả lời vài câu hỏi về đội của bạn.

Tiên quyết: chương Làm việc với nhánh.

Tiêu chí đánh giá

  • Có mở rộng theo quy mô đội không?
  • Có dễ hoàn tác sai lầm không?
  • Có bắt mọi người phải ghi nhớ quá nhiều quy ước không?

Bản đồ bốn workflow

Cách đọc hình. Bốn workflow xếp từ đơn giản tới phức tạp. Centralized chỉ có một dòng main ở kho trung tâm. Feature Branch thêm nhánh riêng cho mỗi tính năng và Pull Request. Gitflow thêm các nhánh vai trò cho chu kỳ phát hành. Forking cho mỗi người một bản fork riêng, phù hợp với đóng góp từ bên ngoài. Các bài sau lần lượt đi sâu vào ba workflow còn lại.

Chọn workflow nào

Chọn bằng cách trả lời lần lượt vài câu hỏi về đội của bạn.

Đang tải sơ đồ…

Cách đọc hình. Có người đóng góp từ ngoài tổ chức thì dùng Forking. Nếu không, hỏi tiếp có phát hành theo chu kỳ cố định không: có thì Gitflow. Nếu không, chọn Feature Branch khi cần review và main ổn định, hoặc Centralized khi đội nhỏ và muốn đơn giản nhất. Đây là điểm khởi đầu, không phải luật; nhiều đội lai giữa các workflow.

Centralized Workflow

Đơn giản nhất, hợp với đội nhỏ hoặc đội chuyển từ SVN. Mọi người làm trên một nhánh (main) và đẩy lên một kho trung tâm.

bash
git clone <url-kho-trung-tam>
git push origin main

Nỗi đau điển hình: Dev A push trước, kho trung tâm đi trước máy Dev B, và push của B bị từ chối. Bạn đã thấy cơ chế này ở bài git push. Hãy xem lại nó như một tình huống hằng ngày của Centralized Workflow.

Đ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 push origin mainRemote đã có C5 mà bạn chưa có. Nếu nhận C4, nó sẽ phải bỏ C5, nên Git từ chối để bảo vệ công việc của đồng đội.
2git pull --rebase origin mainLấy C5 về rồi áp lại C4 của bạn lên trên thành C4' với hash mới. Lịch sử giờ là một đường thẳng.
3git push origin mainRemote chỉ cần đi tiếp từ C5 tới C4' nên push được chấp nhận, là fast-forward.

Biến thể: Đẩy nhánh mới với -u

BướcLệnhĐiều xảy ra
1git switch -c feature-login && git commit -m "Form đăng nhập"Tạo nhánh mới và commit F1 trên máy bạn. Remote chưa biết nhánh này.
2git push -u origin feature-loginPush tạo nhánh trên remote. Cờ -u ghi lại upstream: nhánh cục bộ theo dõi origin/feature-login.
3git commit -m "Thêm nút gửi"Commit tiếp F2 ở máy bạn.
4git pushNhờ upstream đã ghi, không cần chỉ rõ đích nữa. Git biết đẩy lên origin/feature-login.

Giải đáp. Dev B chạy git pull --rebase origin main để đặt commit của mình lên trên commit mới của A, rồi git push được chấp nhận. Quy tắc: đồng bộ trước, push sau, đừng force push.

Ưu và nhược điểm

  • Ưu: dễ hiểu, dễ bắt đầu, giống SVN.
  • Nhược: không có review có cấu trúc; dễ nghẽn khi đội đông vì mọi người đụng nhau trên một nhánh.

Centralized là viên gạch nền: các workflow mạnh hơn (Feature Branch, Gitflow, Forking) đều mở rộng từ ý tưởng có một kho trung tâm.

Hiểu lầm thường gặp

  • "Workflow phức tạp hơn thì tốt hơn." Gitflow trên một đội hai người chỉ tốn thêm quy ước.
  • "Phải chọn đúng một workflow." Đội thường lai: ví dụ Feature Branch cho tính năng và nhánh hotfix cho sự cố.
  • "Centralized không có review." Bạn có thể review qua công cụ khác, nhưng Git không bắt buộc nó.

Tự kiểm tra

  1. Ba tiêu chí đánh giá một workflow là gì?
  2. Vì sao push của Dev B bị từ chối trong Centralized Workflow?
  3. Đội 3 người, phát hành liên tục, chưa cần review chặt. Workflow nào phù hợp?

Đáp án gợi ý. (1) Mở rộng, dễ hoàn tác, ít quy ước phải nhớ. (2) Vì kho trung tâm đã có commit của A mà B chưa có. (3) Centralized, hoặc Feature Branch nếu muốn thêm review.

Điều cần nhớ

  • Không có workflow đúng cho mọi đội; chọn theo văn hóa, quy mô và nhịp phát hành.
  • Centralized: một nhánh main, đồng bộ trước rồi push.
  • Các workflow khác mở rộng từ ý tưởng kho trung tâm.
  • Bài sau: Feature Branch Workflow.

Nguồn tham khảo

Tài liệu Atlassian Git Tutorial về Git Workflow; Pro Git, chương 5 "Distributed Git" (git-scm.com/book).