Version control là gì?

Xem thử

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

Ba người trong nhóm cùng làm một ứng dụng. Chiều thứ Sáu, Lan gửi project-final-v2.zip vào nhóm chat. Cùng lúc đó Minh gửi project-final-that-su-cuoi.zip, trong đó anh cũng sửa tệp login.js mà Lan vừa sửa. Không ai biết bản nào chạy đúng, ai đã đổi gì, và nếu bản của Minh gây lỗi thì không có cách chắc chắn để quay về bản trước.

Đây chính là bài toán mà version control (quản lý phiên bản) sinh ra để giải quyết.

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

  • Giải thích version control là gì và nó giải quyết những vấn đề nào của việc làm việc nhóm.
  • Phân biệt ba thế hệ: Local, Centralized và Distributed.
  • Giải thích vì sao Git thuộc nhóm phân tán và điều đó giúp gì khi máy chủ gặp sự cố.

Bạn chưa cần biết lệnh Git nào để học bài này.

Cách đọc hình. Bên trái là cách làm thủ công: mỗi lần sửa lại chép ra một tệp mới với tên ngày càng dài, nên không ai biết bản nào đúng. Bên phải là cách của version control: mỗi lần lưu là một mốc nối tiếp mốc trước, có tên và lý do. Phiên bản v3 bị lỗi vẫn nằm trong lịch sử, và bạn có thể quay về v2 mà không phải đoán mình đã sửa gì.

Định nghĩa

Version control là hệ thống ghi lại mọi thay đổi của một hoặc nhiều tệp theo thời gian, để về sau bạn xem lại, so sánh hoặc khôi phục về một phiên bản bất kỳ. Với lập trình viên, các tệp ấy là mã nguồn.

Một hệ thống như vậy giải quyết bốn việc:

  • Lịch sử đầy đủ: biết ai đổi gì, khi nào và vì sao, nhờ commit message.
  • Khôi phục an toàn: quay lại trạng thái cũ khi một thay đổi làm hỏng chương trình.
  • Cộng tác song song: nhiều người làm trên cùng dự án mà không ghi đè công sức của nhau.
  • Truy vết lỗi: dùng git blame hoặc git bisect để tìm đúng thay đổi gây lỗi.

Ba thế hệ quản lý phiên bản

Trước khi xem hình, hãy tự dự đoán: nếu máy chủ trung tâm của nhóm bị hỏng ổ đĩa và không có bản sao lưu, điều gì xảy ra với lịch sử dự án trong từng mô hình dưới đây?

Cách đọc hình. Hình chia thành ba hàng. Hàng đầu (Local VCS) lưu lịch sử trên một máy, không chia sẻ được. Hàng giữa (Centralized) cho nhiều người cộng tác nhưng lịch sử nằm duy nhất trên máy chủ: máy chủ hỏng mà không có bản sao lưu thì mất lịch sử. Hàng cuối (Distributed) cho mỗi máy một bản đầy đủ, nên remote chỉ là nơi trao đổi.

Giải đáp dự đoán. Ở mô hình tập trung, lịch sử có thể mất toàn bộ. Ở mô hình phân tán, bạn tạo lại remote mới từ bất kỳ bản clone nào và đẩy toàn bộ lịch sử lên.

Thế hệVí dụLịch sử nằm ở đâuĐiểm yếu
Local VCSRCSTrên một máy duy nhấtKhông cộng tác được
Centralized (CVCS)CVS, SubversionMáy chủ trung tâmMáy chủ là điểm lỗi duy nhất, cần mạng để làm việc
Distributed (DVCS)Git, MercurialMỗi máy có một bản đầy đủCần học mô hình mới (clone, remote, nhánh)

Git thuộc thế hệ thứ ba. Đây là nền tảng cho mọi bài sau trong khóa học.

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

  • "Phân tán nghĩa là không có kho trung tâm." Sai. Hầu hết đội vẫn chọn một kho (ví dụ trên GitHub) làm nguồn chính thức. Phân tán nghĩa là kho đó không phải nơi duy nhất giữ lịch sử.
  • "Git và GitHub là một." Git là công cụ quản lý phiên bản chạy trên máy bạn. GitHub, GitLab, Bitbucket là dịch vụ lưu kho Git và thêm tính năng như pull request.
  • "Version control chỉ dành cho mã nguồn." Nó dùng được cho mọi tệp văn bản; mã nguồn chỉ là trường hợp phổ biến nhất.

Tự kiểm tra

  1. Vì sao đặt tên project-final-v2 không thay được version control? Gợi ý: nghĩ tới việc hai người sửa cùng một tệp.
  2. Hãy nêu một khác biệt về nơi lưu lịch sử giữa CVCS và DVCS.
  3. Nhóm bạn dùng Git với một remote trên máy chủ riêng. Máy chủ hỏng. Bạn cần những gì để dựng lại?

Đáp án gợi ý. (1) Tên tệp không ghi lại ai sửa gì, không gộp được thay đổi của hai người và không cho phép quay về chính xác một thời điểm. (2) CVCS giữ lịch sử ở máy chủ; DVCS giữ lịch sử ở mọi bản clone. (3) Một bản clone còn nguyên lịch sử và một remote mới trống để đẩy lên.

Điều cần nhớ

  • Version control là chuỗi mốc có thể quay lại, không phải một thư mục bị ghi đè mãi.
  • Có ba thế hệ: Local, Centralized, Distributed.
  • Git là phân tán: mỗi bản clone là một bản sao lưu đầy đủ của lịch sử.
  • Bài sau: Source Code Management, nơi version control gặp quy trình làm việc của một đội.

Nguồn tham khảo

Pro Git, chương 1.1 "About Version Control" (git-scm.com/book).