Rất nhiều các bạn đang làm việc trong lĩnh vực IT thắc mắc về cách phân biệt giữa git fetch
và git pull
. Vậy git fetch là gì? Câu lệnh này hoạt động như thế nào? Và đâu là sự khác biệt giữa hai lệnh git fetch
và git pull
? Hãy cùng Got It tìm lời giải đáp cho những câu hỏi trên ở bài viết này nhé!
Mục lục
1. Lệnh git fetch là gì?
Lệnh git fetch
là một câu 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, các file, refs). Hiểu một cách đơ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 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 chúng với Local repository. Với git fetch
, bạn có thể theo dõi các commit 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 là gì?
Trong quá trình làm việc với git, nhiều engineer hay bị rối và nhầm lẫn hai lệnh git fetch
và git 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 này 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 để merge commit cho remote content mới. Nếu bạn có các thay đổi đang chờ xử lý, điều này có thể vô tình khiến local repository rơi vào trạng thái xung đột.
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 đã cam kết).
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. Sau đây là một ví dụ về đầu ra git branch
với một số demo tên branch.
git branch
main
feature1
debug2
Kiểm tra nội dung của thư mục /.git/refs/heads/ sẽ cho thấy kết quả tương tự.
ls ./.git/refs/heads/
main
feature1
debug2
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/. Đoạn code ví dụ tiếp theo hiển thị các branch bạn có thể thấy sau khi fetching một remote repository có tên là remote-repo:
git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature
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. 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 checkout
và git 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, sau đó hợp nhất. Lệnh git pull
là một phím tắt thuận tiện cho quá trình này.
4. Git fetch commands and options
git fetch <remote>
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ộ hoá 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 của kho lưu trữ trung tâm.
git fetch origin
Điều này sẽ hiển thị các branch đã được tải xuống:
a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature
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.
Để 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 --oneline main..origin/main
Để 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 log origin/main
Sau đó, chúng ta sẽ sử dụng git merge origin/main:
git merge origin/main
Origin/Main và main 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à một bức tranh tổng quan về lệnh về Git Fetch trong Git. Hy vọng bài viết này sẽ giúp các 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é!