Lập trình "an tâm" cùng anh GitHub


Nếu bạn là dân lập trình, có lẽ bạn đã từng (hoặc sẽ) xoá một đoạn code vì nghĩ rằng đoạn code đó không cần dùng nữa, nhưng sau đó lại phát hiện là vẫn cần dùng đến nó. Khi đó, nếu bạn vẫn nhớ đoạn code đó thì chẳng có vấn đề gì, nhưng thường thì bạn sẽ khó mà nhớ rõ ràng từng dòng code được. Lúc này, nếu bạn có dùng một trình quản lý phiên bản mã nguồn thì mọi việc không dở khóc dở cười như vậy nữa. Một trình quản lý phiên bản mã nguồn (code version control) sẽ cho phép bạn lưu trữ lại các phiên bản khác nhau theo thời gian của các tập tin mã nguồn và cho phép bạn có thể quay lại một phiên bản cũ của tập tin đó khi cần thiết. GitHub là nền tảng hỗ trợ quản lý phiên bản như vậy.

Quản lý phiên bản không chỉ được dùng cho lập trình. Bạn có thể gặp nó ở bộ ứng dụng văn phòng MS Office với tính năng Auto Recover, tính năng quản lý phiên bản của Google Drive, hay ứng dụng Time Machine của hệ điều hành macOS. Do đó, bạn có thể sử dụng GitHub để quản lý phiên bản cho bất cứ thứ gì trong máy tính của bạn.

Bài viết này sẽ giới thiệu với các bạn nền tảng GitHub và tập trung vào quy trình làm việc với GitHub thông qua ví dụ cụ thể để bạn có thể nhanh chóng nắm bắt và sử dụng được GitHub cho công việc, học tập của bạn. Bài viết gồm những nội dung sau:

Nội dung

  1. 1 Giới thiệu GitHub
    1. 1.1 Cách quản lý phiên bản của GitHub
    2. 1.2 Tạo tài khoản
    3. 1.3 Trang của bạn trên GitHub
    4. 1.4 GitHub Desktop và GitHub Extension for Visual Studio
  2. 2 Quy trình làm việc với GitHub
  3. 3 Ngày thứ nhất
    1. 3.1 Tạo một kho (repository)
      1. 3.1.1 Tạo kho sử dụng trang web GitHub
      2. 3.1.2 Giao diện trang web của một kho
      3. 3.1.3 Tạo kho sử dụng GitHub Desktop
      4. 3.1.4 Giao diện của GitHub Desktop
    2. 3.2 Đoạn mã đầu tiên cho ứng dụng Contacts
      1. 3.2.1 Tạo project trong Visual Studio
      2. 3.2.2 Mã nguồn lớp Contact
      3. 3.2.3 Mã nguồn lớp Program
      4. 3.2.4 Giao diện tab Changes trên GitHub Desktop
    3. 3.3 Lưu trạng thái và đẩy kho lên web GitHub
      1. 3.3.1 Thực hiện lưu trạng thái
      2. 3.3.2 Đẩy kho lên web GitHub
    4. 3.4 Kết luận của ngày thứ nhất
  4. 4 Ngày thứ hai
    1. 4.1 Mời người khác tham gia cùng dự án
    2. 4.2 Chấp nhận lời mời và sao chép (clone) kho về máy để xem mã nguồn
    3. 4.3 Trao đổi, bình luận trên các lần lưu trạng thái (commit)
    4. 4.4 Quản lý dự án với tab Projects
    5. 4.5 Quản lý các vấn đề (issue)
      1. 4.5.1 Tạo vấn đề (issue) ngay trong tab Issues
      2. 4.5.2 Tạo vấn đề (issue) trong tab Projects
    6. 4.6 Đồng bộ (sync) lại kho trên máy tính
    7. 4.7 Phân nhánh trong GitHub
      1. 4.7.1 Nhánh là gì ?
      2. 4.7.2 Phân nhánh
      3. 4.7.3 Gộp nhánh
      4. 4.7.4 Tạo nhánh (branch) giải quyết vấn đề
    8. 4.8 Tách (fork) kho
    9. 4.9 Sao chép (clone) mã nguồn về để làm việc
    10. 4.10 Đọc và ghi dữ liệu danh bạ xuống tập tin
    11. 4.11 Sử dụng thuộc tính thay cho các hàm get/set
    12. 4.12 Lưu trạng thái và yêu cầu gộp (pull request)
    13. 4.13 Lưu trạng thái và yêu cầu gộp (pull request)
    14. 4.14 Quản lý và thảo luận trên các yêu cầu gộp
      1. 4.14.1 So sánh mã nguồn ngay trên GitHub
      2. 4.14.2 Xem mã nguồn được thay đổi trên máy tính
      3. 4.14.3 Xét duyệt các thay đổi (Review changes)
    15. 4.15 Chỉnh sửa, lưu trạng thái (commit) và yêu cầu gộp (pull request) mới
    16. 4.16 Thực hiện gộp (Merge pull request)
    17. 4.17 Đóng một vấn đề
    18. 4.18 Kết luận ngày thứ 2
  5. 5 Ngày thứ i của dự án
  6. 6 HẾT

Giới thiệu GitHub

Như đã nói ở trên, GitHub là nền tảng lưu trữ mã nguồn miễn phí (đối với các dự án mở). Anh ấy được xây dựng dựa trên hệ thống quản lý mã nguồn phân tán Git, nên anh ấy thừa hưởng được tất cả các tính năng nổi bật của công nghệ quản lý mã nguồn này. Dựa trên đó, anh ấy cung cấp một quy trình làm việc đơn giản và hỗ trợ lập trình cộng tác một cách hiệu quả. Hiện nay, GitHub là dịch vụ lưu trữ mã nguồn được sử dụng phổ biến nhất, thu hút không chỉ những lập trình viên, mà còn cả các nhóm, tổ chức, công ty nổi tiếng sử dụng để lưu trữ, quản lý mã nguồn. Do đó, GitHub cũng là nơi giúp bạn tiếp cận vô vàn kinh nghiệm lập trình.

