Cấu hình cơ bản và khởi tạo kho lưu trữ
Trước khi bắt đầu làm việc với Git, cần thiết lập thông tin người dùng để nhận dạng tác giả các lần commit:
git config --global user.name "Nguyen Van A"
git config --global user.email "nguyenvana@example.com"
Kích hoạt bộ nhớ tạm chứng thực để tránh nhập lại tài khoản nhiều lần:
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=7200'
Tạo kho lưu trữ cục bộ
Dùng lệnh sau để khởi tạo một kho chứa Git mới trong thư mục hiện tại:
git init
Lệnh này sẽ tạo ra thư mục ẩn .git, nơi lưu trữ toàn bộ dữ liệu lịch sử, cấu hình và trạng thái của dự án. Không được xóa thư mục này.
Quản lý vùng làm việc, staging và commit
Git chia quá trình làm việc thành ba khu vực: vùng làm việc (working directory), vùng tạm (staging area) và vùng lịch sử (repository). Các lệnh phổ biến:
git add filename: Đưa tệp cụ thể vào vùng tạm.git add .: Thêm tất cả tệp đã thay đổi hoặc tạo mới (không bao gồm tệp bị xóa).git add -u: Theo dõi thay đổi và xóa tệp, bỏ qua tệp mới chưa theo dõi.git add -A: Bao gồm mọi thay đổi — thêm, sửa, xóa.
Xem trạng thái hiện tại bằng:
git status
Nếu muốn hủy bỏ việc thêm tệp vào staging:
git reset HEAD <tên_tệp>
Commit và quản lý lịch sử
Sau khi các tệp đã ở vùng tạm, tiến hành commit để lưu vào lịch sử:
git commit -m "Mô tả thay đổi"
Xem lịch sử commit:
git log: Hiển thị danh sách các commit gần nhất đến cũ nhất.git log --oneline: Dạng rút gọn, mỗi commit một dòng.git reflog: Ghi lại mọi hành động đã thực hiện, kể cả rollback.
So sánh sự khác biệt giữa các khu vực
Dùng git diff để kiểm tra sự thay đổi:
git diff: So sánh vùng làm việc với staging.git diff --cachedhoặcgit diff --staged: So sánh staging với phiên bản cuối cùng trong repository.git diff HEAD: So sánh vùng làm việc với commit mới nhất.git diff branch1..branch2: So sánh nội dung giữa hai nhánh.
Thao tác hoàn tác và khôi phục
Một số trường hợp cần hoàn tác thay đổi:
git checkout .: Khôi phục toàn bộ vùng làm việc về trạng thái giống staging (mất thay đổi chưa add).git reset --hard: Quay về trạng thái chính xác của commit chỉ định, mất mọi thay đổi sau đó.git reset --soft <commit-id>: Chỉ di chuyển con trỏ HEAD, giữ nguyên staging và working directory.git revert <commit-id>: Tạo một commit mới để đảo ngược thay đổi, an toàn hơn so với reset khi làm việc nhóm.
Quản lý tệp bỏ qua (.gitignore)
Tạo tệp .gitignore ở thư mục gốc để loại trừ các file không muốn theo dõi như: node_modules/, *.log, dist/, v.v.
Làm việc nhóm với kho lưu trữ từ xa
Liên kết với kho lưu trữ trên GitHub, GitLab hay máy chủ nội bộ:
git remote add origin https://github.com/user/project.git
Kiểm tra kết nối:
git remote -v
Đẩy mã lên từ xa:
git push -u origin master
Lấy cập nhật từ kho lưu trữ chính:
git pull origin main
Sử dụng nhánh (branch) hiệu quả
Nhánh giúp phát triển song song mà không ảnh hưởng đến phiên bản ổn định. Một quy trình chuẩn:
- Tạo và chuyển sang nhánh mới:
- Thực hiện code và commit bình thường.
- Chuyển về nhánh chính và cập nhật:
- Hợp nhất nhánh:
- Xử lý xung đột nếu có, sau đó commit.
- Xóa nhánh phụ nếu không cần thiết:
git checkout -b feature/login
git checkout main
git pull origin main
git merge feature/login
git branch -d feature/login
Quản lý thay đổi tạm thời với stash
Khi cần chuyển nhánh nhưng chưa muốn commit dở dang:
git stash # Lưu tạm thay đổi
git stash list # Xem danh sách stash
git stash apply # Khôi phục stash mới nhất
git stash pop # Khôi phục và xóa khỏi danh sách
Hợp nhất thông minh: Merge vs Rebase
- Merge: Tạo commit hợp nhất, giữ nguyên lịch sử ban đầu.
- Rebase: "Chồng" các commit của nhánh lên đầu nhánh đích, tạo lịch sử tuyến tính.
Ví dụ rebase:
git checkout feature
git rebase main
Sau đó về main và merge nhanh:
git checkout main
git merge feature
Tạo và áp dụng bản vá (patch)
Trong môi trường không kết nối trực tiếp, có thể xuất sự thay đổi dưới dạng file:
git diff > fix-bug.patch
Áp dụng ở nơi khác:
git apply fix-bug.patch
Kiểm tra trước khi áp dụng:
git apply --check fix-bug.patch
Thiết lập bí danh (alias) để tăng tốc độ
Tạo shortcut cho lệnh dài:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
Bây giờ có thể dùng git st thay vì git status.
Khắc phục xung đột khi hợp nhất
Khi hai người sửa cùng một đoạn mã, Git sẽ báo xung đột. Cần mở tệp liên quan và tìm khối như sau:
<<<<<<< HEAD
// Mã hiện tại
=======
// Mã từ nhánh được merge
>>>>>>> branch-name
Sửa thủ công, chọn phần giữ lại hoặc kết hợp cả hai, sau đó lưu và chạy:
git add <tệp_xung_dot>
git commit