Đối với một nhà phát triển phần mềm, việc hiểu rõ về Git và cách sử dụng nó có thể là một lợi thế lớn trong quá trình phát triển dự án. Trong bài viết này, hãy cùng VietnamWorks inTECH tìm hiểu về một trong những công cụ quản lý mã nguồn phổ biến nhất này nhé. 

1. Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS). Nôm na, Git giúp quản lý tài liệu và mã nguồn của nhóm lập trình viên làm chung dự án. Nó ghi nhớ toàn bộ lịch sử thay đổi của mã nguồn trong dự án.

2. Git hoạt động như thế nào?

Git hoạt động dựa trên mô hình snapshots. Khi bạn thực hiện commit, Git tạo ra một snapshot của toàn bộ trạng thái của dự án tại thời điểm đó và lưu trữ nó trong lịch sử của kho lưu trữ. Mỗi commit trong Git đều có một mã hash duy nhất dựa trên nội dung của nó và commit cha trước đó. Các nhánh (branches) trong Git cho phép lập trình viên phát triển tính năng mới mà không ảnh hưởng đến nhánh chính.

3. Cài đặt Git

GIT có sẵn cho các hệ điều hành: Windows, Linux, MacOs... với quy trình cài đặt rất đơn giản, có thể thực hiện bằng dòng lệnh hoặc thông qua trình cài đặt chính thức tại git-scm.com.

3.1. Trên Windows

Để cài đặt GIT trên Windows, chỉ cần truy cập trang web chính thức và tải xuống trình cài đặt, sau đó, chỉ cần làm theo hướng dẫn.

3.2. Trên Linux

Đối với Linux, chúng ta có thể cài đặt GIT bằng lệnh bên dưới:

sudo apt install git-all

3.3. Trên MacOS

Đối với Mac, cách dễ nhất để cài đặt GIT là cài đặt Homebrew rồi chạy lệnh bên dưới trong terminal:

brew install git

4. Định cấu hình Git

Sau khi cài đặt, điều quan trọng là phải định cấu hình GIT bằng các lệnh bên dưới:

git config --global user.name "[username]"
# e.g. Sample Test

git config --global user. email "[email@email.com]"
# e.g. sample@email.com
 

Ngoài ra, bạn có thể định cấu hình người dùng cụ thể cho các kho lưu trữ cục bộ nhất định bằng cách xóa thẻ --global.

5. Khởi động một kho lưu trữ cục bộ

Để bắt đầu một kho lưu trữ cục bộ (local repository) bằng Git, bạn cần thực hiện các bước sau:

  • Di chuyển vào thư mục của dự án: Mở cửa sổ dòng lệnh (Command Prompt hoặc Terminal) và di chuyển vào thư mục của dự án mà bạn muốn bắt đầu quản lý bằng Git. Sử dụng lệnh cd để di chuyển vào thư mục mong muốn. Ví dụ:

cd /path/to/Project_Folder

  • Khởi tạo kho lưu trữ cục bộ: Sử dụng lệnh git init để khởi tạo một kho lưu trữ Git mới trong thư mục hiện tại. Lệnh này sẽ tạo ra một thư mục ẩn có tên .git, chứa tất cả các thông tin về lịch sử và trạng thái của dự án.

git init

  • Kiểm tra trạng thái của kho lưu trữ: Sau khi bạn đã khởi tạo thành công kho lưu trữ cục bộ, bạn có thể sử dụng lệnh git status để kiểm tra trạng thái hiện tại của dự án và xem các thay đổi chưa được theo dõi hoặc đã được theo dõi.

git status

  • Thêm và commit các thay đổi: Bây giờ bạn đã sẵn sàng để thêm các tệp và thư mục vào kho lưu trữ và tạo ra các commit để lưu lại các thay đổi. Sử dụng lệnh git add để thêm các thay đổi vào index và git commit để tạo ra một commit với những thay đổi đã thêm. Ví dụ:

git add .

git commit -m "Initial commit"

  • Sau các bước trên, bạn đã khởi tạo thành công một kho lưu trữ cục bộ bằng Git và đã thêm vào đó các thay đổi ban đầu của dự án. Bây giờ bạn có thể tiếp tục làm việc với Git để quản lý và theo dõi sự phát triển của dự án của mình.

6. Làm việc với GIT

6.1. Git add và Git commit

