Lesson 13: Git cơ bản, deployment
Vấn đề
Trước khi sử dụng Git hoặc bất kỳ hệ thống quản lý mã nguồn nào nào, các nhóm phát triển phần mềm phải đối mặt với nhiều thách thức trong việc quản lý mã nguồn, đặc biệt khi có nhiều thành viên tham gia vào dự án. Một số vấn đề phổ biến bao gồm:
Khó quản lý sự thay đổi mã nguồn: Khi nhiều lập trình viên cùng làm việc trên một dự án, việc quản lý các phiên bản mã nguồn (như các tính năng mới hoặc các sửa lỗi) trở nên khó khăn. Dễ xảy ra tình trạng một người ghi đè lên thay đổi của người khác, gây ra lỗi nghiêm trọng.
Thiếu khả năng quay lại phiên bản trước: Trong quá trình phát triển, nếu phát hiện lỗi sau khi thay đổi mã, không có cách nào để quay lại phiên bản mã ổn định trước đó.
Thiếu sự phân tách giữa các tính năng và sửa lỗi: Các tính năng mới thường cần được phát triển tách biệt khỏi mã nguồn chính. Nếu không có cách quản lý phân nhánh (branching), việc kết hợp (merge) các tính năng này vào mã nguồn chính dễ gây ra lỗi.
Khó theo dõi lịch sử thay đổi: Không có cách ghi nhận rõ ràng ai đã thực hiện thay đổi gì và khi nào. Điều này làm khó khăn cho việc gỡ lỗi và xem lại các thay đổi trong tương lai.
Khó khăn trong làm việc nhóm: Việc chia sẻ mã nguồn giữa các thành viên trong nhóm là không hiệu quả nếu không có hệ thống quản lý phiên bản. Mỗi thành viên cần phương pháp để đồng bộ và hợp nhất các thay đổi mà không gây ra xung đột.
Git
Git được thiết kế để giải quyết những vấn đề trên một cách hiệu quả, với các tính năng mạnh mẽ sau:
Quản lý phiên bản phân tán: Git lưu trữ toàn bộ lịch sử thay đổi của mã nguồn, giúp bạn dễ dàng quản lý, theo dõi và quay lại các phiên bản trước đó khi cần. Điều này giúp bạn dễ dàng khôi phục mã nếu xảy ra lỗi mà không mất dữ liệu.
Làm việc offline và phân tán: Git không phụ thuộc vào máy chủ trung tâm. Mỗi lập trình viên có một bản sao đầy đủ của toàn bộ kho lưu trữ (repository) trên máy cục bộ. Điều này cho phép làm việc offline và giảm rủi ro mất dữ liệu khi máy chủ gặp sự cố.
Phân nhánh (branching): Git cho phép tạo các nhánh riêng biệt để phát triển các tính năng hoặc sửa lỗi. Các nhánh này tách biệt khỏi mã chính (main/master), cho phép làm việc độc lập và sau đó hợp nhất (merge) chúng một cách an toàn vào nhánh chính khi hoàn tất.
Quản lý xung đột: Khi các thành viên trong nhóm làm việc trên các phần khác nhau của dự án, Git có thể nhận diện xung đột và cung cấp công cụ giúp hợp nhất mã một cách hợp lý, đảm bảo không mất bất kỳ thay đổi nào của thành viên khác.
Lịch sử thay đổi rõ ràng: Git lưu lại chi tiết lịch sử các thay đổi, bao gồm ai thực hiện, khi nào và nội dung thay đổi gì. Điều này giúp dễ dàng theo dõi và gỡ lỗi, đồng thời cũng minh bạch trong việc xem lại quá trình phát triển của dự án.
Khả năng tích hợp với các hệ thống CI/CD: Git có thể tích hợp với các công cụ phát triển phần mềm như Jenkins, CircleCI để tự động hóa quy trình kiểm thử và triển khai (deployment).
Git được xem như là một công cụ để sử dụng, và nền tảng lưu trữ cơ bản nhất ta tìm hiểu là Github
Truy cập, đăng ký tài khoản Github tại: https://github.com/
Để sử dụng được Git, cần phải cài đặt công cụ tại: https://git-scm.com/downloads
Git là công cụ quản lý.
Github là một nền tảng lưu trữ (còn rất nhiều những nền tảng khác, Github là nền tảng đơn giản, dễ tiếp cận).
Tư tưởng cây - tree
Git có tư tưởng với mô hình cây có một nhánh chính (có thể gọi là thân cây nếu muốn), nhánh này được gọi là nhánh mặc định - default branch
default branch - là nơi đồng bộ code cuối cùng của các thành viên (lập trình viên) tham gia dự án. Thường nhánh này, cũng là nơi lưu trữ code để triển khai trên môi trường production (tức trạng thái dự án được đưa tới người sử dụng cuối cùng), thường có tên: master, main, production, ... tuỳ vào sản phẩm hoặc công ty.
Các nhánh khác của cây, thường sẽ là các nhánh của lập trình viên triển khai từ nhánh chính (hoặc nhánh khác, tuỳ vào từng sản phẩm hoặc git follow của các công ty). Những nhánh này thường được đặt tên theo tính năng mà lập trình viên thực hiện.
Những nhánh đã được tách ra, code sẽ hoàn toàn tách biệt, giúp lập trình viên phát triển tính năng độc lập cho sản phẩm; sau khi kết thúc, sẽ tiến hành gộp - merge vào nhánh mặc định.
Việc gộp - merge, có thể xảy ra xung đột - conflict, tức nhiều nhánh đều có sự thay đổi tại một hoặc nhiều file, mã nguồn code.
Nên theo quy trình, các lập trình viên cần có một bước gọi là tạo Pull request - Yêu cầu kéo (gộp) code, Github sẽ tiến hành kiểm tra các yêu cầu này và thông báo trạng thái kiểm tra (Được phép gộp hoặc Thông báo xung đột tại các file)
Hãy tìm hiểu thêm để hiểu rõ hơn
Tạo repo trên Github
Tạo kho lưu trữ (repository) trên Github, mục tiêu đơn giản để lưu trữ code. Khi lưu trữ trên Github, ta sẽ có khái niệm gọi là remote (đại diện cho từ kho lưu trữ từ xa, tức trên Github)
Áp dụng cho một Repo mới
Bước 1: Trên trang chủ sau khi đăng nhập thành công, chọn New
Bước 2: Đặt tên kho lưu trữ mong muốn (Tên kho này khi deploy sẽ được view trên url) và chọn Create repository
Kết quả:
Như trên hiển thị, Github đang hướng dẫn chúng ta cách để đưa mã nguồn lên trên nền tảng này.
Đưa code lên repo
Bước 1: Chuẩn bị mã nguồn, các bạn có thể tải về mã nguồn demo tại đây:
Bước 2: Mở folder tại VSCode và mở Terminal
Có thể chạy thử để xem kết quả giao diện
Bước 3: Thực hiện lệnh khởi tạo git tại thư mục này.
git init
Bước 4: Thực hiện lệnh thêm sự thay đổi và đặt tên cho thay đổi
Được gọi là commit, nhằm kiểm soát những gì đã thay đổi tại thư mục
git add .
git add
là lệnh để thêm sự thay đổi
.
dấu chấm có ý nghĩa là thêm toàn bộ nội dung thay đổi bên trong thư mục hiện tại
Có thể thấy, màu của các thư mục đã nhạt hơn so với ban đầu
Đặt tên cho hành động thay đổi:
git commit -m "init repo"
Trong dấu ""
là tin nhắn bạn muốn đặt.
Bước 5: Thực hiện liên kết tới repo (remote) trên Github
git remote add origin linkGithub
linkGithub là đường dẫn remote của bạn, xem tại:
Ví dụ: git remote add origin https://github.com/khoatranpc/code-for-everyone.git
Bước 6: Thực hiện đẩy code lên remote với lệnh:
git push -u origin branch
Với: branch
là nhánh muốn đẩy lên. Để kiểm tra nhánh hiện tại là gì, thực hiện lệnh
git branch
Ví dụ ở đây, nhánh hiện tại tên là master, vậy sẽ thực hiện lệnh:
git push -u origin master
Sau khi thực hiện thành công, kiểm tra trên Github bằng cách load lại trang. Nếu kết quả tương tự ảnh phía dưới là hoàn tất.
Còn rất nhiều lệnh và ý nghĩa khác nhau. Một vài lệnh bạn có thể cần:
Tạo một nhánh mới để phát triển tính năng mới hoặc sửa lỗi...
Hợp nhất các nhánh: Sau khi hoàn thành công việc trên một nhánh, bạn có thể hợp nhất nó vào nhánh hiện tại đang sử dụng.
Kéo (pull) thay đổi từ remote: Mục tiêu để cập nhật những thay đổi từ nhánh trên kho lưu trữ
Đẩy (push) thay đổi lên remote: Mục tiêu sau khi có thay đổi, bạn có thể 'gửi' code này lên kho lưu trữ
Deployment
Triển khai sản phẩm là điều không thể thiếu trong việc phát triển sản phẩm, mục tiêu sẽ cho phép người dùng có thể truy cập trên internet. Trong bài học này, với phạm vi cơ bản, ta sẽ sử dụng tính năng của Github page được cung cấp bởi Github, ta sẽ sử dụng để triển khai với kho lưu trữ vừa tạo.
Bước 1: Truy cập Settings
Bước 2: Chọn tab Pages
Bước 3: Tiến hành chọn nhánh cần deploy sau đó chọn Save
Lưu ý: file index.html
luôn phải đặt ở ngoài cùng.
Để truy cập vào repo vừa public lên page, ta sẽ theo luật sau:
https://userNameGithub.github.io/repoName
Ví dụ:
https://khoatranpc.github.io/code-for-everyone
Trên đây là những kiến thức cơ bản nhất của Git, Deployment với Github page, mục tiêu giúp mở rộng kiến thức, trải nghiệm triển khai sản phẩm, cho phép người dùng (có thể là nhà tuyển dụng sau này) truy cập và sử dụng sản phẩm!
Last updated