Push, pull, fetch: đồng bộ code với GitHub
📚 Git & GitHub Series (Bài 8/15) — Đã có repository GitHub ở Bài 7, giờ ta học bộ ba đồng bộ, bắt đầu bằng git push.
Git push, pull và fetch là ba lệnh bạn dùng mỗi ngày để đồng bộ code giữa máy cá nhân và GitHub. Hiểu rõ sự khác biệt giữa chúng giúp bạn tránh hai nỗi sợ lớn nhất của người mới: ghi đè mất việc của người khác, và "kẹt" không push được. Bài này giải thích từng lệnh kèm luồng làm việc an toàn.
Bức tranh tổng thể
Sau khi đã kết nối remote ở Bài 6, việc đồng bộ diễn ra theo hai chiều:
- Lên remote:
git push— đẩy commit của bạn lên GitHub. - Về máy:
git fetchvàgit pull— lấy thay đổi của người khác về.
Hãy hình dung remote là "bảng tin chung", còn máy bạn là "bản nháp riêng". Bạn push để đăng lên bảng tin, pull để cập nhật những gì người khác đã đăng.
git push — đẩy commit lên GitHub
git push -u origin main
Lần đầu, tham số -u (viết tắt của --set-upstream) thiết lập nhánh main local theo dõi origin/main. Từ lần sau, bạn chỉ cần:
git push
Theo tài liệu git push, lệnh này chỉ đẩy các commit đã có trên máy — nên nhớ luôn git commit trước khi push.
git fetch — xem trước, chưa gộp
git fetch tải về mọi commit, nhánh mới từ remote, nhưng không đụng vào nhánh làm việc của bạn:
git fetch origin
git log origin/main --oneline
Sau fetch, bạn có thể xem origin/main đã đi tới đâu trước khi quyết định gộp. Đây là cách an toàn nhất để biết người khác đã làm gì.
git pull — fetch rồi merge
git pull là tổ hợp của hai bước: fetch về rồi merge ngay vào nhánh hiện tại:
git pull origin main
Tiện lợi, nhưng vì gộp ngay nên có thể phát sinh conflict cần xử lý (kỹ năng đã học ở Bài 5). Một số người thích git pull --rebase để giữ lịch sử thẳng — chủ đề của Bài 10 về rebase.
So sánh nhanh ba lệnh
| Lệnh | Tải về remote? | Thay đổi nhánh local? |
|---|---|---|
git fetch | Có | Không |
git pull | Có | Có (merge ngay) |
git push | Ngược lại (đẩy lên) | Không (đổi remote) |
Luồng làm việc an toàn hằng ngày
Để tránh xung đột và ghi đè, hãy theo nhịp này:
git pullđầu buổi để cập nhật mới nhất.- Tạo nhánh tính năng, làm việc, commit.
git pull(hoặc fetch) lần nữa trước khi push nếu làm lâu.git pushđể đẩy lên.- Mở Pull Request (Bài 9) thay vì push thẳng
main.
Đây cũng đúng nguyên tắc của blog này: mọi thay đổi đi qua nhánh và Pull Request, không push trực tiếp lên main.
Xử lý khi push bị từ chối
Thông báo ! [rejected] ... (fetch first) nghĩa là remote có commit mới hơn. Cách xử lý đúng:
git pull --no-rebase origin main
git push
⚠️ Tránh
git push --forcetrừ khi bạn thật sự hiểu — nó ghi đè lịch sử remote và có thể xóa việc của người khác. Nếu buộc phải force, hãy ưu tiên--force-with-leasean toàn hơn.
Theo dõi nhánh (tracking branch) là gì?
Khi bạn chạy git push -u origin main, Git ghi nhớ rằng nhánh main local "theo dõi" origin/main. Nhờ vậy:
git statuscho biết bạn đang đi trước (ahead) hay đi sau (behind) remote bao nhiêu commit.git pushvàgit pullkhông cần nêu lại tên remote và nhánh.
Bạn có thể xem quan hệ theo dõi bằng git branch -vv. Mỗi nhánh local có thể theo dõi một nhánh remote tương ứng, giúp Git biết đẩy đi đâu và kéo từ đâu — bớt gõ và bớt nhầm.
Tóm lại
Bộ ba git push / pull / fetch là nhịp tim của làm việc với GitHub: push đẩy việc của bạn lên, fetch xem trước thay đổi của người khác, pull tải và gộp. Quy tắc vàng cho người mới: pull trước khi push, và đừng force khi chưa hiểu.
Ở Bài 9, chúng ta học quy trình cộng tác chuẩn của GitHub: Pull Request và cách review code — trái tim của làm việc nhóm hiện đại.
Tham khảo & Nguồn dữ liệu
1. Liên kết bên ngoài được sử dụng trong bài viết
2. Liên kết nội bộ liên quan
3. Bản quyền & Ghi nguồn
Một phần dữ liệu trong bài viết được tham khảo từ tài liệu git push. Mọi thương hiệu, tên sản phẩm và tài liệu gốc thuộc quyền sở hữu của chủ sở hữu tương ứng. Bài viết chỉ trích dẫn, tổng hợp và phân tích — không nhằm thay thế tài liệu chính thức.
Câu hỏi thường gặp
git fetch và git pull khác nhau thế nào?
Lệnh git push dùng để làm gì?
Vì sao push bị từ chối (rejected)?
💬 BÌNH LUẬN
Đăng nhập GitHub để comment. Hỗ trợ markdown, reaction, reply.