- vừa được xem lúc

GitHub 1001 cho sinh viên IT: Dễ Như Ăn Phở – Dù Làm Một Mình Hay Làm Nhóm (P2)

0 0 1

Người đăng: Nam Trần

Theo Viblo Asia

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:

  1. Bạn có thể kiểm tra lại nhánh mình đã đẩy lên chưa
  2. 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
  3. 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
  1. Vào repo trên GitHub → Chọn “Compare & pull request”.
  2. Viết mô tả ngắn gọn → nhấn “Create pull request”.
  3. 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 😄):

  1. Mỗi người làm 1 nhánh riêng → giảm nguy cơ đụng độ
  2. Đừng làm việc trực tiếp trên main
  3. 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

  1. 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 đó:

    1. HEAD là phiên bản hiện tại trên nhánh main
    2. Minh là phần thay đổi từ nhánh của bạn Minh
  2. 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 Minh print("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")
    
  3. 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)

  1. Lên GitHub → vào repo

  2. GitHub sẽ hiển thị gợi ý: "Compare & pull request" → Nhấn vào đó

  3. 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é)

  4. Viết mô tả ngắn:

    VD: Thêm giao diện UI cho phần đặt hàng

  5. 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

  1. Nhấn vào nút Resolve conflicts

  2. GitHub sẽ hiển thị file bị xung đột với đoạn như sau:

    <<<<<<< main
    print("test")
    =======
    print("test hello")
    >>>>>>> minh-ui
    
  3. Bạn sửa lại đoạn code theo mong muốn và nhấn Mark as resolved

  4. 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 mergexử 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é! 💻✨

Bình luận

Bài viết tương tự

- vừa được xem lúc

[CSS]: max(), min(), clamp(): when the size is no longer fixed

Chào mọi người, hôm nay mình xin phép được chia sẻ về 3 hàm tính toán đặc biệt trong CSS mà mình vừa mới được học, và có lẽ là 1 trong những hàm mà mình thích nhất . Là một Front-End dev, đặc biệt trong bối cảnh mobile first hiện tại, responsive không còn là 1 điều quá xa lạ, và hiển nhiên những sản

0 0 48

- vừa được xem lúc

VUEJS: Import and Preview Image

Chào mọi người. Hôm nay, mình lại tiếp tục chia sẻ cho các bạn một số ít hiểu biết của mình về VueJS thông qua phương pháp Preview Image.

0 0 43

- vừa được xem lúc

Doanh nghiệp không trả lương tương xứng cho giá trị của nhân viên

Việc deal lương khi phỏng vấn luôn là một vấn đề cực kì nhạy cảm của tất cả ngành nghề. Bản thân mình lúc nào cũng suy nghĩ tại sao các công ty không public lương lậu ở trên JD luôn (có một số nơi làm

0 0 38

- vừa được xem lúc

Từ điển IT - P1: UI, GUI, CLI và API

̂́ ̣ ̀ ̣̂ ℎ ̂ ̀ℎ ℎ̛ ́ ℎ̂̀ ℎ ℎ̣̂, ℎ ̀ ̣̂ ̣̂ ̀ℎ ̂ ̛́ ̛̛́ ℎ̂ ̀ ̀ℎ, ̣ “̉ ” ℎ ℎ ́ ℎ ̀ℎ đ̂̉, ℎ đ̣ ̀ ̣̂ ̃ ℎ̣̂? ̣̆ đ̛ ̉ ̣ ̂́ ℎ̂̉ ℎ̛ ̂̀ ́ ℎ́ ̣̂ ?... ̀ ̀ℎ ℎ ̣! Đ̂ ̀ ̣ ̀ ̂́ ̆́ ̀ℎ ̃ ̉ ℎ́ℎ ́ ℎ̣̂ ̛̃ ̣̂ ́ℎ ̂̀ ̃

0 0 34

- vừa được xem lúc

Tìm Hiểu Mô Hình MVC Dành Cho Người Mới Bắt Đầu: Cấu Trúc và Ví Dụ

Mô Hình MVC Là Gì. Mô Hình MVC Bao Gồm Ba Thành Phần Chính:. 1. Model: Là thành phần chịu trách nhiệm xử lý dữ liệu và logic nghiệp vụ.

0 0 13

- vừa được xem lúc

GitHub 1001 cho sinh viên IT: Dễ Như Ăn Phở – Dù Làm Một Mình Hay Làm Nhóm (P1)

Tại sao mình lại viết Blog này. Vì vậy mình viết blog này như một cuốn sổ tay GitHub mini – chia sẻ lại những kinh nghiệm mình rút ra được trong quá trình học, làm việc nhóm, và làm dự án cá nhân.

0 0 1