Nội dung

Git cơ bản

Giới thiệu

Khi lập trình việc bạn xóa một đoạn code nào đó và viết lại theo theo yêu cầu mới là chuyện thường hay xảy ra. Nhưng nếu sau đó bạn lại nhận được yêu cầu là không thay đổi nữa và phục hồi lại như ban đầu thì phải làm sao đây vì đoạn code mà bạn viết đã bị xóa rồi. Làm sao để có thể phục hồi lại như ban đầu đây? Tới lúc này nếu như bạn có phần mềm quản lý mã code thì bạn có thể phục hồi lại phiên bản trước khi bạn chỉnh sửa. Có thể nói phần mềm quản lý mã nguồn (Version Control System - VCS) là vô cùng cần thiết cho lập trình viên.

Cơ bản về VCS?

Hiện nay có nhiều phần mềm quản lý mã nguồn nhưng chủ yếu chia làm hai nhánh chính là

1. CVCS

Hệ thống quản lý phiên bản tập trung (Centralized Version Control System)

/git-co-ban/centralizedvcs.png
VCS tập trung
Tất cả mã nguồn và sự thay đổi sẽ được lưu trữ lại một nơi gọi là máy chủ và các máy trạm sẽ kết nối với máy chủ để sao chép và lấy mã nguồn. Nếu như máy chủ bị trục trặc, hư hỏng thì toàn bộ mã nguồn cũng bị mất nếu nhưng không có sao lưu dữ liệu lại ví dụ như:

  • Concurrent Version System (CVS) - tiếng việt là “hệ thống các phiên bản đồng thời”
  • Subversion - cũng dùng quản lý phiên bản mã nguồn khác nhau trong quá trình phát triển

2. DVCS

Hệ thống quản lý phiên bản phân tán (Distributed Version Control System)

/git-co-ban/distributedvcs.png
VCS phân tán
So với cách quản lý phiên bản tập trung khi tất cả mã nguồn và sự thay đổi chỉ được lưu một nơi là máy chủ thì trong hệ thống phân tán các máy trạm, máy khách không chỉ kiểm tra phiên bản mới nhất của tập tin mà sao chép toàn bộ mã nguồn. Như vậy nếu máy chủ ngừng hoạt động thì bạn hoàn toàn có thể lấy mã nguồn từ bất kỳ máy trạm nào để phục hồi toàn bộ hệ thống ví dụ như:

  • Mercurial - là phiên bản quản lý mã nguồn phân tán, đa nền dành cho lập trình viên
  • Bazaar
  • Git
    Nhưng Git là một trong những phần mềm phổ biến nhất vì ngoài việc là mã nguồn mở, dễ sử dụng, làm việc nhanh chóng thì Git còn có cộng đồng người sử dụng đông đảo để tư vấn, hỏi đáp, gỡ lỗi trong quá trình sử dụng.

Câu chuyện của Git?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System) ra đời vào năm 2005 bởi Linus Torvald với mục đích quản lý mã nguồn của hệ điều hành Linux. Sau đó thì Git được phổ biến ra cộng đồng và được đón nhận và sử dụng rộng rãi cho tới ngày nay.

Lợi ích của Git

  • Lưu trữ lại được các phiên bản khác nhau của mã nguồn phần mềm
  • Khôi phục lại mã nguồn từ phiên bản bất kỳ
  • Dễ dàng so sánh giữa các phiên bản
  • Hỗ trợ nhiều người cùng làm việc trên một bộ mã nguồn hiệu quả
  • Kiểm tra thay đổi và biết được ai là người thay đổi
  • Phục hồi được các tập tin đã mất, có thể đưa về các phiên bản cũ, không lo bị mất code
  • Dễ dàng thử nghiệm mở rộng tính năng của dự án mà không làm ảnh hưởng đến phiên bản chính

Workflow Git

Bạn có thể tham khảo quy trình làm việc của Git cơ bản như trong sơ đồ bên dưới

/git-co-ban/git-workflow.png
Workflow của Git

Theo như sơ đồ thì ta có thể hiểu đơn giản cách Git làm việc là có hai môi trường local là dưới máy trạm, máy tính của từng lập trình viên và Remote là máy chủ nơi chứa mã nguồn.

local

Trong môi trường local thì ta có 3 môi trường chủ yếu là

  • Working directory là môi trường làm việc của lập trình viên
  • Stagging area là khu vực mà lập trình viên lưu những thay đổi của mã nguồn
  • Local repo là thư mục thư mục chứa mã nguồn bao gồm những thay đổi

Remote

Là môi trường máy chủ là nơi chứa mã nguồn và toàn bộ sự thay đổi từ lập trình viên của mã nguồn.

Ghi chú
Giữa local và remote sẽ có một cơ chế giao tiếp để làm việc đồng bộ và xử lý những xung đột trong mã nguồn mà chúng ta sẽ tìm hiểu rõ hơn ở phần sau

