Tình huống thực tế: Khi làm việc nhóm
Ở phần 1, mình đã chia sẻ về cách dùng Git để quản lý dự án cá nhân một cách gọn gàng, chuyên nghiệp. Nhưng Git không chỉ dành cho làm một mình – nó tỏa sáng khi làm việc nhóm 🌟
Bạn và team clone chung một repo, mỗi người làm một phần. Nhưng rồi một ngày, Git hét lên:
-
"Merge conflict!", hoặc "Push bị từ chối!"
-
Vậy thì... chuyện gì đang xảy ra?
-
Và làm sao để mỗi người đều có thể làm việc mượt mà, không “đụng hàng”?
Hãy cùng mình tìm hiểu trong phần 2 này nhé!
Chắc chắn bạn sẽ thấy Git “dễ nuốt” hơn nhiều đó 😄
Những chức năng Git cần biết khi làm việc nhóm
Chức năng | Mô tả | Ví dụ lệnh |
---|---|---|
Tạo branch mới | Tạo nhánh riêng cho từng tính năng hoặc người làm | git branch feature |
Chuyển sang nhánh khác | Làm việc trên nhánh vừa tạo hoặc nhánh người khác | git switch feature hoặc git checkout feature |
Tạo + chuyển nhánh | Tạo nhánh mới và chuyển sang luôn | git checkout -b feature |
Đẩy nhánh lên remote | Cho mọi người cùng thấy nhánh bạn đang làm | git push -u origin feature |
Lấy thay đổi mới nhất | Cập nhật code mới từ nhóm để tránh bị lệch nhánh | git pull |
Hợp nhất nhánh (merge) | Kết hợp code từ nhánh này sang nhánh khác | git merge feature |
Kiểm tra log nhánh | Xem lịch sử commit theo nhánh | git log --oneline --graph --all --decorate |
Hiển thị nhánh từ remote | Kiểm tra các nhánh đang có trên GitHub | git branch -r |
Xử lý xung đột (conflict) | Khi 2 người sửa 1 dòng – Git yêu cầu bạn chọn bên nào giữ | (sửa file, rồi git add . , git commit ) |
Dọn dẹp thay đổi tạm thời | Khi chưa xong việc nhưng cần đổi nhánh | git stash / git stash pop |
Reset lại về trạng thái gốc | Quay lại commit cũ hoặc huỷ thay đổi tạm thời (cẩn thận nha!) | git reset --hard HEAD~1 hoặc git restore . |
📌 Lưu ý nhỏ nè
Trong bảng trên, mình chỉ liệt kê những chức năng cơ bản và hay gặp nhất khi làm việc nhóm với Git. Ở các phần sau, mình sẽ giải thích kỹ từng chức năng qua các tình huống thực tế, nên bạn không cần nhớ hết ngay đâu 😄
Cứ lưu lại bảng này, và khi gặp rắc rối trong lúc dùng Git thì mở ra đối chiếu, đảm bảo sẽ “gỡ rối” nhanh chóng!
Tình huống team nhỏ làm project môn học
Bối cảnh
Bạn và 2 người bạn nữa bắt đầu một project (ví dụ: làm web bán hàng).
Mọi người chia nhau làm:
-
Nam: phần trang chủ
-
Minh: phần thanh toán
-
Trang: phần liên hệ
Bạn setup GitHub, push code lần đầu, gửi link repo:
➡️ “Mọi người clone repo này về làm nha!”
🔄 Quy trình làm việc ban đầu:
Thay vì mỗi người sửa trực tiếp trên nhánh main, ta sẽ:
-
Tạo nhánh riêng cho từng người
-
Làm việc độc lập trên nhánh đó
-
Merge lại sau khi hoàn thành
Hình minh hoạ cách hoạt động cơ bản
Các Bước để bắt đầu làm dự án
Bước 1: Tạo nhánh riêng
Giả sử bạn tên Nam:
git checkout -b home
Sau khi tạo git bash sẽ tự động chuyển qua nhánh bạn mới tạo như sau:
Tương tự, Minh và Trang cũng tạo nhánh:
git checkout -b payment
git checkout -b contact
Bạn có thể đẩy nhánh lên GitHub
git push -u origin home
Sau khi tạo nhánh và push code thành công, bạn có thể lên GitHub để xem các nhánh đang tồn tại trong repo:
Việc này giúp:
- Bạn có thể kiểm tra lại nhánh mình đã đẩy lên chưa
- Các thành viên khác có thể theo dõi tiến độ hoặc trạng thái code của bạn
- Dễ dàng tạo Pull Request khi muốn merge vào main
Trước khi bắt đầu code mỗi ngày, hãy
pull
từmain
về trước để cập nhật những thay đổi mới nhất từ các thành viên khác. Điều này giúp tránh xung đột khi merge sau này nhé!
Bước 2: Làm việc trên nhánh của mình
Bạn commit các thay đổi bình thường:
git add .
git commit -m "Thêm UI trang chủ"
git push
Bước 3: Merge nhánh vào main
Cách 1: Merge bằng Git (local)
Thường dùng khi bạn làm solo hoặc team nhỏ không cần xét duyệt.
# Quay lại nhánh chính
git checkout main # Kéo code mới nhất từ remote về
git pull # Merge nhánh bạn đang làm vào main
git merge ten-nhanh-cua-ban # Đẩy lên GitHub
git push
Cách 2: Tạo Pull Request (PR) trên GitHub
Dùng khi làm việc nhóm có người review và approve trước khi merge.
Khi hoàn thành, đẩy code lên nhánh cá nhân:
git add .
git commit -m "Thêm UI trang chủ"
git push
- Vào repo trên GitHub → Chọn “Compare & pull request”.
- Viết mô tả ngắn gọn → nhấn “Create pull request”.
- Người quản lý sẽ review và Merge.
PR giúp người khác kiểm tra trước khi code được gộp vào main. Rất hữu ích khi làm team!
Lưu ý (quan trọng nhắc lại 3 lần 😄):
- Mỗi người làm 1 nhánh riêng → giảm nguy cơ đụng độ
- Đừng làm việc trực tiếp trên main
- Khi merge, luôn pull về trước, test rồi mới push
Merge Conflict – Khi làm nhóm không tránh khỏi!
Khi nhiều người cùng làm trên một project Git, conflict là "chuyện thường ở huyện". Quan trọng là bạn biết xử lý đúng cách.
Các lỗi Merge Conflict thường gặp
Tên lỗi | Nguyên nhân | Cách nhận biết |
---|---|---|
Chỉnh cùng 1 file | Hai người sửa cùng một file | Git báo Merge conflict in ... |
Chỉnh cùng một dòng | Hai người sửa cùng dòng code | Xuất hiện <<<<<<< HEAD , ======= , >>>>>>> |
Chưa pull trước khi push | Bạn push lên mà không pull về trước | Git báo lỗi rejected - remote contains work |
Tự merge sai nhánh | Lỡ merge nhánh sai, không đúng quy trình | PR sai nhánh hoặc code không mong muốn |
Không tạo PR (merge tay) | Tự merge trực tiếp trên main, không qua review | Không ai biết bạn đã merge gì 😓 |
Xung đột khi 2 người sửa cùng 1 file và cùng 1 dòng
Giả sử bạn đang làm nhóm, có 2 người cùng chỉnh sửa file test.py ở cùng một dòng.
Bối cảnh
-
Bạn Nam tạo ra file
test.py
với nội dung:print("test")
Sau đó Nam merge nhánh của mình vào
main
. -
Bạn Minh cũng chỉnh sửa đúng dòng đó, đổi thành:
print("test hello")
Khi Minh merge nhánh vào main, Git báo lỗi merge conflict:
CONFLICT (content): Merge conflict in test.py Automatic merge failed; fix conflicts and then commit the result.
Trạng thái Git lúc này
Trên Git Bash sẽ hiển thị bạn đang ở trạng thái đặc biệt:
(main|MERGING)
Cách xử lý merge conflict
-
Mở file
test.py
lên (bằng VSCode, nano, Notepad...)Bạn sẽ thấy Git tự động chèn các dấu mốc để bạn chọn phần cần giữ lại:
<<<<<<< HEAD print("test") ======= print("test hello") >>>>>>> Minh
Trong đó:
- HEAD là phiên bản hiện tại trên nhánh main
- Minh là phần thay đổi từ nhánh của bạn Minh
-
Chọn đoạn bạn muốn giữ lại, có thể:
Giữ nguyên
print("test")
hoặc giữ lại thay đổi của Minhprint("test hello")
Hoặc thay đổi toàn bộ thành nội dung mới như:
print("Xin chào các bạn")
-
Lưu file lại
Báo với Git rằng bạn đã giải quyết xong
git add test.py
Git hiểu rằng bạn đã xử lý xung đột trong file này.
Commit lại để hoàn tất merge
git commit -m "Resolved merge conflict in test.py"
🎉 Xong! Bạn đã hoàn tất quá trình xử lý merge conflict.
Chưa pull trước khi push
Đây là lỗi phổ biến khi làm việc nhóm:
Bạn làm việc trực tiếp trên nhánh main
hoặc bất kỳ nhánh nào, chưa pull code mới nhất về, mà đã vội push
lên lại → Git từ chối ngay!
Lỗi được thông báo tương tự như:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/your-repo.git'
hint: Updates were rejected because the remote contains work that you do
not have locally. This is usually caused by another repository pushing
to the same ref. You may want to first integrate the remote changes
(e.g., 'git pull ...') before pushing again.
Đơn giản bạn chỉ cần pull code mới nhất từ GitHub về sẽ xử lý được nhé!
git pull
💡 Ghi nhớ nguyên tắc vàng
"Luôn git pull trước khi git push!"
Đặc biệt là khi làm việc trực tiếp trên nhánh chính (main, dev,...)
Hướng dẫn Tạo PR và Xử lý Conflict trực tiếp trên GitHub Web
Tình huống:
Bạn đang làm việc trên nhánh home
- Muốn merge vào
main
- Nhưng có người khác đã merge thay đổi lên
main
trước đó - Dẫn đến xung đột khi bạn tạo PR
Bước 1: Push code lên nhánh riêng (đã làm ở local)
Khi bạn đã làm xong chức năng của nhánh mình và push lên Github
git push
Bước 2: Tạo Pull Request (PR)
-
Lên GitHub → vào repo
-
GitHub sẽ hiển thị gợi ý: "Compare & pull request" → Nhấn vào đó
-
Kiểm tra lại phần base: main ← compare: nam-ui (Bạn đang muốn merge nhánh nào thì kiểm tra xem đúng nhánh mình muốn merge vào
main
chưa nhé) -
Viết mô tả ngắn:
VD: Thêm giao diện UI cho phần đặt hàng
-
Nhấn Create pull request
Bước 3: Phát hiện Conflict (nếu có)
GitHub sẽ báo:
⚠️ This branch has conflicts that must be resolved
Bước 4: Xử lý Conflict trực tiếp trên web
-
Nhấn vào nút
Resolve conflicts
-
GitHub sẽ hiển thị file bị xung đột với đoạn như sau:
<<<<<<< main print("test") ======= print("test hello") >>>>>>> minh-ui
-
Bạn sửa lại đoạn code theo mong muốn và nhấn
Mark as resolved
-
Nhấn
Commit merge
Bước 5: Merge PR
Khi xung đột được xử lý → PR sẽ chuyển sang trạng thái “Ready to merge”
Người quản lý hoặc bạn (nếu có quyền) có thể nhấn Merge pull request
💡 Ghi nhớ:
Xử lý conflict trên GitHub Web phù hợp với nhóm nhỏ, người mới
Giúp mọi người xem rõ phần bị trùng → dễ thảo luận
Nếu bạn lỡ sửa sai, có thể nhấn “Revert changes” dễ dàng
Lời cảm ơn
Cảm ơn bạn đã theo dõi đến cuối phần 2 của series "Git cho người mới bắt đầu". Việc làm chủ thao tác merge và xử lý xung đột (conflict) sẽ giúp bạn tự tin hơn rất nhiều khi làm việc nhóm trên GitHub, đặc biệt trong các dự án thực tế. Hy vọng các ví dụ minh họa và hướng dẫn từng bước đã giúp bạn dễ hình dung hơn.
Nếu bạn thấy bài viết hữu ích, đừng ngần ngại chia sẻ với bạn bè hoặc đồng nghiệp nhé! Và đừng quên theo dõi Phần 3 (6/8/2025), nơi mình sẽ chia sẻ thêm về rebase, cách viết commit chuẩn khi làm việc nhóm và một số mẹo nâng cao để bạn trở thành "pro Git" trong mắt đồng đội!
Mình là Nam – một sinh viên đam mê công nghệ, luôn tìm tòi và học hỏi những kiến thức mới, Cảm ơn bạn đã theo dõi đến đây, và hẹn gặp lại ở phần tiếp theo nhé! 💻✨