Git Fetch Là Gì? Phân Biệt Git Fetch và Git Pull Chi Tiết Nhất

Rất nhiều bạn làm việc trong lĩnh vực IT thắc mắc về cách phân biệt giữa git fetchgit pull. Vậy git fetch là gì? Câu lệnh này hoạt động như thế nào? Và sự khác biệt giữa hai lệnh này là gì? Hãy cùng tìm hiểu chi tiết trong bài viết này.

1. Lệnh Git Fetch Là Gì?

Lệnh git fetch là một lệnh của Git, được sử dụng để tải xuống các nội dung từ remote repository mà không làm thay đổi trạng thái của local repository (các dữ liệu như commit, file, refs).

Hiểu đơn giản, khi bạn thực hiện lệnh git fetch, Git sẽ thu thập và lưu trữ những thay đổi mới nhất từ các branch của remote repository về máy tính của bạn, nhưng không hợp nhất (merge) chúng vào local repository. Với git fetch, bạn có thể theo dõi các commit mà người khác đã cập nhật lên server, đồng thời nắm bắt được những thông tin khác nhau giữa remote và local.

2. Sự Khác Biệt Giữa Git Pull và Git Fetch

Trong quá trình làm việc với Git, nhiều kỹ sư phần mềm (engineer) hay bị rối và nhầm lẫn hai lệnh git fetchgit pull, bởi cả hai đều được sử dụng để tải về remote content. Tuy nhiên, git fetch được coi là phiên bản “an toàn” hơn của git pull.

Khi sử dụng, lệnh git fetch sẽ tải xuống remote content mà không cập nhật trạng thái hoạt động của local repository. Từ đó, nội dung công việc hiện tại của bạn không bị ảnh hưởng.

Ngược lại, lệnh git pull sẽ tải xuống remote content và ngay lập tức thực hiện git merge để hợp nhất commit cho remote content mới. Nếu bạn có các thay đổi đang chờ xử lý (pending changes), điều này có thể vô tình khiến local repository rơi vào trạng thái xung đột (conflict).

Ngoài ra, git fetch thường được dùng trong trường hợp có nhiều người làm việc trên cùng một nhánh. Còn git pull chỉ nên sử dụng khi có một người làm việc trên nhánh để hạn chế xung đột. Bạn chỉ nên dùng lệnh git pull trên một thư mục làm việc sạch (không có thay đổi đã commit).

3. Cách Hoạt Động Của Git Fetch Với Remote Branch

Để hiểu rõ hơn về cách hoạt động của git fetch, chúng ta cùng tìm hiểu về cách Git tổ chức và lưu trữ các commit. Trong thư mục /.git/objects của kho lưu trữ, Git lưu trữ tất cả các commit, local và remote. Git giữ các remote branch commit và local branch commit tách biệt rõ ràng thông qua việc sử dụng các branch ref. Ref cho các local branch được lưu trữ trong /.git/refs/heads/. Khi thực thi lệnh git branch, hệ thống sẽ xuất ra danh sách các local branch refs.

Kiểm tra nội dung của thư mục /.git/refs/heads/ sẽ cho thấy kết quả tương tự.

Các remote branch cũng giống như các local branch, ngoại trừ chúng ánh xạ tới các commit từ kho lưu trữ của người khác. Các remote branch có tiền tố là remote mà chúng thuộc về để bạn không trộn chúng với các local branch. Giống như các local branches, Git cũng có refs cho các remote branch. Các remote branch refs có trong thư mục /.git/refs/remotes/.

Output này hiển thị các local branch mà chúng ta đã kiểm tra trước đây với tiền tố là origin/. Ngoài ra, chúng ta thấy các remote branch có tiền tố là remote-repo. Bạn có thể kiểm tra một remote branch giống như một local branch, nhưng điều này sẽ đặt bạn vào trạng thái Detached HEAD (giống như kiểm tra một commit cũ). Bạn có thể coi chúng như các branch chỉ đọc (read-only). Bên cạnh đó, để xem các nhánh từ xa của bạn, chỉ cần chuyển r-flag vào lệnh git branch.

Bạn có thể kiểm tra các remote branch bằng các lệnh git checkoutgit log thông thường. Nếu bạn chấp nhận những thay đổi của một remote branch, bạn có thể hợp nhất nó thành một local branch bằng cách merge git bình thường. Vì vậy, không giống như SVN, đồng bộ hóa kho lưu trữ cục bộ của bạn với một kho lưu trữ từ xa thực sự là một quá trình gồm hai bước: tìm nạp (fetch), sau đó hợp nhất (merge). Lệnh git pull là một phím tắt thuận tiện cho quá trình này.

4. Các Lệnh và Tùy Chọn Git Fetch

Dưới đây là một số lệnh git fetch phổ biến và các tùy chọn đi kèm:

  • git fetch: Tìm nạp tất cả các branch từ kho lưu trữ. Điều này cũng tải xuống tất cả các commit và tệp được yêu cầu từ kho lưu trữ khác.
  • git fetch <remote> <branch>: Tương tự như lệnh trên, nhưng chỉ tìm nạp những branch được chỉ định.
  • git fetch --all: Tìm nạp tất cả các remote đã đăng ký và các branch của chúng.
  • git fetch -dry-run: Tùy chọn -dry-run sẽ thực hiện chạy thử lệnh. Nó sẽ xuất ra các ví dụ về các hành động mà nó sẽ thực hiện trong quá trình tìm nạp nhưng không áp dụng chúng.

5. Đồng Bộ Hóa Nguồn Gốc Với Git Fetch

Ví dụ sau hướng dẫn quy trình đồng bộ hóa local repository của bạn với branch chính (main hoặc master) của kho lưu trữ trung tâm.

  1. Thực hiện lệnh git fetch origin:

    Lệnh này sẽ tải xuống tất cả các thay đổi từ remote repository có tên origin (thường là remote repository mặc định).

    git fetch origin

    Điều này sẽ hiển thị các branch đã được tải xuống:

    remote: Enumerating objects: 14, done.
    remote: Counting objects: 100% (14/14), done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 9 (delta 6), reused 9 (delta 6), pack-reused 0
    Unpacking objects: 100% (9/9), 748 bytes | 0 bytes/s, done.
    From https://github.com/user/repo
       1234567..890abcd  main     -> origin/main

    Các commit từ các remote branch mới này được hiển thị dưới dạng hình vuông thay vì hình tròn trong sơ đồ bên dưới. Như bạn có thể thấy, git fetch cho phép bạn truy cập vào toàn bộ branch structure của một kho lưu trữ khác.

  2. Kiểm tra các commit mới:

    Để xem những commit nào đã được thêm vào upstream main, bạn có thể chạy git log sử dụng origin/main làm filter:

    git log origin/main
  3. Hợp nhất các thay đổi:

    Để phê duyệt các thay đổi và hợp nhất chúng vào local main branch của bạn, hãy sử dụng các lệnh sau:

    git checkout main
    git merge origin/main

    Sau đó, chúng ta sẽ sử dụng git merge origin/main:

    Updating 1234567..890abcd
    Fast-forward
     file1.txt | 1 +
     1 file changed, 1 insertion(+)

    origin/mainmain branch hiện trỏ đến cùng một commit và được đồng bộ hóa với các phát triển ngược dòng.

Trên đây là tổng quan về lệnh Git Fetch trong Git. Hy vọng bài viết này sẽ giúp bạn hiểu rõ khái niệm Git Fetch là gì và cách hoạt động của Git Fetch. Nếu bạn muốn trở thành một lập trình viên, hãy khám phá Git Fetch ngay nhé!