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) 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) 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
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.
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
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.
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.
Giải thích các thuật ngữ cơ bản của Git
- 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
- 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)
- 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 đó
- Checkout
sử dụng lệnh
git checkout [tên nhánh]
để chuyển đổi giữa các nhánh. - 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 - 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
- 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
- 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 - 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 - 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 - Pull lệnh
git pull
thường được sử dụng để thêm các thay đổi vào nhánh chính master - 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 - 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 - 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 - 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.
- 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 tinBạ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
- 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ệnhgit config --global user.email
. Để thiết lập người dùng thì ta dùng lệnhgit config --glocal user.name "username"
vàgit config --global user.email "[email protected]"
. Vậy là bạn đã thiết lập xong người dùng trong Git. - 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. - 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. - 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. - 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ự ánMẹoBạn có thể dùng lệnhgit add .
để thêm toàn bộ những thay đổi vào khu vực stagging/index - 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ệnhgit commit -m 'lời nhắn ghi chú cho lần commit này'
- 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ặcgit pull <tên_remote> <tên_branch>
- 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ệnhgit branch -a
. Nếu muốn tạo nhánh mới thì dùng lệnhgit branch <tên_nhánh>
. Nếu muốn chuyển sang nhánh khác thì dùng lệnhgit 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ệnhgit checkout branch <tên_nhánh_mới>
- 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ệnhgit merge <tên_nhánh_bạn_muốn_merge>
- 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>
- 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ệnhgit 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
- 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