Dự án mở là dự án cho phép mọi lập trình viên khác có thể xem, sửa đổi, sử dụng mã nguồn trong dự án đó.
Git là hệ thống quản lý mã nguồn phân tán. Nó cung cấp những lợi ích sau:
  • Có thể lưu lại một cách có tổ chức các phiên bản khác nhau của mã nguồn phần mềm
  • Có thể khôi phục lại từ một phiên bản bất kỳ trong quá khứ
  • Có thể so sánh giữa các phiên bản
  • Xem ai đã sửa cái gì để gây ra lỗi
  • Ai phát hiện lỗi và khi nào
  • Khôi phục lại tập tin bị mất
  • và bạn không mất nhiều công sức để làm tất cả việc trên

Cách quản lý phiên bản của GitHub

GitHub sử dụng kỹ thuật quản lý phiên bản của Git. Do đó, nó coi dữ liệu của nó giống như một tập hợp các ảnh (snapshot) của một hệ thống tập tin nhỏ. Mỗi lần bạn thực hiện lưu trạng thái (commit), GitHub sẽ chụp một bức ảnh (snapshot) ghi lại nội dung của tất cả các tập tin tại thời điểm đó và tạo ra một tham chiếu tới ảnh đó. Để hiệu quả hơn, nếu như tập tin không có sự thay đổi nào, GitHub không lưu trữ tập tin đó lại một lần nữa mà chỉ tạo một liên kết tới tập tin gốc đã tồn tại trước đó. GitHub thao tác với dữ liệu như hình minh hoạ dưới đây.

Cách thức quản lý này cũng giống như một hệ thống quản lý tập tin thu nhỏ. Do đó, GitHub có thể cung cấp nhiều tính năng, công cụ vô cùng mạnh mẽ.

Tạo tài khoản

Để bạn có thể lưu trữ mã nguồn và sử dụng các dịch vụ của GitHub, trước tiên, bạn phải tạo một tài khoản của GitHub. Để tạo tài khoản, đơn giản, trên trang web chính của GitHub, bạn bấm nút Sign up hoặc Sign up for GitHub.

Tiếp theo, tại bước 1, bạn điền username, emailpassword (Ví dụ xem hình bên dưới). Password của bạn nên có ít nhất một ký tự in thường, một chữ số và gồm ít nhất 7 ký tự. Bấm Create an account để sang bước 2.

Tại bước 2, bạn sẽ lựa chọn loại tài khoản. Hiện tại, GitHub cung cấp hai loại tài khoản là: miễn phí cho việc lưu trữ các dự án mở (chọn Unlimited public repertoires for free) và có phí (7 đô/tháng) cho lưu trữ các dự án đóng (chọn Unlimited private repertoires for $7/month). Bấm Continue để sang bước 3.

Ở bước 3, bạn trả lời một số câu hỏi điều tra của GitHub, rồi bấm Submit.

GitHub sẽ gởi cho bạn một email vào địa chỉ mail của bạn đã cung cấp cho GitHub để xác thực. Trong email đó, bạn bấm đường link Verify email address để xác thực. Lúc này, GitHub sẽ gởi email chúc mừng và cho phép bạn tạo repertoire (kho) đầu tiên trên GitHub.

Sau khi Submit, giao diện của GitHub sẽ như sau:

Bạn bấm Read the guide để vào xem các hướng dẫn sử dụng của GitHub. Chọn Start a project để bắt đầu tạo một repertoire đầu tiên trên GitHub. Tuy nhiên, trước tiên, tôi muốn giới thiệu trang web của bạn trên GitHub. Để mở trang web của bạn, bạn bấm vào nút avatar phía trên bên phải, rồi chọn Your profile như hình dưới đây.

Trang của bạn trên GitHub

Đây chính là trang web mà người dùng khác trên GitHub có thể xem thông tin và các dự án mở của bạn, cũng như là nơi bạn quản lý các dự án của bạn và xem các vấn đề, trao đổi, đóng góp cho các dự án của người dùng khác. Trang web của bạn (ngoài cách ở ngay phía trên) có thể truy cập thông qua địa chỉ http://github.com/<username> (với <username> thay bằng username khi bạn tạo tài khoản, ví dụ: với tài khoản vừa rồi tôi tạo thì địa chỉ sẽ là http://github.com/lvman). Khi truy cập vào lần đầu, trang web sẽ có dạng như sau:

Cột bên trái, sẽ có ảnh avatar, username, thông tin mô tả, ngày tạo tài khoản,... Tất cả những thông tin này có thể được chỉnh sửa bằng cách bấm vào nút Edit profile (phía trên bên phải của trang web trên). Phần chính của giao diện này là 3 tab: Overview, Repositories và Public activity. Tab Overview chứa thông tin tóm tắt về dự án bạn đang làm việc, một lược đồ cho thấy quá trình đóng góp của bạn và những hoạt động gần đây của bạn. Tab Repositories cho bạn quản lý tất cả các dự án bạn đang làm việc. Còn tab Public activity cho bạn xem các đóng góp gần đây của bạn trên các dự án. Dưới đây là một ví dụ tab Repositories của tôi:


GitHub Desktop và GitHub Extension for Visual Studio

Bên cạnh việc dùng web để quản lý các dự án, bạn có thể sử dụng phần mềm GitHub Desktop để đồng bộ với các dự án trên GitHub về máy của mình. Ứng dụng này hỗ trợ đầy đủ quy trình làm việc, quản lý dự án với GitHub. Còn nếu bạn sử dụng Visual Studio 2015 trở lên, bạn có thể tải về GitHub Extension for Visual Studio. Ứng dụng này tích hợp trực tiếp vào giao diện Visual Studio và cũng hỗ trợ đầy đủ quy trình làm việc, quản lý dự án với GitHub ngay trên giao diện của Visual Studio.

Trong bài viết này, tôi chỉ hướng dẫn sử dụng GitHub Desktop.

Một điểm cần lưu ý khi làm việc với GitHub Desktop và GitHub Extension (cũng như Git) đó là khi bạn sao chép (clone) một kho (repository) với GitHub thì kho đó sẽ được sao chép một bản về trên máy của bạn và bản đó tồn tại độc lập với bản ở trên GitHub (xem hình ở dưới). Thao tác này khác với tính năng đồng bộ thông thường mà chúng ta hay thấy. Do đó, mọi thao tác sửa đổi, lưu trạng thái (commit - sẽ nói rõ ở phần sau) sẽ chỉ được thực hiện ở máy của bạn. Chỉ đến khi bạn đồng bộ (publish hoặc sync) với máy chủ GitHub thì những sửa đổi và lần lưu trạng thái đó mới được chuyển lên GitHub.