Khi làm việc với môi trường local và remote thì ta có một số khái niệm cơ bản như sau:

  • Respository là kho lưu trữ mã nguồn và các thay đổi trong mã nguồn
    • Local repo là nơi lưu trữ mã nguồn trên máy tính của lập trình viên, mỗi máy tính là một repo
    • Remote repo là nơi lưu trữ mã nguồn trên máy chủ, có thể truy cập từ bất kỳ đâu
      Bổ sung
      • dữ liệu ở local repo có thể được đẩy lên (push) remote để lưu trữ chung
      • dữ liệu ở remote repo có thể được nhân bản (clone) về bất kỳ local repo nào và mang theo tất cả những thay đổi của mã nguồn cho tới lúc được nhân bản về
  • Commit: Mỗi lần thay đổi mã nguồn trên local repo mà lập trình viên thấy cần thiết phải lưu lại thì sẽ tiến hành commit tức là tạo ra một bản lưu toàn bộ mã nguồn và sự thay đổi. Sau khi commit xong thì lập trình viên có thể phục hồi lại mã nguồn theo phiên trước và trước trước đó nữa. Việc này tạo nên sự an tâm rất lớn khi làm việc vì sẽ không lo sợ bị mất mã nguồn.

Chi tiết hơn workflow với các khái niệm trong Git

Để bổ sung thêm workflow của Git thì chúng ta có thêm hình phía dưới

/git-co-ban/remote.jpg
remote repo trong lập trình

Trong hình này thì ta có minh họa rõ ràng hơn quá trình làm việc giữa lập trình viên A (Developer A), và lập trình viên B với remote repo.

Ghi chú
Ta có thể giả sử là remote repo này được tạo ra bởi trưởng nhóm và đã đưa mã nguồn ban đầu lên remote repo.

Lập trình viên A muốn làm việc thì sẽ cài đặt phần mềm Git lên máy, xong rồi thì sẽ nhân bản (clone) bộ mã nguồn về máy tính của anh ta với mà nguồn và toàn bộ thay đổi cho tới thời điểm mà anh ta nhân bản mã nguồn từ remote repo về máy.

Lập trình viên A sẽ làm việc với mã nguồn trên máy tính cá nhân của anh ta, thực hiện thay đổi, thêm sửa xóa dữ liệu và mỗi lần anh ta thấy cần phải lưu lại công việc của mình thì anh ta phải tiến hành thực hiện commit sự thay đổi mã nguồn và khi đó thì phiên bản mà anh ta đã commit sẽ được lưu lại an toàn trong Git.

Giả sử trong quá trình làm việc mà anh ta muốn kiểm tra xem mã nguồn trên remote repo có bị thay đổi so với lần trước anh ta nhân bản hay không thì anh ta có thể dùng lệnh fetch và pull để tiến hành lấy mã nguồn mới nhất.

Sau khi commit lại dữ liệu trên máy tính thành công lập trình viên A có thể đẩy (push) dữ liệu từ local repo của anh ta lên remote repo.

Tương tự cho lập trình viên B cũng sẽ dùng những lệnh tương tự để làm việc.

Tóm lại Git workflow là
quá trình làm việc của Git là đảm bảo sự đồng bộ thống nhất giữa remote repo và các local repo còn lại từ các lập trình viên thông qua những lệnh làm việc mà Git cung cấp.

