Git là gì? Một số lợi ích tuyệt vời khi sử dụng Git
Trên con đường phát triển của một Developer, chắc chắn sẽ luôn có những ngày đầu tăm tối – những ngày chưa được ánh sáng chân lý của Git soi đường, khiến việc ghép code và quản lý phiên bản trong các dự án trở thành cơn ác mộng.
Nếu bạn mới quan tâm đến lĩnh vực lập trình, hoặc ngại tìm hiểu công cụ mạnh mẽ này, rất mong bài viết hôm nay của Bizfly Cloud sẽ giúp bạn hiểu được tầm quan trọng của Git.
Git là gì?
Git là một hệ thống kiểm soát phiên bản phân tán (DVCS – Distributed Version Control System) mã nguồn mở và miễn phí, được thiết kế để xử lý các dự án từ nhỏ đến rất lớn với tốc độ và hiệu quả cao.
Git được phát triển bởi Linus Torvalds vào năm 2005 với mục đích giúp quản lý sự phát triển của Linux kernel. Nó cũng được sử dụng như một công cụ kiểm soát phiên bản phân tán quan trọng cho DevOps.
Git là tiêu chuẩn kiểm soát phiên bản cho GitHub và các hệ thống quản lý mã nguồn khác. Git cũng là một công cụ DevOps để triển khai CI/CD. Git trở thành một phần không thể thiếu của phát triển phần mềm Agile và là một tính năng trung tâm của GitOps. Đối với các Developer triển khai và quản lý ứng dụng trên Kubernetes hoặc các nền tảng private cloud khác, GitOps cung cấp các best practice để làm việc với các ứng dụng và cluster trong container.
Git hoạt động như thế nào?
Quản lý phiên bản
Giống như các VCS khác, Git hoạt động bằng cách ghi nhận lại mọi thay đổi trong hệ thống file theo thời gian. Sự khác biệt của Git là mỗi khi một thay đổi được người dùng commit (xác nhận), Git sẽ chụp lại trạng thái của toàn bộ hệ thống file tại thời điểm đó (snapshot), nghĩa là lưu lại phiên bản đã thay đổi của các file.
Như có thể thấy trong biểu đồ trên, mỗi Version của hệ thống file đều chứa đầy đủ các file kể cả có thay đổi hay không. Ví dụ tại Version 2 có sự thay đổi tại file A và file C so với Version 1, các file đã thay đổi là A1 và C1 sẽ được lưu vào chỗ tương ứng. Git cũng rất thông minh khi không copy lại file B không bị thay đổi mà chỉ tham chiếu đến vị trí của file B trong version trước đó, giúp giảm lãng phí bộ nhớ do trùng lặp.
Mặt khác, các VCS khác như CVS, Subversion, Perforce,… đều giữ lại các file ban đầu như một phiên bản gốc và chỉ lưu những phần bị thay đổi (delta) tương ứng với từng file mỗi lần cập nhật thay đổi.
Luồng công việc phân tán
Ta đã nói về chức năng của git như một VCS thông thường, nhưng định nghĩa về git là DVCS, nghĩa là còn một chữ D quan trọng chưa được nhắc tới, đó là tính phân tán – Distributed.
Ngược lại với hệ thống kiểm soát phiên bản tập trung (CVCS), bản chất phân tán của Git cho phép bạn linh hoạt hơn nhiều trong cách các nhà phát triển cộng tác trong các dự án. Trong các hệ thống tập trung, mỗi nhà phát triển là một nút hoạt động ngang bằng với với trung tâm.
Tuy nhiên, trong Git, mọi nhà phát triển đều có khả năng vừa là nút vừa là trung tâm; nghĩa là, mọi nhà phát triển đều có thể đóng góp mã nguồn cho các kho lưu trữ (repository) khác và duy trì một kho lưu trữ công khai mà những người khác có thể làm cơ sở cho công việc của họ và họ có thể đóng góp vào đó. Điều này đưa ra nhiều lựa chọn về quy trình làm việc cho dự án, sau đây là một ví dụ.
Các workflow có tính tập trung nghĩa là mọi developer trong dự án đều làm việc trên cùng một kho chứa mã nguồn trung tâm (shared repository). Mỗi người khi làm việc cần đồng bộ mã nguồn trên máy mình với trung tâm trước, sau đó mới thực hiện thay đổi để đảm bảo không gây xung đột.
Nếu có nhiều developers cùng thực hiện thay đổi, người đầu tiên đẩy các thay đổi của mình vào shared repository sẽ không gặp vấn đề gì. Tuy nhiên những người sau nếu không đồng bộ với phiên bản bị sửa đổi bởi người đầu tiên trước khi thực hiện sửa đổi của riêng mình thì có thể sẽ gây tình trạng xung đột, tức là sửa đổi lẽ ra có mục tiêu là phiên bản gốc nay lại áp dụng cho mã nguồn đã bị thay đổi.
Git và các DVCS trong khi đó cho phép các nhà phát triển tạo một bản sao của repository gốc (branch) trên máy mình và thực hiện mọi thứ thay đổi trên đó một cách độc lập với repository gốc, không lo xung đột với người khác, commit tức thì do không cần kết nối đến repository gốc.
Git đem lại lợi ích gì?
Khả năng phân nhánh (branch)
Một trong những ưu điểm lớn nhất của Git là khả năng phân nhánh của nó. Không giống như các hệ thống kiểm soát phiên bản tập trung, các branch trong Git rất dễ tạo và dễ hợp nhất.
Các branch cung cấp một môi trường riêng biệt cho mọi thay đổi đối với mã nguồn. Khi một nhà phát triển muốn thay đổi hay thêm tính năng, họ tạo một nhánh mới, làm việc trên đó và kiểm thử trước khi đưa các thay đổi vào nhánh chính. Điều này đảm bảo rằng nhánh chính luôn chứa mã nguồn chuẩn và tối ưu nhất.
Khả năng phát triển phân tán
Git là một hệ thống kiểm soát phiên bản phân tán, mỗi developer có thể có kho lưu trữ cục bộ của riêng họ, với đầy đủ lịch sử thay đổi. Do đó các thành viên có thể làm việc độc lập với nhau và sau đó hợp nhất khi mọi thứ hoàn chỉnh, không cần duy trì kết nối liên tục đến nhánh gốc.
Phát triển phân tán cũng tạo ra một môi trường đáng tin cậy hơn. Ngay cả khi một nhà phát triển lỡ xóa kho lưu trữ của riêng họ, họ chỉ cần tạo lại một bản sao từ nơi khác và tiếp tục công việc.
Cộng đồng tích cực, nhân lực dồi dào
Là hệ thống quản lý phiên bản nguồn mở phổ biến bậc nhất, Git có một cộng đồng đông đảo và luôn sẵn sàng hỗ trợ. Nếu dự án của bạn đang sử dụng Git, khả năng cao bạn sẽ không phải đào tạo nhân viên mới về quy trình làm việc của mình, vì họ đã quen với phát triển phân tán trên git.
Chu kỳ phát triển nhanh hơn
Kết quả cuối cùng của các ưu điểm trên chu kỳ phát triển nhanh hơn cho dự án của bạn, giúp tiết kiệm chi phí và sản phẩm cuối cùng cũng tốt hơn.
Quy trình xử lý công việc trên Git
Git đánh dấu 3 trạng thái chính của một tệp: modified (đã sửa đổi), staged (đã đánh dấu thay đổi) và commit (ghi lại thay đổi).
- Modified có nghĩa là đã có thay đổi trong tệp nhưng chưa cam kết nó với cơ sở dữ liệu.
- Staged có nghĩa là đánh dấu một tệp đã sửa đổi so với phiên bản hiện tại của nó để đưa vào lần snapshot tiếp theo.
- Commit có nghĩa là dữ liệu đã được lưu trữ an toàn trong cơ sở dữ liệu cục bộ.
Quy trình công việc Git cơ bản diễn ra như sau:
- Sửa đổi các tệp trong working directory.
- Chọn lọc những thay đổi muốn commit và thêm những thay đổi đó vào staging area.
- Thực hiện một commit, lấy các tệp từ staging area, lưu snapshot phiên bản vào Git.
Nếu một phiên bản cụ thể của tệp nằm trong thư mục Git, thì tệp đó được coi là đã commit. Nếu nó đã được sửa đổi và được thêm vào staging area, đó là trạng thái staged. Và nếu nó đã được thay đổi mà chưa đưa vào staging area thì gọi là modified.
Những thuật ngữ phổ biến trong Git
1. Branch
Các Branch (nhánh) là các repository tách ra từ repository của project chính.
Branch cho phép ghi nhận mọi thay đổi với repo và có thể hoàn nguyên về các phiên bản cũ hơn.
2. Commit
Một commit đại diện cho một thời điểm cụ thể trong lịch sử dự án của bạn. Sử dụng lệnh commit kết hợp với lệnh git add để cho git biết những thay đổi bạn muốn lưu vào local repository.
3. Checkout
Sử dụng lệnh git checkout để chuyển giữa các branch. Chỉ cần nhập git checkout theo sau là tên của branch bạn muốn chuyển đến hoặc nhập git checkout master để trở về branch chính (master branch).
4. Fetch
Lệnh git fetch tìm nạp các bản sao và tải xuống tất cả các tệp branch vào máy tính của bạn. Sử dụng nó để lưu các thay đổi mới nhất vào kho lưu trữ của bạn. Nó có thể tìm nạp nhiều branch cùng một lúc.
5. Fork
Một fork là một bản sao của một kho lưu trữ (repository). Các lập trình viên thường tận dụng lợi ích của fork để thử nghiệm các thay đổi mà không ảnh hưởng đến dự án chính.
6. Head
Các commit ở đầu của một branch được gọi là head. Nó đại diện cho commit mới nhất của repository mà bạn hiện đang làm việc.
7. Index
Bất cứ khi nào bạn thêm, xóa hoặc thay đổi một file, nó vẫn nằm trong chỉ mục cho đến khi bạn sẵn sàng commit các thay đổi. Nó như là khu vực tổ chức (stagging area) cho Git. Sử dụng lệnh git status để xem nội dung của index của bạn.
8. Master
Master là nhánh chính của tất cả các repository của bạn. Nó nên bao gồm những thay đổi và commit gần đây nhất.
9. Merge
Lệnh git merge kết hợp với các yêu cầu kéo (pull requests) để thêm các thay đổi từ nhánh này sang nhánh khác.
10. Origin
Origin là phiên bản mặc định của repository. Origin cũng đóng vai trò là cú pháp để truy cập nhánh chính.
Lệnh git push origin master để đẩy các thay đổi cục bộ đến nhánh chính.
11. Pull
Pull requests thể hiện các đề xuất thay đổi cho nhánh chính. Nếu bạn làm việc với một nhóm, bạn có thể tạo các pull request để yêu cầu người bảo trì kho lưu trữ xem xét các thay đổi và hợp nhất chúng.
Lệnh git pull được sử dụng để thêm các thay đổi vào nhánh chính.
12. Push
Lệnh git push được sử dụng để cập nhật các nhánh từ xa với những thay đổi mới nhất mà bạn đã commit.
13. Rebase
Lệnh git rebase cho phép bạn phân tách, di chuyển hoặc thoát khỏi các commit. Nó cũng có thể được sử dụng để kết hợp hai nhánh khác nhau.
14. Remote
Một Remote (kho lưu trữ từ xa) là một bản sao của một chi nhánh. Remote giao tiếp ngược dòng với nhánh gốc (origin branch) của chúng và các Remote khác trong kho lưu trữ.
15. Repository
Kho lưu trữ Git chứa tất cả các tệp dự án của bạn bao gồm các branch, tags và commit.
16. Stash
Lệnh git stash sẽ loại bỏ các thay đổi khỏi chỉ mục của bạn và xóa stashes chúng đi sau.
Nó có ích nếu bạn muốn tạm dừng những gì bạn đang làm và làm việc khác trong một khoảng thời gian. Bạn không thể đặt stash nhiều hơn một bộ thay đổi ở cùng một thời điểm.
17. Tags
Tags cung cấp cho bạn một cách để theo dõi các commit quan trọng. Các tags nhẹ chỉ đơn giản đóng vai trò là con trỏ trong khi các tags chú thích được lưu trữ dưới dạng các đối tượng đầy đủ.
18. Upstream
Trong ngữ cảnh của Git, upstream đề cập đến nơi bạn push các thay đổi của mình, thường là nhánh chính (master branch).
Một số lệnh Git cơ bản
Git là một công cụ thực sự mạnh mẽ trong bất kỳ dự án phát triển nào. Dưới đây là một số lệnh Git cơ bản mà bạn có thể sẽ sử dụng hầu hết các lệnh này hàng ngày:
1. git config
Lệnh này được dùng để set tên author name và email tương ứng sẽ được sử dụng trong commit.
Cách sử dụng:
git config –global user.name “[name]”
git config –global user.email “[email address]”
2. git init
Lệnh này được dùng để khởi tạo một repository mới.
Cách sử dụng: git init [repository name]
3. git clone
Lệnh này được dùng để lấy một repository từ một URL hiện có.
Cách sử dụng: git clone [url]
4. git add
Lệnh này được dùng để thêm 1 tệp (file) vào staging area
Cách sử dụng: git add [file]
5. git commit
Lệnh này được dùng để record hoặc snapshot 1 tệp trong version history.
Cách sử dụng: git commit -m “[ Type in the commit message]”
6. git diff
Lệnh này hiển thị sự khác biệt của tệp chưa được staged.
Cách sử dụng: git diff trong thư mục làm việc
7. git reset
Bạn đã đưa một tệp nào đó vào staging area nhưng bây giờ bạn muốn loại bỏ nó ra khỏi đây nhưng nó vẫn giữ nguyên nội dung tệp. Khi đó bạn dùng lệnh git reset.
Cách sử dụng: git reset [file]
8. git status
Lệnh này được dùng để liệt kê tất cả các tệp phải được commit.
Cách sử dụng: git status trong thư mục làm việc
9. git rm
Lệnh này được dùng để xóa tệp khỏi thư mục làm việc của bạn và xóa các stage.
Cách sử dụng: git rm [file]
10. git log
Lệnh này được dùng để liệt kê version history cho branch hiện tại.
Cách sử dụng: git log
11. git show
Lệnh này hiển thị các thay đổi về metadata và nội dung của commit được chỉ định.
Cách sử dụng: git show [commit]
12. git branch
Lệnh này liệt kê tất cả các branch cục bộ trong repository hiện tại.
Cách sử dụng: git branch
Hi vọng qua bài viết này các bạn đã có được cái nhì tổng quát về Git, cách Git vận hành và tầm quan trọng của nó trong các dự án phát triển phần mềm. Hãy tiếp tục theo dõi bizflycloud để cùng chúng tôi cập nhật những xu hướng mới nhất về công nghệ nói chung và công nghệ thông tin nói riêng mỗi ngày.