Đến lúc này, bạn bắt đầu bước vào quy trình làm việc với GitHub.

Quy trình làm việc với GitHub

Quy trình làm việc với GitHub bao gồm các bước như sau:

  1. Tạo một kho (repository) mới hoặc phân tách (fork) một kho đã có
  2. Tạo dự án trong tab Project, chuyển đổi các nhiệm vụ thành các vấn đề (issue)
  3. Quản lý các vấn đề (issue), gán nhãn, gán mốc, gán người phụ trách
  4. Lựa chọn vấn đề (issue) cần giải quyết, kéo nhiệm vụ (task) liên quan sang cột In Progress
  5. Sao chép (clone) về máy tính hoặc đồng bộ (sync) lại kho
  6. (Nếu cần thiết) Tạo nhánh (branch) mới để giải quyết vấn đề
  7. Chỉnh sửa và thực hiện lưu trạng thái (commit)
  8. Tạo một yêu cầu gộp (pull request)
  9. Kiểm duyệt yêu cầu gộp (review changes): chấp nhận gộp hoặc không chấp nhận gộp, đóng yêu cầu gộp
  10. Trộn (merge) yêu cầu gộp vào nhánh chính
  11. Xoá nhánh (branch) nếu muốn
  12. Đóng vấn đề (issue) liên quan, kéo nhiệm vụ (task) liên quan sang cột Done
  13. Quay lại bước 4

Để minh hoạ cho quy trình làm việc với GitHub trên, chúng ta sẽ cùng đi qua quá trình làm dự án Sổ danh bạ (Contatcts). Đây là ứng dụng đơn giản, chỉ để minh hoạ. Do đó, chỉ có 2 lớp: lớp Contact và lớp Program. Lớp Contact dùng để mô hình hoá một thông tin liên lạc của một người nào đó. Lớp Pogram thì chứa chương trình chính của ứng dụng. Trong lớp Program, chúng ta sẽ tổ chức một danh sách các đối tượng Contact (List<Contact>). Ứng dụng này chỉ có tính năng đơn giản là nhập dữ liệu danh bạ vào đến khi nào không còn muốn nhập nữa, rồi in ra danh sách tất cả các danh bạ đã nhập.

Để thấy rõ được quy trình, các bước làm việc cộng tác, phần minh hoạ sẽ có sự tham gia của hai lập trình viên: anh A (tài khoản tên lvman) và anh B (tài khoản tên manleviet). Ngoài ra, các thuật ngữ cũng sẽ được giải thích bên trong các bước của quy trình.

Ngày thứ nhất

Trong ngày đầu tiên của dự án, anh A khởi tạo dự án sẽ tiến hành những công việc sau:

  1. Tạo kho contactsapp để chứa mã nguồn cho dự án
  2. Viết những dòng mã nguồn đầu tiên cho dự án
  3. Thực hiện lưu trạng thái (commit)
  4. Đẩy kho lên trang web GitHub (publish)

Tạo một kho (repository)

Kho thường được dùng để tổ chức một dự án (project), nó có thể chứa các thư mục, tập tin, ảnh, video, bảng biểu và dữ liệu - tất cả những gì mà dự án của bạn cần. Khi tạo một kho, bạn nên thêm một tập tin README hoặc một tập tin thông tin giới thiệu về dự án của bạn, hoặc một tập tin chứa thông tin license.

Một kho (repository) có thể lưu trữ nhiều dự án. Điều này tuỳ vào sự quản lý của bạn. Trong lập trình C# với Visual Studio, bạn có thể lưu trữ một solution trong một kho, solution đó có thể chứa nhiều project; hay thậm chí một kho có thể chứa nhiều solution.

Để tạo một kho, bạn có lựa chọn:

  1. Sử dụng trang web GitHub
  2. Sử dụng ứng dụng GitHub Desktop

Tạo kho sử dụng trang web GitHub

Trên trang web GitHub, sau khi đăng nhập, bạn nháy chuột vào nút dấu + (bên cạnh avatar của bạn ở góc trên bên phải) và chọn mục New repository. Giao diện trang web để tạo kho sẽ xuất hiện ra như sau:

Bạn điền tên của kho vào ô Repository name, điền mô tả của dự án vào ô Description, chọn Public cho loại kho và chọn mục Initialize this repository with a README trước khi bấm nút Create repository để tạo. Khi đó, giao diện của trang web sẽ chuyển vào trang nội dung của kho mới được tạo. Bởi vì, chúng ta chọn mục Initialize this repository with a README, nên GitHub sẽ tự động tạo tập tin README.md với nội dung được lấy từ ô Description.


Bạn có thể bấm vào nút Clone or download (màu xanh lá cây) để thực hiện sao chép (clone) dự án về máy sử dụng GitHub Desktop.

Giao diện trang web của một kho

Giao diện trang web của một kho (như hình ngay trên) sẽ bao gồm 7 tab:

  1. Tab Code: trong tab này, bạn có thể truy cập vào tất cả các tập tin được lưu trữ trong kho. Bạn có thể xem nội dung của từng tập tin, các lần lưu trạng thái (commit), so sánh mã nguồn giữa các lần chuyển giao với nhau, xem và chuyển đổi giữa các nhánh (branch), thêm tập tin vào kho, tạo một yêu cầu gộp (pull request) mới và sao chép (clone) về máy sử dụng GitHub Desktop,...
  2. Tab Issue: cho phép bạn quản lý các vấn đề (issue), nhãn (label) và điểm mốc (milestone) của dự án được bạn hoặc đồng nghiệp của bạn tạo ra
  3. Tab Pull request: cho phép bạn quản lý các yêu cầu gộp (pull request) của dự án được bạn hoặc đồng nghiệp của bạn tạo ra
  4. Tab Projects: là công cụ cho phép quản lý dự án sử dụng bảng kanban
  5. Tab Wiki: cho phép bạn tạo mô tả dự án (document) cho dự án của bạn
  6. Tab Pulse và Graphs: cho phép bạn xem các thống kê về tình hình cập nhật và sửa đổi của dự án
  7. Tab Settings: cho phép bạn thiết lập các tuỳ chọn cho dự án

Tạo kho sử dụng GitHub Desktop

