🎬 Mở bài: Git ban đầu là công cụ quản lý source code…
… nhưng vào tay nhiều team, nó thành trò chơi sinh tồn.
Chuyện về những nhánh chồng chéo, conflict bất tận và hành trình sống sót giữa “git hell”
Ai mới học Git cũng từng nghĩ:
“Ồ, chỉ là commit, push, pull thôi mà.”
Nghe đơn giản như pha mì.
Cho đến một ngày đẹp trời…
💀 git pull origin develop
Và màn hình hiện ra:
CONFLICT (content): Merge conflict in PaymentService.java
Automatic merge failed; fix conflicts and then commit the result.
Lúc đó bạn không còn là dev nữa. Bạn là nhà khảo cổ học, đang cố giải mã:
“Thằng nào sửa file này, sửa khi nào, và tại sao nó lại merge kiểu phạm pháp thế này?💀💀💀”
🤯 1. Git không sai. Con người dùng Git sai.
Git về bản chất rất mạnh.
Nhưng vấn đề là nhiều team dùng Git theo kiểu:
🚨 “Code trước đi rồi tính.”
Kết quả:
🌿 Branch A sửa auth
🌿 Branch B sửa auth
🌿 Branch C cũng sửa auth
🌿 Branch D hotfix auth
Cuối cùng:
Cây Git trông như gia phả hoàng tộc.
🍝 Triệu chứng của “Git mì Ý”
📌 Nhìn git log --graph mà tưởng biểu đồ chứng khoán:
* commit
|\
| * commit
| |\
* | | commit
|/ /
* /
📌 Merge commit nhiều như lá mùa thu:
“Merge branch develop into feature…”
“Merge branch feature into develop…”
“Merge nhầm xong merge lại…”
📌 Pull request dài hơn luận văn tốt nghiệp:
157 files changed
+4,832 / -3,901
Reviewer nhìn xong:
“CLGT” (củ lạc giòn tan)
(Vì không ai đủ can đảm đọc)
💣 2. Những bất cập kinh điển khi lịch sử Git chồng chéo
⚔️ A. Merge Conflict: Cuộc chiến không ai muốn nhưng ai cũng gặp
Kịch bản:
Bạn sửa UserService.java Đồng đội cũng sửa UserService.java
Git:
“Hai đứa tự xử đi.”
Kết quả:
<<<<<<< HEAD
validateUser();
=======
checkUserValidation();
>>>>>>> feature/update-user
Bạn nhìn 5 giây. Rồi nhìn trời 5 phút.
😵 Vấn đề:
Không biết giữ đoạn nào
Logic có thể gãy
Resolve sai = bug production
🧨 B. Cherry-pick bừa bãi
Nhiều team hotfix kiểu:
“Cherry-pick đại commit này sang release.”
Nghe nhanh.
Nhưng vài tuần sau:
Một bug… xuất hiện 3 lần ở 3 branch khác nhau.
🌀 C. Rebase sai cách
Rebase rất đẹp… nếu biết dùng.
Không biết dùng thì:
git rebase -i
xong force push.
Team:
😱 “Ủa lịch sử đâu?”
🔥 Chân lý:
Force push vào shared branch = chơi trò xóa ký ức đồng đội.
🏚️ D. Long-lived branch: Branch sống lâu hơn cả tình cũ
Feature branch tồn tại:
2 tuần… 1 tháng… 3 tháng…
Lúc merge:
Conflict nhiều hơn số red flag trong một mối quan hệ toxic.
🛠️ 3. Vì sao lịch sử Git team hay “toang”?
❌ Không có branching strategy
Mỗi người một kiểu:
- feature/login-new
- login_fix_final
- final_login_real
- final_login_real_v2
Nhìn branch list mà tưởng thư mục đồ án sinh viên.
❌ Commit message vô nghĩa:
fix
update
done
final
final_final
6 tháng sau cần audit:
“Fix cái gì cơ?”
❌ Merge develop liên tục vào feature
Cứ mỗi ngày:
“Thôi merge develop cho mới.”
Kết quả: Lịch sử branch rối như tai nghe trong túi quần.
🧭 4. Giải pháp để không sống trong Git Hell
🌱 A. Git Flow hoặc Trunk-Based rõ ràng
Option 1: Git Flow
- main
- develop
- feature/*
- release/*
- hotfix/*
Option 2: Trunk-Based
- main
- branch ngắn ngày
- merge nhanh
⚡ Cá nhân tôi:
Branch sống càng ngắn → đời càng bớt khổ.
📝 B. Commit message như người có học
❌ “fix bug”
✅ “fix(payment): resolve duplicate transaction validation”
🔍 C. Pull request nhỏ thôi
Đừng:
“Anh review giúp em 98 file.”
Hãy:
“Em tách auth riêng, payment riêng.”
Reviewer sẽ đỡ muốn bỏ nghề.
🧼 D. Rebase local trước khi push
git fetch origin
git rebase origin/develop
🚫 Nhưng nhớ:
Rebase local branch thôi.
Đừng rebase branch chung như một chiến binh liều mạng.
💥 5. Case study đau thương có thật
Team tôi từng có:
Một feature branch sống… gần 2 tháng.
Khi merge:
- 47 conflicts
- 3 người ngồi resolve
- 1 PM hoang mang
- 1 QA mất ngủ
Bài học:
Merge sớm, merge nhỏ, merge thường xuyên.
Git giống dọn phòng:
Để lâu quá… là không muốn dọn nữa.
🤖 6. AI có cứu được Git không?
Có.
Tôi dùng GPT để:
🧠 Giải thích conflict
🧹 Viết lại commit message
📚 Tóm tắt PR
🔍 Review risk trước merge
Ví dụ:
“Explain this merge conflict and suggest safest resolution.”
Nó không thay bạn quyết định… Nhưng đỡ cảm giác đang đọc mật mã.
🏁 Kết bài: Git là công cụ, đừng biến nó thành thảm họa
Git không đáng sợ.
Lịch sử Git lộn xộn mới đáng sợ.
📌 Từ trải nghiệm xương máu:
Branch ngắn thôi
Commit rõ thôi
PR nhỏ thôi
Rebase đúng thôi
🎯 Một câu chốt:
Code dở còn refactor được.
Git history nát… đôi khi chỉ muốn git reset --hard cả sự nghiệp.
😂 Bonus:
Nếu git log --graph của team bạn nhìn như sơ đồ đa cấp…
Có lẽ vấn đề không nằm ở Git.