Giải thích các thuật ngữ cơ bản của Git

  1. Master là nhánh chính của dự án của bạn. Thông thường nó bao gồm toàn bộ những mã nguồn và sự thay đổi
  2. Branch là (nhánh) đại diện cho các phiên bản cụ thể tách ra từ dự án chính. Mặc định khi tạo nhánh mới thì nhánh đó sẽ chứa toàn bộ mã nguồn và những thay đổi của nhánh chính (master)
  3. Commit Đại diện cho phiên bản mà bạn muốn lưu trữ lại những thay đổi vào Git so với phiên bản trước đó
  4. Checkout sử dụng lệnh git checkout [tên nhánh] để chuyển đổi giữa các nhánh.
  5. Fetch Lệnh git fetch kiểm tra và tải xuống tất cả các tệp branch vào local repo. Sử dụng để lưu những thay đổi mới nhất của remote repo vào local repo của bạn. Nó có thể tìm và nạp vào nhiều branch cùng một lúc
  6. Fork tạo một bản sao của remote repo. Chúng ta có thể dùng fork để thử nghiệm các thay đổi mà không làm ảnh hưởng đến dự án chính
  7. Head commit ở đầu của một branch gọi là head. Nó đại diện cho commit mới nhất của local repo
  8. Index Bất cứ khi nào lập trình viên thực hiện việc thay đổi, thêm, sửa xóa một file thì nó vẫn nằm trong chỉ mục cho đến khi nó sẵn sàng được commit các thay đổi. Nó như là khu vực làm việc (stagging) cho Git. Ta có thể sử dụng lệnh git status để xem nội dung của khu vực index này
  9. Merge Lệnh git merge kết hợp với các yêu cầu kéo (pull) để thêm các thay đổi từ nhánh này sang nhánh khác
  10. Origin là phiên bản mặc định của repo. Nó cũng đóng vai trò là bí danh để liên lạc với master lệnh git push origin master để đẩy các thay đổi đã được commit ở local repo lên remote repo ở nhánh master
  11. Pull lệnh git pull thường được sử dụng để thêm các thay đổi vào nhánh chính master
  12. Push lệnh git push thường được sử dụng để đẩy những cập nhật đã được commit từ local repo lên remote repo
  13. Rebase lệnh git rebase cho phép phân tách, di chuyển hoặc thoát khỏi các commit. Nó cũng được sử dụng để kết hợp hai nhánh khác nhau
  14. Stash lệnh git stash sẽ loại bỏ các thay đổi khỏi khu vực index (stagging) và xóa stashes chúng đi sau
  15. Tags cung cấp cho bạn một cách để theo dõi các commit quan trọng. Các tag nhẹ đơn giản chỉ đóng vai trò là con trỏ trong khi các tags chú thích được lưu trữ dưới dạng đối tượng đầy đủ thông tin.
  16. Upstream trong ngữ cảnh của Git thì upstream đề cập đến nơi mà bạn push các thay đổi từ local repo. Thường là nhánh chính master
    Xem thêm thông tin
    Bạn có thể tham khảo thêm tại Git docs để biết thêm chi tiết

Cài đặt Git

Bạn cứ lên trang download của Git tại đây và tải bản Git phù hợp cho hệ điều hành của bạn. Sau đó bạn tiến hành cài đặt Git bình thường. Để biết bạn đã cài đặt Git thành công hay chưa thì bạn mở command prompt (trên window) hoặc khi đang ở trong folder bất kỳ thì click chuột phải và chọn Git Bash here sau đó gõ lệnh git version. Nếu kết quả trả về phiên bản thì bạn đã cài thành công

Các lệnh cơ bản trong Git

  1. git config dùng để thiết lập người dùng git bao gồm username và email. Để kiểm tra cấu hình username và email ta có thể dùng lệnh git config --global user.name và lệnh git config --global user.email. Để thiết lập người dùng thì ta dùng lệnh git config --glocal user.name "username"git config --global user.email "[email protected]". Vậy là bạn đã thiết lập xong người dùng trong Git.
  2. git init dùng để khởi tạo một git local repo cho dự án mới hoặc hiện tại. Ta đứng tại thư mục gốc của dự án và mở Git Bash hoặc command prompt lên và gõ lệnh git init thì phần mềm Git sẽ tạo một folder ẩn có tên .git ở ngay trong folder gốc của local repo (dự án). Và bắt đầu từ đây Git sẽ theo dõi toàn bộ sự thay đổi mã nguồn trong này.
  3. git clone dùng để nhân bản remote repo về local repo trên máy tính của bạn với lệnh git clone git_clone_url.git . Sau lệnh này thì Git sẽ copy toàn bộ mã nguồn và những thay đổi từ remote repo về local repo của bạn.
  4. git status dùng lệnh git status để kiểm tra trạng thái của dự án bạn đang làm việc và kết quả trả về bạn sẽ thấy được trạng thái.
  5. git add với lệnh git add tên_file thì dùng để thêm thay đổi đến khu vực stagging/index trong dự án
    Mẹo
    Bạn có thể dùng lệnh git add . để thêm toàn bộ những thay đổi vào khu vực stagging/index
  6. git commit là thực hiện hành động để lưu lại toàn bộ thay đổi của mã nguồn dự án từ đầu hoặc từ lần commit trước tới hiện tại. Trước khi commit thì toàn bộ files, thư mục phải được đưa vào stagging/index qua lệnh git add bên trên. Cách dùng là dùng lệnh git commit -m 'lời nhắn ghi chú cho lần commit này'
  7. git push/git pull sau khi bạn commit tất cả thay đổi vào mã nguồn ở local repo rồi thì bạn có thể dùng lệnh git push để đưa code đã thay đổi từ local repo lên remote repo. Hoặc khi bạn muốn lấy tất cả những thay đổi mới nhất từ remote repo thì bạn dùng lệnh git pull để đồng bộ từ remote repo về local repo của bạn. Lệnh cơ bản như sau git push <tên_remote> <tên_branch> hoặc git pull <tên_remote> <tên_branch>
  8. git branch dùng liên quan tới làm việc với nhánh, như lệnh liệt kê nhánh ở local repo ta có git branch còn nếu muốn xem toàn bộ nhánh cả ở remote repo và local repo thì ta dùng lệnh git branch -a. Nếu muốn tạo nhánh mới thì dùng lệnh git branch <tên_nhánh>. Nếu muốn chuyển sang nhánh khác thì dùng lệnh git checkout <tên_nhánh>. Muốn vừa tạo nhánh và chuyển sang nhánh đó luôn thì dùng lệnh git checkout branch <tên_nhánh_mới>
  9. git stash tác dụng lưu thay đổi mà chưa muốn commit ngay lập tức. Cách dùng là khi đang ở trong thư mục dự án thì dùng lệnh git stash. 1 git merge để hợp nhất hai nhánh lại với nhau. Cách làm là chuyển tới nhánh chính. Sau đó từ nhánh chính thì dùng lệnh git merge <tên_nhánh_bạn_muốn_merge>
  10. git reset khi bạn đã đưa tập tin, thư mục nào đó vào khu vực stagging/index rồi nhưng giờ lại không muốn commit nó nữa thì ta dùng lệnh này git reset HEAD <tên_tập_tin_muốn_loại_bỏ_khỏi_commit>
  11. git remote làm việc với remote repo với một số lệnh tham khảo như là git remote để xem remote dạng tên remote. Còn lệnh git remote -v để xem remote repo với đầy đủ liên kết tới remote repo.

