Git Survival Guide: Cẩm nang sinh tồn cho Developer
Git lưu lịch sử thay đổi, nhưng khả năng khôi phục phụ thuộc vào việc nội dung đã được commit hay vẫn chỉ nằm trong working tree.
Các lệnh ví dụ giả định remote tên origin và nhánh chính tên main. Hãy thay bằng tên trong repository của bạn nếu khác.
🧭 Mô hình tổng thể
Working tree -> Stage -> Commit -> Push
|
+-> reference đổi -> Reflog ghi lại
- Working tree chứa thay đổi đang làm.
- Stage chọn nội dung đưa vào commit.
- Commit lưu một mốc trong lịch sử local.
- Push gửi commit lên remote.
Reflog ghi lại một số lần cập nhật reference trong repository local. Nó không sao lưu nội dung chưa commit.
🛡️ Thói quen giúp giảm rủi ro
Kiểm tra nhánh + working tree
|
v
Làm trên branch riêng -> Stage phần cần thiết -> Commit rõ nghĩa
| |
v v
Theo quy trình review Push lên remote phù hợp
|
v
Không force-push nhánh dùng chung
- Dùng
git pullkhi cần tích hợp đúng upstream vào nhánh hiện tại. - Tránh force-push lên nhánh dùng chung.
- Nếu cần cập nhật lịch sử nhánh cá nhân, hiểu tác động và phối hợp với nhóm.
--force-with-leasevẫn có thể thay lịch sử.
🌱 Bắt đầu một task
Nếu main là nhánh chính và bạn chưa có thay đổi local cần giữ:
git switch main
git pull --ff-only origin main
git switch -c task-123
--ff-onlykhiến lệnh dừng nếu lịch sử local và remote đã phân kỳ. Khi đó, chọn cách tích hợp phù hợp.- Nếu nhánh chính có tên khác, thay
mainbằng tên đó. - Nếu có thay đổi chưa commit, hãy kiểm tra rồi commit hoặc cất chúng an toàn trước khi chuyển nhánh.
Khi hoàn tất, kiểm tra diff, tạo commit và push nhánh task:
git status
git diff
git add path/to/changed-file
git commit -m "feat: describe the change"
git push -u origin task-123
- Chỉ định file cần stage thay vì
git add .để tránh đưa nhầm file vào commit. - Nếu push bị từ chối vì remote có commit mới, fetch rồi tích hợp đúng upstream theo quy trình nhóm.
- Không cần chạy
git pulltrước mọi lần push.
🏷️ Branch, tag và release khác nhau thế nào?
Branch: commit -> commit -> commit (tiếp tục tiến khi làm việc)
|
v
Tag: v1.0.0 (đánh dấu một commit)
|
v
Release: notes + tệp tải (trên GitHub/GitLab...)
- Branch dùng cho một dòng phát triển; nó tiến tới commit mới khi tiếp tục làm việc.
- Tag đánh dấu một commit cụ thể và thường được giữ nguyên.
- Release là trang phát hành trên nền tảng lưu trữ, gắn với tag và có thể có ghi chú cùng tệp tải xuống.
Tạo branch để tiếp tục phát triển, hoặc annotated tag để đánh dấu commit phát hành:
git switch -c feature/login
git tag -a v1.0.0 -m "Release v1.0.0" HEAD
git push origin v1.0.0
- Lệnh trên gắn tag vào commit hiện tại (
HEAD). - Đẩy tag riêng bằng
git push origin v1.0.0; push branch không tự đẩy tag. - Annotated tag lưu người tạo, thời điểm và thông điệp. Lightweight tag là nhãn đơn giản hơn.
Định nghĩa chi tiết về reference, branch và tag trong Git; xem thêm cách tạo tag.
🧩 Xử lý conflict
Conflict xuất hiện khi Git không thể tự kết hợp thay đổi. Trong lúc merge, file thường có các dấu phân cách sau:
<<<<<<< HEAD
Nội dung từ nhánh hiện tại
=======
Nội dung từ nhánh được tích hợp
>>>>>>> ten-nhanh
- Mở từng file, chọn hoặc kết hợp nội dung đúng rồi xóa dấu phân cách.
- Chạy
git add <file>cho từng file đã giải quyết. - Kiểm tra
git statusvà diff. - Với merge, chạy
git commitnếu Git yêu cầu. Với rebase, chạygit rebase --continue.
Để hủy thao tác đang chạy, dùng git merge --abort hoặc git rebase --abort tương ứng.
🧯 Tìm lại commit bị thất lạc
git reflogliệt kê các lần cập nhật reference local.- Lệnh này hữu ích khi commit đã tạo nhưng không còn được nhánh hiện tại trỏ tới.
- Reflog không ghi lại mọi lần sửa file và không khôi phục nội dung chưa được Git lưu thành object.
# Xem các lần HEAD được cập nhật gần đây
git reflog
# Kiểm tra commit nghi ngờ trước khi khôi phục
git show a1b2c3d
# Tạo nhánh cứu hộ trỏ tới commit cần giữ
git branch rescue a1b2c3d
- Nhánh cứu hộ giữ commit để kiểm tra mà không viết lại nhánh hiện tại.
- Reflog chỉ có ở local; các mục cũ có thể bị dọn theo cấu hình và thời gian.
- Nếu commit đã push, kiểm tra cả remote.
- Thay đổi chưa commit bị xóa bởi
git reset --hardcó thể không khôi phục được bằng reflog.
✅ Kết luận
- Kiểm tra nhánh và nội dung sẽ stage trước khi commit.
- Commit tạo mốc có thể truy vết; push lưu commit trên remote.
- Reflog có thể giúp tìm commit local bị mất dấu, nhưng không thay thế backup cho thay đổi chưa commit.
🎒 Tóm tắt bỏ túi (Take away)
| Điểm chính | Hành động |
|---|---|
| Bắt đầu task | Cập nhật nhánh chính có chủ đích rồi tạo nhánh riêng. |
| Stage và commit | Kiểm tra git status/git diff, chỉ stage file liên quan, viết message rõ. |
| Push | Đẩy nhánh phù hợp lên remote; tránh force push nhánh dùng chung. |
| Conflict | Sửa từng file, stage phần đã giải quyết và hoàn tất merge hoặc rebase đúng quy trình. |
| Mất dấu commit | Dùng git reflog, kiểm tra bằng git show, rồi tạo nhánh cứu hộ. |
| Bảo vệ dữ liệu | Commit và push lên remote; reflog local không phải backup cho file chưa commit. |
🔗 Tài liệu tham khảo
Nội dung về branch và tag dựa trên tài liệu mô hình dữ liệu Git và hướng dẫn tagging.