Git fetch là gì? Phân biệt git fetch và git pull

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 fetchgit 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 fetchgit 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é!

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 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 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 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, 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é!

Nếu bạn quan tâm, hãy xem các vị trí đang tuyển dụng của Got It tại: bit.ly/gotit-hanoi và đọc thêm về quy trình tuyển dụng tại đây.

https://d1iv5z3ivlqga1.cloudfront.net/wp-content/uploads/2021/04/29235048/1_QAG9RXQyyMAY7i9OYo84FA.png
Got It Vietnam
October 29, 2021
Share this post to:
Tags:
0 Comments
Inline Feedbacks
View all comments
Các bài viết liên quan
Hướng dẫn chi tiết cách push code lên Git

Hướng dẫn chi tiết cách push code lên Git

Có lẽ các bạn theo đuổi lĩnh vực IT đã quen thuộc với Git và GitHub rồi đúng không nhỉ? Tuy nhiên, Got It nhận thấy, một vài bạn đọc theo dõi blog vẫn còn mơ hồ, hoặc chưa biết cách để push code lên Git. Vậy thì hôm nay, chúng mình sẽ mang đến […]
Hướng dẫn cách tạo branch trong Git

Hướng dẫn cách tạo branch trong Git

Làm việc trực tiếp trong branch (nhánh) chính của một repository trên GitHub sẽ vô cùng nguy hiểm. Bởi lẽ, bạn sẽ có nguy cơ đưa những dòng code lỗi (bug) vào project đó mà không thông qua việc review code. Vì vậy, để tránh điều này xảy ra, bạn nên tạo một branch mới […]
Readable Code

Readable Code

Tác giả: Minh (Software Engineer, CAI) & Hương (TPM, CAI) Mục lục1. Readable code là gì?2. Làm thế nào để viết code dễ đọc?2.1. Style guide2.2. Viết function nhỏ, tập trung vào một tính năng2.3. Đặt tên hợp lý2.3.1. Dùng các tiền tố thích hợp để phân loại function2.3.2. Hạn chế thêm thông tin về […]
Git fetch là gì? Phân biệt git fetch và git pull

Git fetch là gì? Phân biệt git fetch và git pull

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 […]
Git và GitHub — liệu bạn đã thật sự biết cách sử dụng?

Git và GitHub — liệu bạn đã thật sự biết cách sử dụng?

Biến Git và GitHub trở thành công cụ đắc lực cùng Software Engineer nhà Got It!
Git Pull là gì? Mô hình hoạt động của lệnh Git Pull

Git Pull là gì? Mô hình hoạt động của lệnh Git Pull

Vì lệnh Git Fetch và Git Merge được sử dụng thường xuyên nên Git đã kết hợp hai lệnh này thành một lệnh đặc biệt gọi là Git Pull. Vậy Git Pull là gì? Nó được sử dụng như thế nào? Trong bài viết này, Got It sẽ mang đến cho các bạn một cái […]