Để tạo một kho sử dụng GitHub Desktop, bạn bấm vào nút dấu + (phía trên bên trái của cửa sổ GitHub Desktop), chọn tab Create, nhập tên của kho muốn tạo, chọn đường dẫn để lưu kho (đương nhiên là trong máy của bạn), rồi bấm Create repository như hình dưới đây.

Lúc này, GitHub Desktop sẽ tạo cho bạn một kho tại vị trí bạn đã chọn. Kho này chỉ tồn tại trong máy tính của bạn. Bạn phải bấm nút Publish (ở trên bên phải của GitHub Desktop) để đẩy nó lên GitHub. Tuy nhiên, hiện tại, bạn hãy khoan bấm vội bởi vì kho hiện tại vẫn chưa có gì cả. Chúng ta sẽ lập trình các lớp đầu tiên xong rồi hẳn Publish.

Khi tạo kho bằng cách này, bạn sẽ không có sẵn tập tin README.md, mà phải tự tạo nếu muốn.

Giao diện của GitHub Desktop

Giao diện của GitHub Desktop được chia ra làm 2 phần. Phần ngoài cùng bên trái liệt kê tất cả các kho đang nằm trên máy của bạn. Bạn có thể bấm phải chuột vào tên các kho, rồi bấm Open in Explorer để duyệt qua thư mục chứa nội dung của kho sử dụng Windows Explorer. Phần chính của ứng dụng lại chia thành hai tab: Changes và History. Tab Changes để thể hiện những thay đổi trên các tập tin trong kho. Tab History ghi nhận lịch sử các lần lưu trạng thái (commit), cập nhật (publish/sync). Phía dưới 2 tab là phần thể hiện cho các nhánh làm việc (branch) (nhánh là gì sẽ được nói rõ ở phần sau). Như trong hình, ta có nhánh master, là nhánh gốc của bất kỳ một kho nào. Trên nhánh master, hiện có 2 vòng tròn. Vòng tròn màu xanh thể hiện điểm mốc tạo ra kho và vòng tròn màu trắng đứt nét thể hiện phiên bản làm việc đang ở trên nhánh master. Phần còn lại của giao diện GitHub Desktop được chia ra 2 ngăn, 1 ngăn để thể hiện danh sách các tập tin được thay đổi, 1 ngăn thể hiện nội dung thay đổi.

Như vậy, anh A đã tạo được kho contactsapp trên máy tính sử dụng GitHub Desktop. Tiếp theo, anh A mở Visual Studio để lập trình dự án.

Đoạn mã đầu tiên cho ứng dụng Contacts

Tạo project trong Visual Studio

Sau khi mở ứng dụng Visual Studio, anh A tạo ứng dụng loại Console Application và trong ô Location, anh A chọn đến thư mục đã tạo khi tạo kho bằng GitHub Desktop (xem hình dưới).

Sau khi bấm OK, Visual Studio sẽ tạo cho một dự án mới và tập tin Program.cs được mở ra sẵn.

Mã nguồn lớp Contact

Tiếp theo, anh A tạo một Class mới có tên là Contact với mã nguồn như sau: 

Mã nguồn lớp Contact

Trong đoạn mã nguồn trên, lớp Contact có 4 biến thành phần ho, ten, diachisdt để lưu họ tên, địa chỉ và số điện thoại của một người nào đó; 8 hàm get, set thực hiện chức năng lấy thông tin ra và gán thông tin vào các biến thành phần trên; 1 hàm cấu tử để khởi tạo giá trị cho các biến thành phần.

Mã nguồn lớp Program

Tương tự, anh A tiếp tục viết mã nguồn của lớp Program như dưới đây:

Mã nguồn lớp Program

Như vậy, anh A đã hoàn thành mã nguồn của ngày đầu tiên. Anh A chạy và kiểm tra chương trình có đúng như mong muốn hay không. Mọi việc đều ổn. Anh A quay lại với ứng dụng GitHub Desktop để thực hiện lưu trạng thái (commit) và đẩy kho lên web GitHub (publish).

Giao diện tab Changes trên GitHub Desktop

Lúc này, trong GitHub Desktop, anh A bấm vào tab Changes để xem những thay đổi trong kho contactsapp được GitHub Desktop ghi nhận như thế nào. Ở ngăn nhỏ, bạn sẽ thấy danh sách tất cả các tập tin có sự thay đổi (tạo mới hay sửa nội dung). Còn ở ngăn lớn, là nội dung một tập tin đang được chọn xem (trong hình là tập tin Contact.cs). Các dòng màu xanh lá cây với dấu cộng ở đầu dòng thể hiện là các dòng mới được thêm vào, màu đỏ với dấu trừ ở trước thể hiện dòng bị xoá.

Ở bên dưới ngăn nhỏ, bạn có 2 ô Summary, Description và 1 nút Commit to master được dùng để chấp thuận chuyển giao những thay đổi này.

Lưu trạng thái và đẩy kho lên web GitHub

Thực hiện lưu trạng thái

Đến đây, anh A điền mô tả ngắn cho những thay đổi vào ô Summary, điền mô tả chi tiết của những thay đổi vào ô Description, rồi bấm nút Commit to master.

Những thay đổi đã được lưu lại. Lúc này, nhánh master sẽ có thêm một vòng tròn liền nét màu trắng để thể hiện cho lần lưu trạng thái vừa rồi (Xem hình dưới).

Đẩy kho lên web GitHub

Đến đây, anh A bấm nút Publish để đẩy kho lên web GitHub. Trong khung mới hiện ra, bạn điền mô tả cho dự án vào ô Description và bấm nút Publish contactsapp.

Sau khi chờ đợi một đoạn thời gian để GitHub Desktop sao chép các tập tin trong kho lên web GitHub, nạn có thể truy cập web GitHub để kiểm tra kho của bạn đã được đẩy lên hay chưa (như hình dưới đây).

Kết luận của ngày thứ nhất

Để tạo một kho bạn có hai cách là sử dụng trang web của GitHub hoặc sử dụng ứng dụng GitHub Desktop. Nếu sử dụng trang web GitHub thì sau khi tạo xong, bạn phải sao chép (clone) kho đó về máy để làm việc, rồi đồng bộ (sync) lên web GitHub sau mỗi lần lưu trạng thái (commit). Còn nếu bạn sử dụng ứng dụng GitHub Desktop để tạo thì bạn phải đẩy kho đó lên GitHub (publish) sau lần lưu trạng thái (commit) đầu tiên.