Đây là hai trong những lệnh quan trọng nhất trong Git, được sử dụng để chuẩn bị và lưu lại các thay đổi vào kho lưu trữ.

a. git add:

Lệnh git add được sử dụng để thêm các thay đổi từ Working Directory (thư mục làm việc) vào Staging Area (vùng chuẩn bị).

Khi bạn thực hiện các thay đổi trên tệp trong thư mục làm việc, nhưng bạn muốn chỉ commit một phần của những thay đổi đó, bạn cần sử dụng git add để chọn những thay đổi cụ thể mà bạn muốn bao gồm trong commit tiếp theo.

Ví dụ: git add file.txt để thêm tệp file.txt vào Staging Area, hoặc git add . để thêm tất cả các thay đổi trong thư mục làm việc vào Staging Area.

b. git commit:

Lệnh git commit được sử dụng để lưu lại các thay đổi đã được thêm vào Staging Area vào kho lưu trữ (Repository).

Khi bạn đã thêm các thay đổi cần thiết vào Staging Area, bạn có thể tạo một commit để ghi lại các thay đổi đó cùng với một thông điệp mô tả nội dung của commit.

Ví dụ: git commit -m "Thêm chức năng mới" để tạo một commit với thông điệp "Thêm chức năng mới".

Tóm lại, git add được sử dụng để chuẩn bị các thay đổi cho commit bằng cách thêm chúng vào Staging Area, trong khi git commit được sử dụng để lưu lại các thay đổi đã được chuẩn bị vào kho lưu trữ Git với một thông điệp mô tả.

6.2. Hoàn tác các thay đổi trước khi commit

Để hoàn tác các thay đổi trước và sau khi commit trong Git, bạn có thể sử dụng các lệnh sau:

TH1: Hoàn tác các thay đổi trước khi commit:

git checkout -- <tên-tệp>:

  • Sử dụng lệnh này để hoàn tác tất cả các thay đổi chưa được staged (chưa được thêm vào Staging Area) trên một tệp cụ thể và phục hồi nó về trạng thái lần commit gần nhất.

  • Ví dụ: git checkout -- file.txt

git reset HEAD <tên-tệp>:

  • Sử dụng lệnh này để loại bỏ các thay đổi đã được staged (đã được thêm vào Staging Area) trên một tệp cụ thể và đưa chúng trở lại trạng thái chưa staged.

  • Ví dụ: git reset HEAD file.txt

TH2: Hoàn tác các thay đổi sau khi commit:

git revert <mã-commit>:

  • Sử dụng lệnh này để tạo ra một commit mới để hoàn tác các thay đổi đã được commit trong một commit cụ thể.

  • Ví dụ: git revert abc123 (trong đó abc123 là mã commit cần hoàn tác).

git reset --hard HEAD~1:

  • Sử dụng lệnh này để đặt HEAD (con trỏ commit hiện tại) trở lại commit trước đó và xóa tất cả các thay đổi sau commit đó.

  • Lưu ý: Lệnh này làm mất lịch sử commit, chỉ nên sử dụng khi bạn chắc chắn rằng bạn muốn loại bỏ các commit sau commit cuối cùng.

Nhớ rằng việc hoàn tác thay đổi sau khi commit có thể gây ra sự thay đổi không mong muốn trong lịch sử commit của dự án, do đó hãy sử dụng cẩn thận và luôn làm việc trên một bản sao lưu nếu có thể.

7. Nhánh (Branches)

7.1. Tại sao nên sử dụng nhánh?

Sử dụng nhánh trong Git mang lại nhiều lợi ích quan trọng cho quá trình phát triển phần mềm. Dưới đây là một số lý do tại sao nên sử dụng nhánh:

  • Cô lập công việc: Đảm bảo tính cô lập giữa các tính năng và sửa lỗi, tránh xung đột.

  • Phát triển song song: Cho phép nhiều người cùng làm việc trên các tính năng khác nhau mà không ảnh hưởng đến nhau.

  • Thử nghiệm và kiểm thử: Dễ dàng thử nghiệm tính năng mới và kiểm tra tính ổn định trước khi tích hợp vào nhánh chính.

  • Quay lại phiên bản trước: Dễ dàng quay lại phiên bản trước của dự án nếu cần thiết.

  • Hợp tác: Tạo điều kiện cho việc hợp tác giữa các nhóm và nhà phát triển thông qua việc làm việc trên các nhánh riêng biệt.

