Khi làm việc với Git, chúng ta sẽ thường xuyên sử dụng các câu lệnh “git fetch” và “git pull” để cập nhập data từ Git remote repository xuống Git local repository. Vậy sự khác nhau của 2 câu lênh này là gì, chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ nói về “git fetch” trước.
Câu lệnh mà chúng ta thường dùng với “git fetch” đó là “git fetch origin”. Sử dụng câu lệnh này, các bạn có thể cập nhập thông tin mới nhất từ Git remote repository. Nhưng thông tin ở đây không có nghĩa là toàn bộ data từ Git remote repository đâu các bạn, nó chỉ là thông tin metadata ví dụ như Git remote repository của chúng ta có những branch nào, có những thay đổi nào từ Git remote repository mà chúng ta chưa cập nhập về Git local repository hay không? Nó chỉ cập nhập những thông tin đó, chứ không làm thay đổi, đồng bộ Git local repository với Git remote repository.
Còn “git pull” thì sao?
Chúng ta thường sử dụng câu lệnh “git pull origin <branch_name>” để cập nhập những thay đổi của source code trong branch mà chúng ta đang làm việc. Nó sẽ cập nhập tất cả những thay đổi đó về Git local repository chứ không như câu lệnh “git fetch”, chỉ cập nhập metadata, không cập nhập source code.
Bởi vì lẽ đó nên sử dụng “git pull”, chúng ta hay gặp 1 vấn đề gọi la conflict source code. Nguyên nhân là vì đoạn code mà chúng ta thay đổi ở Git local repository, có người cũng thay đổi trên Git remote repository, cập nhập về thì Git không biết phải chọn đoạn code nào để mà merge.
Để mọi người thấy rõ sự khác biệt này, mình sẽ làm một ví dụ như sau:
Mình có một repository tên là “test” trên Bitbucket như sau.
Trên máy của mình:
Bây giờ giả sử mình tạo mới branch test-git trên Bitbucket:
Sau đó sử dụng command “git pull origin master”, rồi “git checkout test-git” để switch qua branch test-git mà mình mới tạo ở trên, các bạn sẽ thấy lỗi như sau:
Thế nhưng, nếu mình sử dụng câu lệnh “git fetch origin” rồi “git checkout test-git”, các bạn sẽ thấy kết quả như sau: