Git: Khởi Đầu Nhanh
Giới Thiệu
Chào mừng bạn đến với hướng dẫn cơ bản về Git! Trong thế giới phát triển phần mềm hiện đại, Git đã trở thành một công cụ không thể thiếu cho bất kỳ lập trình viên nào. Nó không chỉ giúp bạn quản lý mã nguồn cá nhân một cách hiệu quả mà còn là nền tảng cho sự hợp tác nhóm liền mạch.
Git là gì? Git là một hệ thống kiểm soát phiên bản phân tán (Distributed Version Control System - DVCS) miễn phí và mã nguồn mở, được thiết kế để xử lý mọi thứ từ các dự án nhỏ đến rất lớn với tốc độ và hiệu quả. Thay vì chỉ lưu trữ các phiên bản của file tại một máy chủ trung tâm, Git cho phép mỗi người dùng có một bản sao hoàn chỉnh của toàn bộ lịch sử dự án trên máy tính cục bộ của họ. Điều này mang lại sự linh hoạt, khả năng làm việc offline và khả năng phục hồi dữ liệu cao.
Tầm quan trọng và các trường hợp sử dụng:
- Quản lý thay đổi: Theo dõi mọi thay đổi trong mã nguồn, cho phép bạn xem ai đã thay đổi gì, khi nào và tại sao.
- Hợp tác nhóm: Nhiều lập trình viên có thể làm việc trên cùng một dự án mà không ghi đè lên công việc của nhau, dễ dàng hợp nhất các thay đổi.
- Hoàn tác lỗi: Dễ dàng quay lại các phiên bản trước của dự án nếu có lỗi hoặc cần thử nghiệm các ý tưởng mới.
- Phân nhánh (Branching): Tạo các nhánh độc lập để phát triển tính năng mới, sửa lỗi mà không ảnh hưởng đến mã nguồn chính.
- Triển khai (Deployment): Tích hợp với các quy trình CI/CD để tự động hóa việc kiểm thử và triển khai ứng dụng.
Metadata:
- Thời gian thực hiện: Khoảng 45-90 phút
- Độ khó: Cơ bản (dành cho người mới bắt đầu)
- Yêu cầu: Kiến thức cơ bản về sử dụng dòng lệnh (command line/terminal)
Yêu Cầu Hệ Thống
Git là một công cụ nhẹ và tương thích với hầu hết các hệ điều hành phổ biến.
- Hệ điều hành:
- Windows 7 trở lên
- macOS 10.9 (Mavericks) trở lên
- Hầu hết các bản phân phối Linux (Ubuntu, Fedora, CentOS, Debian, v.v.)
- Cấu hình tối thiểu:
- CPU: Bất kỳ bộ xử lý hiện đại nào.
- RAM: 512 MB trở lên.
- Dung lượng đĩa: Khoảng 200 MB cho cài đặt Git và đủ không gian cho các repository của bạn.
- Cấu hình khuyến nghị:
- CPU: Dual-core trở lên.
- RAM: 4 GB trở lên.
- Dung lượng đĩa: 1 GB trở lên cho cài đặt và các repository lớn.
Các Bước Thực Hiện Chi Tiết
1. ⚙️ Cài Đặt Git
Trước khi bắt đầu, bạn cần cài đặt Git trên hệ thống của mình.
1.1. Cài đặt trên Linux
Sử dụng trình quản lý gói của hệ điều hành của bạn.
# Đối với Debian/Ubuntu
sudo apt update
sudo apt install git -y
# Đối với Fedora
sudo dnf install git -y
# Đối với CentOS/RHEL
sudo yum install git -y
1.2. Cài đặt trên macOS
Cách dễ nhất là sử dụng Homebrew. Nếu bạn chưa có Homebrew, hãy cài đặt nó trước.
# Cài đặt Homebrew (nếu chưa có)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Cài đặt Git bằng Homebrew
brew install git
💡 Mẹo: macOS cũng đi kèm với Git được cài đặt sẵn như một phần của Xcode Command Line Tools. Bạn có thể cài đặt chúng bằng cách chạy git --version lần đầu tiên hoặc xcode-select --install. Tuy nhiên, phiên bản Git từ Homebrew thường mới hơn.
1.3. Cài đặt trên Windows
- Truy cập trang web chính thức của Git: git-scm.com/download/win
- Tải xuống trình cài đặt phù hợp với kiến trúc hệ thống của bạn (thường là 64-bit).
- Chạy file
.exeđã tải xuống và làm theo hướng dẫn. Trong quá trình cài đặt, bạn có thể giữ các tùy chọn mặc định hoặc tùy chỉnh theo nhu cầu. ⚠️ Lưu ý: Đảm bảo chọn tùy chọn "Use Git from the Windows Command Prompt" hoặc "Git from the command line and also from 3rd-party software" để có thể sử dụng Git từ bất kỳ terminal nào.
1.4. Xác minh cài đặt
Sau khi cài đặt, mở terminal (hoặc Git Bash trên Windows) và chạy lệnh sau để kiểm tra phiên bản Git:
git --version
# Kết quả ví dụ: git version 2.34.1
Nếu bạn thấy phiên bản Git hiển thị, nghĩa là Git đã được cài đặt thành công. ✅
2. ⚙️ Cấu Hình Git Ban Đầu
Sau khi cài đặt, bạn cần cấu hình thông tin người dùng của mình. Thông tin này sẽ được gắn với mỗi commit bạn tạo ra, giúp xác định ai là người thực hiện thay đổi.
# Cấu hình tên người dùng
# Tên này sẽ xuất hiện trong lịch sử commit
git config --global user.name "Your Name"
# Cấu hình email người dùng
# Email này cũng sẽ xuất hiện trong lịch sử commit
git config --global user.email "[email protected]"
# (Tùy chọn) Cấu hình trình soạn thảo mặc định cho Git
# Ví dụ: sử dụng VS Code
git config --global core.editor "code --wait"
# Hoặc Vim:
# git config --global core.editor "vim"
💡 Mẹo: Tùy chọn --global áp dụng cấu hình cho tất cả các repository trên máy tính của bạn. Nếu bạn muốn cấu hình riêng cho một repository cụ thể, hãy bỏ --global và chạy lệnh trong thư mục của repository đó.
Để xem lại cấu hình của bạn, chạy:
git config --list
# Hoặc chỉ xem các cấu hình global
git config --global --list
3. ✅ Tạo Một Repository Mới
Bây giờ bạn đã sẵn sàng để tạo repository Git đầu tiên của mình.
3.1. Khởi tạo một Repository
Tạo một thư mục dự án mới và di chuyển vào đó, sau đó khởi tạo Git:
# Tạo một thư mục dự án mới
mkdir my-first-git-project
cd my-first-git-project
# Khởi tạo một repository Git trống trong thư mục hiện tại
git init
# Kết quả: Initialized empty Git repository in /path/to/my-first-git-project/.git/
Lệnh git init tạo một thư mục ẩn .git bên trong thư mục dự án của bạn. Thư mục này chứa tất cả các file và metadata cần thiết cho Git để theo dõi dự án của bạn.
3.2. Thêm file và Commit
Tạo một file mẫu và thêm nó vào Git.
# Tạo một file mẫu
echo "# My First Git Project" > README.md
echo "Đây là dự án Git đầu tiên của tôi." >> README.md
echo "console.log('Hello, Git!');" > app.js
# Kiểm tra trạng thái của repository
git status
# Kết quả sẽ cho thấy README.md và app.js là các file chưa được theo dõi (untracked files)
Để Git bắt đầu theo dõi các file này, bạn cần "stage" chúng (thêm vào khu vực chuẩn bị).
# Thêm file README.md vào khu vực chuẩn bị (staging area)
git add README.md
# Thêm file app.js vào khu vực chuẩn bị
git add app.js
# Hoặc thêm tất cả các file mới/đã sửa đổi trong thư mục hiện tại vào khu vực chuẩn bị
# git add .
# Kiểm tra trạng thái lại
git status
# Kết quả sẽ cho thấy các file đã sẵn sàng để commit (Changes to be committed)
Cuối cùng, "commit" các thay đổi đã được chuẩn bị vào lịch sử của Git.
# Tạo một commit với thông điệp mô tả
git commit -m "Initial commit: Add README and app.js"
# Kết quả ví dụ:
# [master (root-commit) d4a1b2c] Initial commit: Add README and app.js
# 2 files changed, 3 insertions(+)
# create mode 100644 README.md
# create mode 100644 app.js
Lệnh git commit -m "Your message" tạo một "snapshot" của dự án tại thời điểm hiện tại và lưu nó vđo lịch sử repository. Thông điệp commit (-m) rất quan trọng để mô tả những gì đã thay đổi.
4. 📊 Thao Tác Cơ Bản Với Git
Sau khi đã tạo commit đầu tiên, hãy khám phá các lệnh Git cơ bản khác.
4.1. Xem Trạng Thái Repository
Lệnh git status là bạn thân của bạn trong Git, nó cho bạn biết trạng thái hiện tại của repository.
git status
# Kết quả sẽ cho biết không có thay đổi nào đang chờ xử lý
# On branch master
# nothing to commit, working tree clean
Bây giờ, hãy thử sửa đổi một file:
# Sửa đổi file app.js
echo "console.log('Learning Git is fun!');" >> app.js
# Kiểm tra trạng thái
git status
# Kết quả: Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git restore <file>..." to discard changes in working directory)
# modified: app.js
Git cho bạn biết file app.js đã được sửa đổi nhưng chưa được thêm vào khu vực chuẩn bị.
4.2. Xem Sự Khác Biệt (Diff)
Lệnh git diff cho phép bạn xem chi tiết những thay đổi bạn đã thực hiện nhưng chưa được thêm vào khu vực chuẩn bị.
git diff
# Kết quả sẽ hiển thị dòng mới được thêm vào app.js
# diff --git a/app.js b/app.js
# index 2b1a2c3..d4e5f6g 100644
# --- a/app.js
# +++ b/app.js
# @@ -1,2 +1,3 @@
# console.log('Hello, Git!');
# +console.log('Learning Git is fun!');
Nếu bạn đã git add file đó, bạn có thể xem sự khác biệt giữa khu vực chuẩn bị và commit cuối cùng bằng git diff --staged.
4.3. Xem Lịch Sử Commit
Lệnh git log hiển thị lịch sử của các commit trong repository, bao gồm tác giả, ngày tháng và thông điệp commit.
git log
# Kết quả ví dụ:
# commit d4a1b2c3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9 (HEAD -> master)
# Author: Your Name <[email protected]>
# Date: Thu Jan 1 00:00:00 2023 +0700
#
# Initial commit: Add README and app.js
💡 Mẹo: Bạn có thể sử dụng git log --oneline --graph --all để xem lịch sử một cách ngắn gọn và trực quan hơn.
4.4. Hoàn Tác Thay Đổi
Bạn có thể hoàn tác các thay đổi chưa được commit.
# Giả sử bạn đã sửa đổi app.js nhưng chưa thêm vào staging area
# Để hoàn tác các thay đổi trong working directory (quay lại trạng thái của commit cuối cùng)
git restore app.js
# Hoặc, để bỏ các file đã được add vào staging area nhưng chưa commit:
# git restore --staged app.js
⚠️ Cảnh báo: git restore là một lệnh mạnh mẽ. Hãy cẩn thận khi sử dụng, vì nó có thể xóa các thay đổi chưa được lưu.
4.5. Xóa File
Để xóa một file khỏi repository và khỏi hệ thống file của bạn:
# Xóa file example.txt
rm example.txt # Xóa khỏi hệ thống file
git rm example.txt # Xóa khỏi Git và staging area
git commit -m "Remove example.txt" # Commit thay đổi
Hoặc bạn có thể sử dụng git rm trực tiếp:
# Tạo một file tạm
echo "Temporary content" > temp.txt
git add temp.txt
git commit -m "Add temporary file"
# Xóa file temp.txt khỏi Git và hệ thống file
git rm temp.txt
git commit -m "Remove temporary file"
Nếu bạn chỉ muốn xóa file khỏi Git nhưng giữ lại trên hệ thống file cục bộ (ví dụ: để bỏ qua nó trong tương lai), sử dụng --cached:
git rm --cached temp.txt
git commit -m "Stop tracking temp.txt but keep it locally"
5. 🌳 Làm Việc Với Branch
Branching là một trong những tính năng mạnh mẽ nhất của Git, cho phép bạn tạo các dòng phát triển độc lập.
5.1. Liệt kê, Tạo và Chuyển đổi Branch
Mặc định, bạn đang làm việc trên branch master (hoặc main trong các Git client mới hơn).
# Liệt kê tất cả các branch và hiển thị branch hiện tại
git branch
# * master (hoặc main)
# Tạo một branch mới có tên 'feature/new-login'
git branch feature/new-login
# Chuyển đổi sang branch mới
git checkout feature/new-login
# Hoặc với Git phiên bản mới hơn (từ 2.23 trở lên):
# git switch feature/new-login
# Kiểm tra lại các branch, bạn sẽ thấy dấu * ở branch mới
git branch
# master
# * feature/new-login
💡 Mẹo: Bạn có thể tạo và chuyển đổi sang một branch mới trong một lệnh duy nhất: git checkout -b feature/new-login (hoặc git switch -c feature/new-login).
5.2. Hợp nhất Branch (Merge)
Sau khi hoàn thành công việc trên branch tính năng, bạn có thể hợp nhất nó trở lại branch chính.
# Giả sử bạn đang ở branch 'feature/new-login' và đã tạo một số commit
# Quay lại branch chính
git checkout master
# Hợp nhất branch 'feature/new-login' vào 'master'
git merge feature/new-login
# Kết quả:
# Updating a1b2c3d..e4f5g6h
# Fast-forward
# new-feature.js | 3 +++
# 1 file changed, 3 insertions(+)
# create mode 100644 new-feature.js
Nếu có xung đột (merge conflict), Git sẽ thông báo cho bạn và bạn cần giải quyết chúng thủ công trước khi commit việc hợp nhất.
5.3. Xóa Branch
Sau khi branch đã được hợp nhất và không còn cần thiết, bạn có thể xóa nó.
# Xóa branch 'feature/new-login' (chỉ khi nó đã được hợp nhất)
git branch -d feature/new-login
# Kết quả: Deleted branch feature/new-login (was e4f5g6h).
# Nếu bạn muốn xóa một branch chưa được hợp nhất (cẩn thận!)
# git branch -D feature/experimental
6. 🌐 Làm Việc Với Remote Repository
Làm việc với remote repository (như GitHub, GitLab, Bitbucket) là cách bạn hợp tác với người khác và sao lưu mã nguồn của mình.
6.1. Sao chép một Repository (Clone)
Để lấy một bản sao của một repository hiện có từ xa:
# Sao chép repository từ GitHub
git clone https://github.com/octocat/Spoon-Knife.git
# Lệnh này sẽ tạo một thư mục 'Spoon-Knife' chứa toàn bộ dự án
# và tự động cấu hình remote 'origin' trỏ đến URL này.
6.2. Thêm Remote
Nếu bạn đã có một repository cục bộ và muốn liên kết nó với một remote repository mới:
# Thêm một remote có tên 'origin' trỏ đến URL của repository từ xa
git remote add origin https://github.com/your-username/your-project.git
# Kiểm tra các remote đã cấu hình
git remote -v
# Kết quả:
# origin https://github.com/your-username/your-project.git (fetch)
# origin https://github.com/your-username/your-project.git (push)
⚠️ Lưu ý: origin là tên remote mặc định cho repository chính, nhưng bạn có thể đặt bất kỳ tên nào.
6.3. Đẩy Thay Đổi Lên Remote (Push)
Để gửi các commit từ repository cục bộ của bạn lên remote repository:
# Đẩy branch 'master' (hoặc 'main') lên remote 'origin'
# Lần đầu tiên push một branch, bạn cần thiết lập upstream tracking
git push -u origin master
# Hoặc nếu branch chính của bạn là 'main':
# git push -u origin main
# Từ lần sau, bạn chỉ cần dùng:
git push
Lệnh git push sẽ gửi tất cả các commit mới từ branch cục bộ của bạn lên branch tương ứng trên remote.
6.4. Kéo Thay Đổi Từ Remote (Pull)
Để tải xuống các thay đổi từ remote repository và hợp nhất chúng vào branch cục bộ của bạn:
# Kéo các thay đổi từ branch 'master' trên remote 'origin'
git pull origin master
# Hoặc nếu branch chính của bạn là 'main':
# git pull origin main
# Nếu bạn đã thiết lập upstream tracking, chỉ cần dùng:
git pull
git pull thực chất là sự kết hợp của git fetch (tải về các thay đổi) và git merge (hợp nhất các thay đổi đó vào branch hiện tại của bạn).
6.5. Tải về Thay Đổi Từ Remote (Fetch)
Nếu bạn chỉ muốn xem các thay đổi mới trên remote mà không hợp nhất chúng vào branch hiện tại của mình:
git fetch origin
# Lệnh này sẽ tải về tất cả các commit mới từ remote 'origin'
# nhưng không thay đổi working directory hoặc branch cục bộ của bạn.
# Bạn có thể xem các thay đổi bằng cách so sánh branch cục bộ với origin/master
# Ví dụ: git log HEAD..origin/master
Troubleshooting hoặc Các Vấn Đề Thường Gặp
- Xung đột hợp nhất (Merge Conflicts):
- Vấn đề: Xảy ra khi Git không thể tự động hợp nhất các thay đổi từ hai branch khác nhau vào cùng một dòng của cùng một file.
- Giải pháp: Git sẽ đánh dấu các vùng xung đột trong file bằng
<<<<<<<,=======,>>>>>>>. Bạn cần mở file, chỉnh sửa thủ công để giữ lại các thay đổi mong muốn, sau đógit add <file>vàgit commitđể hoàn tất việc hợp nhất.
- Lỗi xác thực khi Push/Pull (Authentication Failed):
- Vấn đề: Git không thể xác thực bạn với remote repository (ví dụ: GitHub).
- Giải pháp:
- Sử dụng SSH keys: Cấu hình SSH key và thêm public key vào tài khoản Git hosting của bạn.
- Personal Access Tokens (PATs): GitHub yêu cầu sử dụng PAT thay vì mật khẩu cho các hoạt động Git qua HTTPS. Tạo PAT từ cài đặt tài khoản của bạn và sử dụng nó làm mật khẩu khi được yêu cầu.
- Đảm bảo tên người dùng và mật khẩu (hoặc PAT) là chính xác.
- File không được thêm vào Commit:
- Vấn đề: Bạn đã sửa đổi file nhưng quên
git addtrước khigit commit. - Giải pháp: Chạy
git add <file>cho các file đã sửa đổi, sau đógit commit --amendđể thêm các thay đổi vào commit cuối cùng (nếu commit đó chưa được push) hoặc tạo một commit mới.
- Vấn đề: Bạn đã sửa đổi file nhưng quên
- Làm việc trên sai Branch:
- Vấn đề: Bạn đã commit các thay đổi vào branch sai.
- Giải pháp:
git reset HEAD~1(để hoàn tác commit nhưng giữ lại các thay đổi trong working directory).git stash(để lưu tạm thời các thay đổi chưa commit).git checkout <correct-branch>.git stash pop(để áp dụng lại các thay đổi).git add .vàgit committrên branch đúng. ⚠️ Cảnh báo: Không nêngit resethoặcgit rebasecác commit đã được push lên remote nếu bạn đang làm việc trong một nhóm, vì điều đó có thể gây ra vấn đề cho những người khác.
Kết Luận
Chúc mừng! Bạn đã hoàn thành hướng dẫn cơ bản về Git. Bạn đã học cách cài đặt Git, cấu hình môi trường, tạo repository, thực hiện các thao tác cơ bản như thêm, commit, xem trạng thái, lịch sử, và làm việc với các branch. Cuối cùng, bạn cũng đã biết cách tương tác với remote repository để sao lưu và hợp tác.
Git là một công cụ mạnh mẽ và có rất nhiều điều để khám phá. Hãy tiếp tục thực hành và tìm hiểu sâu hơn để trở thành một "Git master"!
Best Practices
- Commit nhỏ và thường xuyên: Mỗi commit nên chứa một tập hợp thay đổi có liên quan đến một tính năng hoặc sửa lỗi cụ thể.
- Thông điệp commit rõ ràng: Viết thông điệp commit ngắn gọn, súc tích ở dòng đầu tiên, sau đó là mô tả chi tiết nếu cần. Hãy trả lời câu hỏi "Tại sao thay đổi này được thực hiện?".
- Sử dụng Branching hợp lý: Tạo các branch riêng cho từng tính năng, sửa lỗi hoặc thí nghiệm. Giữ branch
master/mainluôn ổn định. - Đồng bộ hóa thường xuyên:
git pullthường xuyên để cập nhật mã nguồn cục bộ với các thay đổi từ remote, tránh xung đột lớn. - Sử dụng
.gitignore: Thêm các file không cần thiết (như file biên dịch, file cấu hình nhạy cảm, thư mụcnode_modules) vào file.gitignoređể Git bỏ qua chúng.
Tài Liệu Tham Khảo
- Pro Git Book (Tiếng Việt): git-scm.com/book/vi/v2 - Tài liệu toàn diện và miễn phí về Git.
- Git Official Documentation: git-scm.com/doc - Tài liệu chính thức của Git.
- Learn Git Branching: learngitbranching.js.org - Một trang web tương tác tuyệt vời để học về branching trong Git.
Hy vọng bài hướng dẫn này đã cung cấp cho bạn một nền tảng vững chắc để bắt đầu hành trình với Git!