Ngày thứ hai

Trong ngày tiếp theo này, anh B sẽ tham gia vào dự án và cùng làm việc. Những công việc anh A và anh B đã thực hiện trong ngày này như sau:

Ở các mục tiếp theo, mục nào màu xanh là công việc anh A làm, mục nào màu cam là công việc của anh B làm, mục nào màu đen là cả hai cùng làm.

 Anh A

Anh B 

  1. Mời anh B tham gia vào dự án
  1. Chấp nhận lời mời và sao chép (clone) kho về máy để xem mã nguồn của anh A
        1. Trao đổi với nhau trên lần lưu trạng thái gần nhất của dự án và chỉ ra một số việc cần làm tiếp theo
  1. Tạo quản lý dự án sử dụng tab Projects
  2. Tạo các vấn đề (issue) và gán người phụ trách, gán nhãn (label), điển mốc (milestone)
  1. Thảo luận trên các vấn đề (issue) và thao tác trên bảng quản lý dự án trong tab Projects
  1. Đồng bộ (sync) lại kho trên máy tính 
  2. Tạo nhánh (branch) giải quyết vấn đề
  3. Lập trình giải quyết vấn đề
  4. Lưu trạng thái (commit)
  5. Yêu cầu gộp (pull request)
  1. Tách (fork) kho để giải quyết vấn đề
  2. Sao chép (clone) mã nguồn về máy để làm việc
  3. Lập trình giải quyết vấn đề
  4. Lưu trạng thái (commit)
  5. Yêu cầu gộp (pull request)
        1. Thảo luận trên các yêu cầu gộp
        2. So sánh mã nguồn giữa các lần lưu trạng thái
        3. Xét duyệt các thay đổi: không chấp nhận gộp (request changes)
  1. Xét duyệt yêu cầu gộp mới
  2. Chấp nhận gộp (approve)
  3. Thực hiện gộp (Merge pull request)
  4. Xoá nhánh (branch) (nếu muốn)
  5. Đóng vấn đề (issue) liên quan
  6. Kéo nhiệm vụ liên quan sang cột Done
  1. Mở lại kho với nhánh mới do GitHub tự tạo
  2. Sửa lại mã nguồn theo đề nghị
  3. Lưu trạng thái (commit)
  4. Yêu cầu gộp mới (pull request)

Mời người khác tham gia cùng dự án

Để mời người khác (đã có tài khoản của GitHub), trong trang web của kho, bạn chuyển đến tab Settings, chọn Collaborator, gõ tên hoặc địa chỉ email của người bạn muốn mời vào ô Search by username, fullname or email address. Ví dụ hình bên dưới, anh A gõ tên anh B vào và GitHub tự động tìm kiếm và đề xuất ra những tài khoản có cùng tên hoặc tên gần giống như vậy.

Sau khi chọn tài khoản người muốn mời xong bạn bấm nút Add collaborator.

Chấp nhận lời mời và sao chép (clone) kho về máy để xem mã nguồn

Lúc này, anh B sẽ nhận được một thư mời. Anh B vào trang web GitHub và bấm vào nút Notifications (nút hình quả chuông, bên cạnh avatar) để xem thư mời.

Anh B sẽ dùng trình duyệt Firefox để phân biệt với trình duyệt Safari của anh A.

Sau khi bấm Accept để chấp nhận lời mời, giao diện của trang web GitHub sẽ như sau:

Lúc này, anh B có thể bấm Clone or download để sao chép mã nguồn của anh A về máy để ngâm cứu.

Trao đổi, bình luận trên các lần lưu trạng thái (commit)

Lúc này, anh B mở Visual Studio để xem phần mã nguồn của anh A và lên web GitHub để viết các nhận xét trong lần lưu trạng thái gần nhất (có tên là Mã nguồn của ngày đầu tiên - Bấm nút commit trong tab Code). Anh B và anh A trao đổi với nhau tại lần lưu trạng thái đó và chỉ ra những tính năng cần làm (xem ví dụ ở hình bên dưới).

Như vậy, anh A và anh B xác định sẽ cùng nhau phát triển thêm 2 tính năng mới:

  1. Thay các hàm get và set bằng thuộc tính, có kiểm tra độ dài chuỗi ký tự được nhập vào
  2. Đọc và ghi dữ liệu danh bạ xuống tập tin
Để xem các thông báo của các trao đổi này, bạn phải chuyển ra trang chủ của GitHub (www.github.com).

Quản lý dự án với tab Projects

Anh A vào tab Projects (như hình bên dưới) trong kho contactsapp, bấm nút Create a project để bắt đầu tạo một trang quản lý dự án mới theo kiểu kanban.

Lúc này, GitHub sẽ hiển thị form (như hình bên dưới) cho phép bạn điền tên (Name) và mô tả (Description) cho dự án. Rồi bạn bấm Save project để lưu lại.

GitHub sẽ tạo cho bạn một dự án mới (theo ví dụ hình trên thì dự án này có tên là Contacts), trong đó, bạn có thể tạo các cột tương ứng với tình trạng của các nhiệm vụ (task). Mỗi cột sẽ chứa nhiều nhiệm vụ. Bạn có thể kéo thả các nhiệm vụ qua lại giữa các cột để chuyển trạng thái cho các nhiệm vụ.

Ví dụ, với dự án Contacst hiện tại, anh A sẽ tạo 3 cột TODO, In Progress và Done (tức là: cần làm, đang làm và đã xong) và có 2 nhiệm vụ đang cần làm ở cột TODO (như hình bên dưới).

Quản lý các vấn đề (issue)