Lưu ý khi làm việc với Git

  • Git cheat sheets dùng để tham khảo lệnh Git khi bạn quên như một số link bên dưới

Rogerdudler

Git docs

Git sheet

Git cheat sheet

  • Nên commit thường xuyên và ghi chú khi commit tách nhỏ commit ra với ghi chú đầy đủ sẽ giúp các thành viên khác có một cái nhìn chi tiết từng thay đổi trong dự án và giải quyết xung đột cũng dễ dàng hơn
  • Test rồi mới commit cần phải test các thay đổi có đúng với yêu cầu và đã hoàn tất hay chưa.
  • Thử nghiệm trên branch khác khi muốn thử nghiệm thì nên tạo branch mới để không ảnh hưởng tới dự án
  • Theo Git workflow của nhóm điều này đảm bảo các thành viên trong nhóm làm việc hiệu quả và theo quy trình. Tránh việc lộn xộn trong team khi mà hợp nhất mã nguồn.

Câu chuyện của Github

Quay trở lại với tấm hình này thì GitHub sẽ đóng vai trò là Remote Repo sẽ là máy chủ nơi mà bạn chứa mã nguồn. Theo như trích dẫn trên Wikipedia thì

GitHub, Inc. is a provider of Internet hosting for software development and version control using Git. It offers the distributed version control and source code management (SCM) functionality of Git, plus its own features.

Dịch nôm na ra thì là

GitHub là nhà cung cấp dịch vụ lưu trữ trên mạng để phát triển và kiểm soát phiên bản phần mềm sử dụng Git. Công ty cung cấp chức năng kiểm soát phiên bản phân tán và quản lý mã nguồn (SCM) của Git cùng với tính năng riêng của Github.

GitHub năm 2018 đã trở thành công ty con của Microsoft cũng có phiên bản miễn phí cho người dùng không hạn chế tạo repo riêng tư nhưng repo riêng tư bị hạn chế được 2000 phút GitHub Action trong một tháng. Nhưng như vậy cũng là quá đủ cho lập trình viên có thể tạo tài khoản miễn phí trên GitHub rồi.

Sau khi bạn tạo tài khoản trên Github rồi thì bạn có thể bắt đầu tạo “New Repository” là nơi sẽ chứa toàn bộ mã nguồn của dự án.

Sau đó thì thường tại phần code của repository ta sẽ sao chép phần đường dẫn của repository đó với kết thúc là .git và quay lại thư mục dự án. Mở command prompt tại thư mục gốc đó và thêm remote repo vào với lệnh git add remote <đường_dẫn_của_repository_mới_tạo_trên_github>

Xong rồi bạn có thể kiểm tra bằng lệnh git remote -v để kiểm tra chính xác đường dẫn đó luôn.

Vậy là bạn đã tạo xong tài khoản Github, tạo được remote repository trên GitHub và thêm vào thành công remote repo vào dự án ở local repo. Bây giờ thì bạn có thể thực hiện làm việc trên local repo và commit rồi đẩy (push) mã nguồn lên remote repo lưu trên mạng ở Github. Bạn cũng có thể chia sẻ remote repo và làm việc nhóm cùng thành viên khác mà không lo bị mất mã nguồn rồi

Lời nhắn nhủ
Trên đây là toàn bộ bài viết, các bạn cứ nhiệt tình bình luận, góp ý vào bên dưới nếu có bất cứ thắc mắc nào nhé .