7.2. Tạo nhánh (nhánh git)

Để tạo một nhánh mới trong Git, bạn có thể sử dụng lệnh git branch hoặc git checkout -b. Dưới đây là cách sử dụng từng lệnh:

Sử dụng git branch:

git branch <tên-nhánh>

Ví dụ: để tạo một nhánh có tên là "feature-x":

git branch feature-x

Sử dụng git checkout -b:

git checkout -b <tên-nhánh>

Lệnh này kết hợp cả việc tạo nhánh mới và chuyển đổi sang nhánh đó cùng một lúc. Ví dụ:

git checkout -b feature-x

Sau khi bạn tạo nhánh mới, bạn có thể làm việc trên nhánh đó bằng cách thêm, commit và merge các thay đổi như thông thường.

7.3.  Sáp nhập các nhánh (git merge)

Để merge các thay đổi từ một nhánh vào nhánh hiện tại, bạn có thể sử dụng lệnh git merge. 

Chuyển đến nhánh mà bạn muốn merge vào:

  • Trước khi thực hiện merge, hãy chắc chắn rằng bạn đang ở nhánh mà bạn muốn merge vào. Sử dụng lệnh git checkout để chuyển đổi sang nhánh đó. Ví dụ: git checkout <tên-nhánh-đích>

Merge nhánh cần merge vào nhánh hiện tại:

  • git merge <tên-nhánh-nguồn>

  • Trong đó <tên-nhánh-nguồn> là tên của nhánh mà bạn muốn merge vào nhánh hiện tại. Ví dụ: git merge feature-x

  • Git sẽ tự động thử merge các thay đổi từ nhánh feature-x vào nhánh hiện tại. Nếu không có xung đột xảy ra, quá trình merge sẽ hoàn tất và bạn có thể tiếp tục làm việc trên nhánh hiện tại.

Xử lý xung đột (nếu có):

Nếu có xung đột giữa các thay đổi trên nhánh hiện tại và nhánh bạn đang merge vào, Git sẽ thông báo cho bạn và dừng quá trình merge. Bạn cần giải quyết xung đột bằng cách chỉnh sửa các tệp ảnh hưởng, sau đó thêm chúng vào staging area và commit lại. Sau khi giải quyết xung đột, bạn có thể tiếp tục merge bằng cách chạy lại lệnh git merge.

8. Đồng bộ hóa với kho lưu trữ từ xa

Để đồng bộ hóa với một kho lưu trữ từ xa trong Git, bạn có thể sử dụng các lệnh git push và git pull. Dưới đây là cách sử dụng mỗi lệnh:

8.1. git push:

Lệnh này được sử dụng để đẩy các commit từ kho lưu trữ cục bộ của bạn lên kho lưu trữ từ xa (ví dụ: GitHub, Bitbucket).

git push <remote> <branch>

Trong đó:

  • <remote> là tên của kho lưu trữ từ xa. Thông thường, khi bạn clone một repository, remote mặc định sẽ là origin.

  • <branch> là tên của nhánh mà bạn muốn đẩy lên kho lưu trữ từ xa.

git push origin master

8.2. git pull:

Lệnh này được sử dụng để kéo các thay đổi từ kho lưu trữ từ xa và tự động thực hiện merge chúng vào nhánh hiện tại của bạn.

git pull <remote> <branch>

Tương tự như git push, bạn cũng cần chỉ định remote và branch.

Ví dụ:

git pull origin master

Khi bạn thực hiện các lệnh git push và git pull, Git sẽ xác định xem có sự khác biệt nào giữa các commit trên kho lưu trữ từ xa và kho lưu trữ cục bộ. Nếu có, Git sẽ cập nhật kho lưu trữ của bạn sao cho phản ánh những thay đổi mới nhất.

Lời kết

Những kiến thức cơ bản về Git là nền tảng quan trọng cho mọi nhà phát triển phần mềm. Bằng cách hiểu và sử dụng hiệu quả các khái niệm và lệnh cơ bản của Git, bạn có thể quản lý dự án của mình một cách hiệu quả, hợp tác với đồng nghiệp và duy trì lịch sử phiên bản của mã nguồn một cách dễ dàng. Hy vọng rằng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và cơ bản về Git, từ đó giúp bạn trở thành một lập trình viên thành công và hiệu quả hơn.

VietnamWorks inTECH