Sau khi tạo xong danh sách các công việc cần làm, anh A chuyển sang tab Issues (xem hình bên dưới) để tạo các vấn đề (issue). Các vấn đề này được dùng để các lập trình viên thông báo cho nhau biết các lỗi hay các vấn đề cần giải quyết trong các lần lưu trạng thái (commit). Mỗi vấn đề sẽ có một mã số (ghi sau dấu #), có tên và mô tả. Bạn còn có thể gán nhãn, gán điểm mốc, gán người phụ trách giải quyết vấn đề. Bạn có thể trao đổi ý kiến trên các vấn đề và đóng (close) vấn đề lại nếu đã giải quyết xong.


Tạo vấn đề (issue) ngay trong tab Issues

Để tạo một vấn đề mới, chúng ta bấm nút New issue. Trong trang web mới (như hình bên dưới), bạn điền tên của vấn đề, viết mô tả nội dung vấn đề. Bạn cũng có thể gán nhãn (label), thiết lập mốc (milestone) và chỉ định người đảm trách việc xử lý vấn đề (assignees). Sau khi làm xong, bạn bấm Submit new issue để hoàn tất.

Tạo vấn đề (issue) trong tab Projects

Đúng vậy, bạn có thể tạo một vấn đề từ các nhiệm vụ trong tab Projects. Để làm việc đó, bạn bấm nút mũi tên hướng xuống bên phải các nhiệm vụ, rồi chọn Convert to issue (như hình dưới đây).

Sau khi thực hiện xong, GitHub sẽ chuyển nhiệm vụ đó thành một vấn đề và có liên kết để bạn bấm vào xem và sửa đổi nội dung của nó (xem hình bên dưới).

Cũng giống như tạo vấn đề trong tab Issues, bạn bấm vào liên kết đó để viết mô tả (phần chính của giao diện trang web), gán nhãn, gán mốc, gán người thực hiện (ngăn bên phải của trang web) (xem hình bên dưới).

Với anh B, mỗi khi có một vấn đề (issue) mới được tạo ra hay thay đổi, thì GitHub đều báo về cho anh B. Anh B có thể xem, bình luận và có thể thao tác trên dự án Contacts trong tab Projects vừa được tạo (các hình bên dưới).

Trên hình trên, anh B đã kéo nhiệm vụ Thuộc tính sang cột In Progress để bắt đầu giải quyết nhiệm vụ này.

Phân tiếp theo dưới đây sẽ được thể hiện trong hai cột để thể hiện các công việc này cùng đồng thời diễn ra. Cách đọc tốt nhất của phần này là đọc từng cột một. Nếu trang web hiển thị mất cột, bạn vui lòng giảm kích cỡ chữ sẽ thầy trọn cả hai cột.

Đồng bộ (sync) lại kho trên máy tính

Do trên máy tính của anh A đã có mã nguồn cũ, nên anh A chỉ việc mở ứng dụng GitHub Desktop và bấm nút Sync để đồng bộ với mã nguồn mới (nếu có) trên trang web GitHub.

Phân nhánh trong GitHub

Nhánh là gì ?

Khi bạn thực hiện lưu trạng thái (commit), hệ thống sẽ lưu trữ đối tượng trạng thái (commit) mà có chứa một con trỏ tới ảnh (snapshot) của nội dung bạn đã tổ chức và 0 hoặc nhiều con trỏ trỏ tới một hoặc nhiều lần lưu trạng thái (commit) cha trực tiếp của lần lưu trạng thái (commit) đó. Sau hai lần lưu trạng thái, lịch sử của dự án sẽ tương tự như hình sau:

Lần lưu trạng thái đầu tiên không có cha, trạng thái thông thường có một cha, và nhiều cha cho lần lưu trạng thái là kết quả được tích hợp lại từ hai hoặc nhiều nhánh.

Một nhánh trong GitHub đơn thuần là một con trỏ có khả năng di chuyển được, trỏ đến một trong những lần lưu trạng thái này. Tên nhánh mặc định là master. Mỗi lần bạn thực hiện lưu trạng thái, nó sẽ được tự động ghi vào theo hướng tiến lên (move forward).

Trong GitHub Desktop, để chuyển sang lần lưu trạng thái khác, bạn phải chuyển đổi nhánh làm việc hoặc sử dụng tính năng Revert.

Phân nhánh

Mỗi khi bạn thực hiện phân nhánh, hệ thống sẽ tạo ra một con trỏ mới cho phép bạn di chuyển vòng quanh. Ví dụ, hình dưới đây, thể hiện con trỏ testing mới được tạo ra đại diện cho nhánh testing. Con trỏ testing này cùng trỏ tới lần lưu trạng thái hiện tại (mới nhất).

Để biết được bạn đang làm việc trên nhánh nào, GitHub giữ một con trỏ đặc biệt tên là HEAD. Khi mới tạo một nhánh mới thì con trỏ HEAD vẫn sẽ trỏ về nhánh mà trước đó nó đang làm việc.

Nếu bạn thực hiện thêm một lần lưu trạng thái mới trên nhánh testing, con trỏ HEAD sẽ hình dưới đây:

Tiếp đến, nếu như bạn thực hiện chuyển về nhánh master, làm việc, rồi thực hiện một lần lưu trạng thái mới trên nhánh master, bạn sẽ có con trỏ HEAD như sau:

Khi thực hiện chuyển con trỏ HEAD về nhánh master, hệ thống sẽ thực hiện hai việc: 1. chuyển con trỏ về nhánh master, 2. phục hồi lại các tập tin trong kho làm việc của bạn trở lại ảnh (snapshot) mà con trỏ master đang trỏ tới. Điều này có nghĩa là những gì bạn thay đổi từ lúc đó trở đi sẽ tách ra so với phiên bản cũ hơn của kho. Nó "tua lại" các thay đổi cần thiết mà bạn đã thực hiện trên nhánh testing một cách tạm thời để bạn có thể đi theo một hướng khác.

Từ lúc này trở đi, bạn có thể chuyển qua lại giữa các nhánh để làm việc. Những thay đổi trên hai nhánh sẽ bị cô lập với nhau và bạn có thể tích hợp chúng lại với nhau khi cần thiết.

Trong GitHub, để chuyển đổi nhánh làm việc, bạn đơn giản bấm nút được đánh dấu viền đỏ trong hình dưới đây.

Gộp nhánh

Để gộp nhánh, GitHub tạo một ảnh (snapshot) mới - được hợp thành từ hai lần lưu trạng thái được yêu cầu gộp trên hai nhánh và con trỏ nhánh master được tiếp tục tiến về phía trước. Lần lưu trạng thái được gọi là lưu trạng thái tích hợp (merge commit) và nó đặc biệt vì có nhiều hơn một cha.

Trong thực tế, quá trình gộp này đôi khi không diễn ra một cách suôn sẻ.

Tạo nhánh (branch) giải quyết vấn đề

Trong GitHub Desktop, anh A bấm nút Create new branch để tạo một nhánh mới tên là fileio như hình dưới đây.

Sau khi bấm Create new branch, GitHub Desktop sẽ tạo nhánh fileio và thể hiện nó lên khung các nhánh như hình dưới đây.

Vậy là anh A sẽ làm việc trên nhánh fileio. Tiếp theo, anh A mở Visual Studio để lập trình giải quyết vấn đề.

Tách (fork) kho

Sau khi kéo thả nhiệm vụ sẽ giải quyết vào cột In Progress, anh B có thể thực hiện tách (fork) dự án.

Có thể xem việc tách (fork) kho này giống như thực hiện phân nhánh (branch) (Xem phần Phân nhánh trong GitHub ở cột bên cạnh để hiểu rõ hơn). Cho nên, sau khi giải quyết xong vấn đề, cần phải gộp (merge) vào lại nhánh chính. Tức là, với kho contactsapp của anh B (được tách ra từ contactsapp của anh A), sau khi anh B hoàn tất tính năng mới thì phải thực hiện yêu cầu gộp (pull request) để gộp những tính năng mới đó vào kho của anh A. Mô hình các kho sau khi tách (fork) sẽ như sau:

Việc tách (fork) kho giúp cho việc hạn chế các thay đổi từ các lập trình viên khác sẽ ảnh hưởng trực tiếp đến mã nguồn gốc của dự án.

Ở góc trên bên phải, dưới avatar của bạn, GitHub cung cấp 3 chức năng:

  1. Watch: cho phép bạn theo dõi sự phát triển của dự án. Tất cả các vấn đề được tạo, những trao đổi, những lần yêu cầu gộp đều được cảnh báo cho bạn biết.
  2. Star: gắn sao để bạn dễ dàng tìm lại khi cần đến mã nguồn của dự án này.
  3. Fork: cho phép sao chép dự án này ra thành một kho riêng của bạn (như hình minh hoạ bên dưới). 

Trên trang web quản lý kho, anh B bấm vào nút Fork để phân tách kho này và giao diện trang web GitHub sẽ thành như sau:

Nút Watch giờ đã đổi tên thành Unwatch và con số phía sau nút Unwatch và Fork giờ là 1 để báo rằng kho này có 1 người dùng khác đang làm việc cùng. Ở góc bên trái, thể hiện tên kho và cho biết nó được tách (forked) từ kho nào, của ai.

Sao chép (clone) mã nguồn về để làm việc

Tiếp theo, anh B sao chép (clone) mã nguồn về máy để bắt đầu lập trình. Anh B có thể bấm nút Clone or download trên trang web, hoặc bấm nút dấu + trong ứng dụng GitHub Desktop, rồi chọn phần Clone (xem ví dụ hình dưới đây).

Bạn phải chọn tên kho có ký hiệu gần giống với ký hiệu cây đinh ba. Đó là ký hiệu của kho được tách ra từ một kho khác. Phân biệt với ký hiệu quyển sổ là kho do chính bạn tạo ra, ký hiệu này là để chỉ kho được bạn tách (forked) ra từ kho của người khác.

Sau khi bấm Clone contactsapp, GitHub Desktop sẽ kết nối với máy chủ GitHub để sao chép kho về máy. Sau khi kết thúc, GitHub Desktop sẽ có giao diện như sau:

Như các bạn có thể thấy, ta có 2 nhánh master, một của anh A (tên là lvman/master) và một của anh B (tên là master). Nhánh master của anh B được tách ra từ nhánh master của anh A. Đường tròn đứt nét, thể hiện bạn đang làm việc với lần lưu trạng thái nào, đang ở trên nhánh master của anh B.

Tiếp đến, anh B mở Visual Studio lên để lập trình tính năng mới.


Đọc và ghi dữ liệu danh bạ xuống tập tin

Anh A tạo một lớp tiện ích có tên là XuLyFile.cs có mã nguồn như sau:

Mã nguồn lớp XuLyFile.cs

Mã nguồn lớp Program được sửa lại để sử dụng các hàm tiện ích đọc và lưu tập tin trong lớp XuLyFile như sau:

Mã nguồn lớp Program có đọc và ghi file

Anh A hoàn thành mã nguồn cho tính năng đọc và ghi dữ liệu danh bạ xuống tập tin. Anh A quay lại với ứng dụng GitHub Desktop để thực hiện lưu trạng thái và yêu cầu gộp.

Sử dụng thuộc tính thay cho các hàm get/set

Mã nguồn lớp Contact được anh B sửa lại như sau:

Mã nguồn lớp Contact sử dụng thuộc tính

Mã nguồn lớp Program được sửa lại để sử dụng các thuộc tính trong lớp Contact như sau:

Lớp Program sửa lại sử dụng thuộc tính

Anh B đã hoàn thành mã nguồn cho tính năng anh B đảm nhận. Anh B quay lại với ứng dụng GitHub Desktop để thực hiện lưu trạng thái (commit) và đề nghị gộp (pull request).

Lưu trạng thái và yêu cầu gộp (pull request)

GitHub Desktop lúc này ghi nhận 3 tập tin có sự thay đổi (xem hình bên dưới).

Anh A điền thông tin vào ô Summary và Description, rồi bấm Commit to fileio. Sau đó, bấm nút Pull Request (phía trên bên phải cửa sổ) để gởi yêu cầu gộp (pull request).

Như các bạn thấy ở hình trên, từ nhánh fileio bây giờ có một đường đứt nét nối liền vào nhánh master. Điều này thể hiện một yêu cầu gộp đã được thực hiện.

Lưu trạng thái và yêu cầu gộp (pull request)

GitHub Desktop lúc này ghi nhận có hai tập tin có thay đổi là Contact.cs và Program.cs (xem hình bên dưới). Khi xem nội dung từng tập tin, bạn sẽ thấy các dòng màu đỏ và màu xanh tương ứng với các dòng đã bị xoá và những dòng mới được thêm vào.

Anh B điền thông tin vào ô Summary và Description, rồi bấm Commit to master để thực hiện lưu trạng thái. Sau đó, anh B, bấm nút Pull Request để gởi yêu cầu gộp (pull request).

Như các bạn thấy ở hình trên, từ nhánh master của anh B bây giờ có một đường đứt nét nối liền vào nhánh master của anh A. Điều này thể hiện một yêu cầu gộp đã được thực hiện.

Quản lý và thảo luận trên các yêu cầu gộp

Anh A nhận được email thông báo có yêu cầu gộp #5 từ nhánh master của anh B vào nhánh master của anh A. Anh B nhận được email thông báo có yêu cầu gộp #4 từ nhánh fileio vào nhánh master của anh A. Vì cả hai yêu cầu gộp này đều là vào nhánh master của A, cho nên chỉ có thể xem nó trên kho của anh A.

Tất các yêu cầu gộp trên đều được thông báo qua mail hoặc xem tại trang chủ của GitHub (khi đã đăng nhập).

Anh A và B truy cập vào kho của anh A trên GitHub, giao diện trang tab Pull requests như sau:

Anh A vào xem yêu cầu gộp có tên Sử dụng thuộc tính (của anh B), giao diện trang web như sau:

Trong trang web cho từng yêu cầu gộp, chúng ta có thể xem thông tin của lần lưu trạng thái muốn được gộp, cụ thể những thay đổi trên các tập tin, viết bình luận và thực hiện gộp (Merge pull request).

So sánh mã nguồn ngay trên GitHub

GitHub hỗ trợ công cụ cho phép so sánh mã nguồn giữa các lần lưu trạng thái. Để xem phần so sánh này, bạn vào lớp Files changed. Ví dụ dưới đây là trang xem các tập tin có thay đổi theo kiểu tách biệt (Split).

Xem mã nguồn được thay đổi trên máy tính

Nếu muốn xem mã nguồn ngay trên máy, ví dụ anh B muốn xem mã nguồn của anh A. Trên GitHub Desktop, đầu tiên, anh B thực hiện đồng bộ (sync). Lúc này, tất cả các nhánh trong kho anh A cũng được cập nhật về máy anh B và có thể thấy được trên khung thể hiện các nhánh của GitHub Desktop (xem hình dưới đây). Anh B có thể chuyển sang làm việc trên một nhánh nào đó trong kho của anh A.

Ví dụ, với hình trên, anh B đã chuyển sang làm việc trên nhánh fileio của anh A để xem mã nguồn anh A đã viết.

Xét duyệt các thay đổi (Review changes)

Ngay trên trang web cho các yêu cầu gộp, bạn bấm nút Add your review. Lúc đó, giao diện trang web sẽ chuyển sang trang so sánh mã nguồn và nút Review changes (màu xanh lá) sẽ mở ra một hộp thoại. Trên đó, bạn nhập thảo luận vào ô Review summary, chọn một trong ba tuỳ chọn: Comment, Approve hoặc Request changes. Trong đó, Approve có nghĩa là chấp thuận cho gộp và Request changes là yêu cầu chỉnh sửa.

Như vậy, anh A đã không đồng ý cho anh B gộp mã nguồn với lý do là anh B chưa có phần kiểm tra độ dài của các chuỗi được gán vào. Sau khi anh A bấm Submit review một thông báo sẽ gởi đến cho anh B. Đồng thời, anh A cũng bấm nút Close Pull Request để đóng yêu cầu gộp này lại. 

Chỉnh sửa, lưu trạng thái (commit) và yêu cầu gộp (pull request) mới

Anh B xem thông báo và bấm vào liên kết sẽ mở ra trang web như sau:

Như vậy, anh B thấy được yêu cầu mà mình đã bỏ sót. Để bổ sung tính năng bị thiếu, anh B bấm vào đường liên kết open this in GitHub Desktop (bên cạnh nút Merge pull request). GitHub sẽ tự động lấy kho của anh A về, tự động tạo một nhánh mới (ví dụ hình dưới, nhánh này tên là pr/5) để anh B làm việc trên đó.

Anh B mở Visual Studio và bổ sung đoạn mã nguồn kiểm tra độ dài chuỗi ký tự nhập vào. Sau khi xong thì thực hiện lưu trạng thái cho các đoạn mã nguồn mới, rồi thực hiện yêu cầu gộp mới. Lúc này, trong kho của anh A sẽ có thêm một yêu cầu gộp mới tên là Pr 5.

Thực hiện gộp (Merge pull request)

Anh A vào kiểm tra và phê duyệt cho yêu cầu gộp mới.

Sau khi bấm Submit review, giao diện trang web sẽ như sau:

Lúc này, anh A có thể bấm nút Merge pull request để thực hiện gộp.

Sau khi gộp xong, bạn có thể xoá nhánh nếu muốn.

Đóng một vấn đề

Như vậy, một vấn đề đã được hoàn thành. Anh A vào tab Issues, chọn vấn đề đã hoàn thành, bấm Mark as và chọn Closed để đóng vấn đề đó. Tiếp đến, anh A vào tab Projects để kéo nhiệm vụ tương ứng vào cột Done.

Kết luận ngày thứ 2

Anh A và B đã kết thúc một cách xuất sắc công việc của ngày thứ 2. Công việc của ngày này khá rắc rối. Tuy nhiên, nó lại thể hiện được hầu hết một quy trình công việc mỗi ngày để làm việc cộng tác. Quy trình công việc này sẽ được kết luận lại trong mục Ngày thứ i của dự án dưới đây.

Ngày thứ i của dự án

Tại một ngày thứ i nào đó của dự án, cả hai anh A và B ngồi vào máy tính của mình rồi thực hiện:
  1. (Nếu cần thiết) Thiết lập các nhiệm vụ mới và chuyển chúng thành các vấn đề (issue)
  2. (Nếu cần thiết) Quản lý các vấn đề (issue), gán nhãn, gán mốc, gán người phụ trách
  3. Lựa chọn vấn đề (issue) cần giải quyết, kéo nhiệm vụ (task) liên quan sang cột In Progress
  4. Sao chép (clone) về máy tính hoặc đồng bộ (sync) lại kho
  5. (Nếu cần thiết) Tạo nhánh (branch) mới để giải quyết vấn đề
  6. Chỉnh sửa và thực hiện lưu trạng thái (commit)
  7. Tạo một yêu cầu gộp (pull request)
  8. Kiểm duyệt yêu cầu gộp (review changes): chấp nhận gộp hoặc không chấp nhận gộp, đóng yêu cầu gộp
  9. Trộn (merge) yêu cầu gộp vào nhánh chính
  10. Xoá nhánh (branch) nếu muốn
  11. Đóng vấn đề (issue) liên quan, kéo nhiệm vụ (task) liên quan sang cột Done

HẾT

Tài liệu tham khảo
2. Sách Pro Git được viết bởi Scott Chacon và Ben Straub
Comments