it-swarm-vi.com

Sự khác biệt giữa 'git pull' và 'git fetch' là gì?

Người điều hành Lưu ý: Cho rằng câu hỏi này đã có sáu mươi bảy câu trả lời được đăng lên nó (một số trong số chúng đã bị xóa), xem xét liệu bạn cóđóng góp bất cứ điều gì mớitrước đăng một cái khác.

Sự khác biệt giữa git pullgit fetch là gì?

10728
pupeno

Trong các điều khoản đơn giản nhất, git pull thực hiện git fetch theo sau là git merge.

Bạn có thể thực hiện git fetch bất cứ lúc nào để cập nhật các nhánh theo dõi từ xa của mình trong refs/remotes/<remote>/.

Hoạt động này không bao giờ thay đổi bất kỳ chi nhánh địa phương nào của bạn trong refs/heads và an toàn để thực hiện mà không thay đổi bản sao làm việc của bạn. Tôi thậm chí đã nghe nói về những người chạy git fetch định kỳ trong một công việc định kỳ ở chế độ nền (mặc dù tôi không khuyên bạn nên làm điều này).

git pull là những gì bạn sẽ làm để đưa một chi nhánh địa phương cập nhật với phiên bản từ xa của nó, đồng thời cập nhật các chi nhánh theo dõi từ xa khác của bạn.

Tài liệu Git: git kéo

8962
Greg Hewgill
  • Khi bạn sử dụng pull, Git sẽ cố gắng tự động thực hiện công việc cho bạn. Nó rất nhạy cảm với bối cảnh , vì vậy Git sẽ tự động hợp nhất mọi cam kết được kéo vào nhánh mà bạn hiện đang làm việc. pull hợp nhất các cam kết mà không cho phép bạn xem xét chúng trước . Nếu bạn không quản lý chặt chẽ các chi nhánh của mình, bạn có thể gặp phải những xung đột thường xuyên.

  • Khi bạn fetch, Git thu thập bất kỳ cam kết nào từ nhánh mục tiêu không tồn tại trong nhánh hiện tại của bạn và lưu trữ chúng trong kho lưu trữ cục bộ của bạn . Tuy nhiên, nó không hợp nhất chúng với nhánh hiện tại của bạn . Điều này đặc biệt hữu ích nếu bạn cần cập nhật kho lưu trữ của mình, nhưng đang làm việc trên một cái gì đó có thể bị hỏng nếu bạn cập nhật các tệp của mình. Để tích hợp các xác nhận vào nhánh chính của bạn, bạn sử dụng merge.

2055
Mouna Cheikhna

Điều quan trọng là phải đối chiếu triết lý thiết kế của git với triết lý của một công cụ kiểm soát nguồn truyền thống hơn như SVN.

Subversion được thiết kế và xây dựng với mô hình máy khách/máy chủ. Có một kho lưu trữ duy nhất là máy chủ và một số khách hàng có thể tìm nạp mã từ máy chủ, làm việc trên đó, sau đó cam kết lại máy chủ. Giả định là máy khách luôn có thể liên hệ với máy chủ khi cần thực hiện thao tác.

Git được thiết kế để hỗ trợ một mô hình phân tán hơn mà không cần kho lưu trữ trung tâm (mặc dù bạn chắc chắn có thể sử dụng một mô hình nếu bạn muốn). Ngoài ra git được thiết kế sao cho máy khách và "máy chủ" không cần trực tuyến cùng một lúc. Git được thiết kế để mọi người trên một liên kết không đáng tin cậy có thể trao đổi mã qua email, thậm chí. Có thể làm việc hoàn toàn ngắt kết nối và ghi đĩa CD để trao đổi mã qua git.

Để hỗ trợ mô hình này, git duy trì một kho lưu trữ cục bộ với mã của bạn và cũng là một kho lưu trữ cục bộ bổ sung phản ánh trạng thái của kho lưu trữ từ xa. Bằng cách giữ một bản sao của kho lưu trữ từ xa cục bộ, git có thể tìm ra những thay đổi cần thiết ngay cả khi kho lưu trữ từ xa không thể truy cập được. Sau này khi bạn cần gửi các thay đổi cho người khác, git có thể chuyển chúng dưới dạng tập hợp các thay đổi từ một thời điểm được biết đến với kho lưu trữ từ xa.

  • git fetchlà lệnh "cập nhật bản sao cục bộ của kho lưu trữ từ xa." 

  • git pullnói "mang các thay đổi trong kho lưu trữ từ xa đến nơi tôi giữ mã của riêng mình."

Thông thườnggit pullthực hiện điều này bằng cách thực hiệngit fetchđể cập nhật bản sao cục bộ của kho lưu trữ từ xa, sau đó hợp nhất các thay đổi vào kho lưu trữ mã của riêng bạn và có thể là bản sao làm việc của bạn.

Việc bỏ đi là hãy nhớ rằng thường có ít nhất ba bản sao của một dự án trên máy trạm của bạn. Một bản sao là kho lưu trữ của riêng bạn với lịch sử cam kết của riêng bạn. Bản sao thứ hai là bản sao làm việc của bạn nơi bạn đang chỉnh sửa và xây dựng. Bản sao thứ ba là bản sao "lưu trữ" cục bộ của một kho lưu trữ từ xa.

1104
MikeD

Đây là Hình ảnh của Oliver Steele về cách tất cả mọi thứ khớp với nhau :

enter image description here

Nếu có đủ sự quan tâm, tôi cho rằng tôi có thể cập nhật hình ảnh để thêm git clonegit merge... 

744
Contango

Một trường hợp sử dụng của git fetch là sau đây sẽ cho bạn biết bất kỳ thay đổi nào trong nhánh từ xa kể từ lần kéo cuối cùng của bạn ... để bạn có thể kiểm tra trước khi thực hiện thao tác kéo thực tế, có thể thay đổi các tệp trong nhánh hiện tại và bản sao làm việc của bạn.

git fetch
git diff ...Origin
446
mepster

Tôi mất một ít chi phí để hiểu sự khác biệt là gì, nhưng đây là một lời giải thích đơn giản. master trong localhost của bạn là một chi nhánh.

Khi bạn sao chép một kho lưu trữ, bạn tìm nạp toàn bộ kho lưu trữ đến Máy chủ lưu trữ cục bộ. Điều này có nghĩa là tại thời điểm đó, bạn có một con trỏ Origin/master thành HEAD và master trỏ đến cùng HEAD.

khi bạn bắt đầu làm việc và thực hiện các cam kết, bạn chuyển con trỏ chính thành HEAD + các cam kết của bạn. Nhưng con trỏ Origin/master vẫn chỉ vào đó là gì khi bạn nhân bản.

Vì vậy, sự khác biệt sẽ là:

  • Nếu bạn thực hiện git fetch, nó sẽ chỉ tìm nạp tất cả các thay đổi trong kho lưu trữ từ xa ( GitHub ) và di chuyển con trỏ Origin/master sang HEAD. Trong khi đó, chủ chi nhánh địa phương của bạn sẽ tiếp tục chỉ đến nơi nó có.
  • Nếu bạn thực hiện git pull, về cơ bản nó sẽ tìm nạp (như đã giải thích trước đó) và hợp nhất bất kỳ thay đổi mới nào với nhánh chính của bạn và di chuyển con trỏ đến HEAD.
351
Gerardo

Đôi khi một đại diện trực quan giúp.

 enter image description here

195
thedarkpassenger

Ngắn gọn

git fetch tương tự như pull nhưng không hợp nhất. tức là nó tìm nạp các bản cập nhật từ xa (refsobjects) nhưng địa phương của bạn vẫn giữ nguyên (tức là Origin/master được cập nhật nhưng master vẫn giữ nguyên).

git pull kéo xuống từ xa và hợp nhất ngay lập tức.

Hơn

git clone nhân bản một repo.

git rebase lưu nội dung từ nhánh hiện tại của bạn không ở nhánh ngược dòng vào khu vực tạm thời. Chi nhánh của bạn bây giờ giống như trước khi bạn bắt đầu thay đổi. Vì vậy, git pull -rebase sẽ kéo xuống các thay đổi từ xa, tua lại chi nhánh địa phương của bạn, phát lại các thay đổi của bạn trên đầu chi nhánh hiện tại của bạn từng cái một cho đến khi bạn cập nhật.

Ngoài ra, git branch -a sẽ cho bạn thấy chính xác những gì mà xảy ra với các chi nhánh của bạn - cục bộ và từ xa.

Bài đăng trên blog này rất hữu ích:

Sự khác biệt giữa git pull, git fetch và git clone (và git rebase) - Mike Pearce

và bao gồm git pull, git fetch, git clonegit rebase.

====

CẬP NHẬT

Tôi nghĩ rằng tôi sẽ cập nhật điều này để cho thấy cách bạn thực sự sử dụng điều này trong thực tế. 

  1. Cập nhật repo cục bộ của bạn từ xa (nhưng không hợp nhất):

    git fetch 
    
  2. Sau khi tải xuống các bản cập nhật, hãy xem sự khác biệt:

    git diff master Origin/master 
    
  3. Nếu bạn hài lòng với những cập nhật đó, thì hãy hợp nhất:

    git pull
    

Ghi chú:

Ở bước 2: Để biết thêm về sự khác biệt giữa cục bộ và điều khiển từ xa, hãy xem: Làm thế nào để so sánh một nhánh git cục bộ với nhánh từ xa của nó?

Ở bước 3: Có lẽ chính xác hơn (ví dụ: trên một repo thay đổi nhanh) để thực hiện git rebase Origin tại đây. Xem @Justin Ohms bình luận trong câu trả lời khác.

Xem thêm: http://longair.net/blog/2009/04/16/git-fetch-and-merge/

189
Snowcrash
 git-pull - Tìm nạp và hợp nhất với một kho lưu trữ khác hoặc một chi nhánh địa phương 
 SYNOPSIS 

 git pull, 
 MÔ TẢ 

 và gọi git-merge để hợp nhất 
 lấy đầu (s) vào nhánh hiện tại. Với --rebase, hãy gọi git-rebase 
 Thay vì git-merge .

 Lưu ý rằng bạn có thể sử dụng. (thư mục hiện tại) là <repository> để kéo 
 từ kho lưu trữ cục bộ - điều này rất hữu ích khi hợp nhất các nhánh cục bộ 
 vào nhánh hiện tại .

 và git-merge cơ bản 
 phải được đưa ra trước các tùy chọn dành cho git-fetch .

Bạn sẽ kéo nếu bạn muốn lịch sử được hợp nhất, bạn sẽ tìm nạp nếu bạn chỉ "muốn codez" vì một số người đã gắn thẻ một số bài viết quanh đây.

164
Vinko Vrsalovic

Bạn có thể tìm nạp từ một kho lưu trữ từ xa, xem sự khác biệt và sau đó kéo hoặc hợp nhất.

Đây là một ví dụ cho kho lưu trữ từ xa có tên Origin và một nhánh có tên master theo dõi nhánh từ xa Origin/master:

git checkout master                                                  
git fetch                                        
git diff Origin/master
git rebase Origin master
151
Antonio Bardazzi

Câu trả lời ngắn gọn và dễ dàng là git pull chỉ đơn giản là git fetch theo sau là git merge.

Điều rất quan trọng cần lưu ý là git pull sẽ tự động hợp nhất cho dù bạn có thích hay không. Tất nhiên, điều này có thể dẫn đến xung đột hợp nhất. Giả sử điều khiển từ xa của bạn là Origin và chi nhánh của bạn là master. Nếu bạn git diff Origin/master trước khi kéo, bạn nên có một số ý tưởng về xung đột hợp nhất tiềm năng và có thể chuẩn bị chi nhánh địa phương phù hợp. 

Ngoài việc kéo và đẩy, một số quy trình công việc liên quan đến git rebase, chẳng hạn như cái này, mà tôi diễn giải từ bài viết được liên kết:

git pull Origin master
git checkout foo-branch
git rebase master
git Push Origin foo-branch

Nếu bạn thấy mình trong tình huống như vậy, bạn có thể bị cám dỗ git pull --rebase. Trừ khi bạn thực sự, thực sự biết những gì bạn đang làm, tôi sẽ khuyên bạn chống lại điều đó. Cảnh báo này là từ trang man cho git-pull, phiên bản 2.3.5:

Đây là một chế độ hoạt động nguy hiểm tiềm tàng. Nó viết lại lịch sử, không tốt cho lắm khi bạn xuất bản lịch sử đó đã Không sử dụng tùy chọn này trừ khi bạn đã đọc git-rebase (1) cẩn thận.

145
jfmercer

OK, đây là một số thông tin về git pullgit fetch, vì vậy bạn có thể hiểu sự khác biệt thực tế ... bằng vài từ đơn giản, fetch lấy dữ liệu mới nhất, nhưng không thay đổi mã và không đi để gây rối với mã chi nhánh địa phương hiện tại của bạn, nhưng pull nhận các thay đổi mã và hợp nhất nó với chi nhánh địa phương của bạn, đọc tiếp để biết thêm chi tiết về từng mã:

git lấy

Nó sẽ tải xuống tất cả refsobject và bất kỳ nhánh mới nào vào Kho lưu trữ cục bộ của bạn ...

Tìm nạp các nhánh và/hoặc thẻ (gọi chung là "refs") từ một hoặc nhiều các kho lưu trữ khác, cùng với các đối tượng cần thiết để hoàn thành lịch sử. Các nhánh theo dõi từ xa được cập nhật (xem mô tả Bên dưới để biết cách kiểm soát hành vi này).

Theo mặc định, bất kỳ thẻ nào trỏ vào lịch sử đang được tìm nạp là cũng lấy; hiệu quả là tìm nạp các thẻ trỏ đến các nhánh bạn quan tâm đến. Hành vi mặc định này có thể được thay đổi bằng cách sử dụng các tùy chọn --tags hoặc --no-tags hoặc bằng cách định cấu hình từ xa..tagOpt. Bằng cách sử dụng một refspec tìm nạp các thẻ một cách rõ ràng, bạn có thể tìm nạp các thẻ không trỏ vào các nhánh mà bạn quan tâm trong là tốt.

git fetch có thể tìm nạp từ một kho lưu trữ hoặc URL có tên duy nhất hoặc từ một số kho lưu trữ cùng một lúc nếu được đưa ra và có một điều khiển từ xa. mục trong tập tin cấu hình. (Xem git-config 1 ).

Khi không có điều khiển từ xa được chỉ định, theo mặc định, điều khiển từ xa sẽ là được sử dụng, trừ khi có một nhánh ngược dòng được cấu hình cho .__ hiện tại. chi nhánh.

Tên của các ref được tìm nạp, cùng với các tên đối tượng họ chỉ vào, được viết thành .git/FETCH_HEAD. Thông tin này có thể là được sử dụng bởi các tập lệnh hoặc các lệnh git khác, chẳng hạn như git-pull.


kéo git

Nó sẽ áp dụng các thay đổi từ remote cho nhánh hiện tại ở địa phương ...

Kết hợp các thay đổi từ một kho lưu trữ từ xa vào chi nhánh hiện tại . Trong chế độ mặc định của nó, git pull là tốc ký cho git fetch theo sau hợp nhất git FETCH_HEAD.

Chính xác hơn, git pull chạy git fetch với các tham số đã cho và gọi git merge để hợp nhất các đầu nhánh được lấy vào chi nhánh. Với --rebase, nó chạy git rebase thay vì git merge.

nên là tên của một kho lưu trữ từ xa được chuyển đến git-tìm nạp 1 . có thể đặt tên cho một ref từ xa tùy ý (ví dụ: tên của thẻ) hoặc thậm chí là một tập hợp các ref với tương ứng các nhánh theo dõi từ xa (ví dụ: refs/Heads/: refs/điều khiển từ xa/Origin /), nhưng thông thường nó là tên của một nhánh trong kho lưu trữ từ xa.

Giá trị mặc định cho và được đọc từ Cấu hình "từ xa" và "hợp nhất" cho nhánh hiện tại như được đặt bởi chi nhánh git --track.


Tôi cũng tạo visual bên dưới để cho bạn thấy cách git fetchgit pull hoạt động cùng nhau ...

 git pull and git fetch

126
Alireza

enter image description here

Biểu diễn đồ họa tương tác này rất hữu ích trong việc củng cố git: http://ndpsoftware.com/git-chcoateet.html

git fetch chỉ "tải" các thay đổi từ điều khiển từ xa sang kho lưu trữ cục bộ của bạn. git pull tải xuống các thay đổi và hợp nhất chúng vào chi nhánh hiện tại của bạn. "Trong chế độ mặc định của nó, git pull là tốc ký cho git fetch theo sau là git merge FETCH_HEAD."

121
th3sly

Tiền thưởng:

Khi nói về pull & fetch trong các câu trả lời trên, tôi muốn chia sẻ một mẹo thú vị,

git pull --rebase

Lệnh trên là lệnh hữu ích nhất trong cuộc sống git của tôi giúp tiết kiệm rất nhiều thời gian.

Trước khi đẩy các cam kết mới của bạn đến máy chủ, hãy thử lệnh này và nó sẽ tự động đồng bộ hóa các thay đổi máy chủ mới nhất (với fetch + merge) và sẽ đặt cam kết của bạn ở đầu trong nhật ký git. Không cần phải lo lắng về việc kéo/hợp nhất thủ công.

Tìm thông tin chi tiết tại: http://gitolite.com/git-pull--rebase

119
Sazzad Hissain Khan

Tôi muốn có một số đại diện trực quan của tình huống để nắm bắt những điều này. Có lẽ các nhà phát triển khác cũng muốn thấy nó, vì vậy đây là sự bổ sung của tôi. Tôi không hoàn toàn chắc chắn rằng tất cả đều đúng, vì vậy hãy bình luận nếu bạn tìm thấy bất kỳ sai lầm nào.

                                         LOCAL SYSTEM
                  . =====================================================    
================= . =================  ===================  =============
REMOTE REPOSITORY . REMOTE REPOSITORY  LOCAL REPOSITORY     WORKING COPY
(Origin)          . (CACHED)           
for example,      . mirror of the      
a github repo.    . remote repo
Can also be       .
multiple repo's   .
                  .
                  .
FETCH  *------------------>*
Your local cache of the remote is updated with the Origin (or multiple
external sources, that is git's distributed nature)
                  .
PULL   *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur, 
you are asked for decisions.
                  .
COMMIT            .                             *<---------------*
When coming from, for example, Subversion, you might think that a commit
will update the Origin. In git, a commit is only done to your local repo.
                  .
Push   *<---------------------------------------*
Synchronizes your changes back into the Origin.

Một số lợi thế chính để có một chiếc gương lấy từ xa là:

  • Hiệu suất (cuộn qua tất cả các xác nhận và tin nhắn mà không cố gắng ép nó qua mạng)
  • Phản hồi về trạng thái của repo cục bộ của bạn (ví dụ: tôi sử dụng SourceTree của Atlassian, nó sẽ cho tôi một bóng đèn cho biết nếu tôi cam kết trước hoặc sau so với Xuất xứ. GIT FETCH).
109
Justus Romijn

Tôi đã đấu tranh với điều này là tốt. Trong thực tế, tôi đã đến đây với một tìm kiếm google với cùng một câu hỏi. Đọc tất cả những câu trả lời này cuối cùng đã vẽ một bức tranh trong đầu tôi và tôi quyết định thử đưa nó xuống xem trạng thái của 2 kho lưu trữ và 1 hộp cát và các hành động được thực hiện theo thời gian trong khi xem phiên bản của chúng. Vì vậy, đây là những gì tôi đã đưa ra. Xin hãy sửa tôi nếu tôi nhắn tin ở bất cứ đâu.

Ba repos với một tìm nạp:

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - fetch               -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     -                     -
- @ R01             -     - @ R01+              -     - @R01+               -
---------------------     -----------------------     -----------------------

Ba repos với một kéo

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - pull                -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     - merged with R02     -
- @ R01             -     - @ R01+              -     - @R02+               -
---------------------     -----------------------     -----------------------

Điều này giúp tôi hiểu tại sao một lần tìm nạp là khá quan trọng.

99
pn1 dude

Sự khác biệt giữa GIT FetchGIT Pull có thể được giải thích với kịch bản sau: (Hãy nhớ rằng hình ảnh nói lớn hơn từ ngữ!, Tôi đã cung cấp hình ảnh đại diện)

Hãy lấy một ví dụ rằng bạn đang thực hiện một dự án với các thành viên trong nhóm của bạn. Vì vậy, họ sẽ là một Chi nhánh chính của dự án và tất cả những người đóng góp phải phân nhánh nó vào kho lưu trữ cục bộ của riêng họ và sau đó làm việc trên nhánh cục bộ này để sửa đổi/Thêm mô-đun sau đó Đẩy trở lại nhánh chính.

Vì vậy, Trạng thái ban đầu của hai Chi nhánh khi bạn rẽ nhánh dự án chính trên kho lưu trữ cục bộ của bạn sẽ như thế này- (A, BC là các Mô-đun đã hoàn thành dự án)

 enter image description here

Bây giờ, bạn đã bắt đầu làm việc với mô-đun mới (giả sử D) và khi bạn đã hoàn thành mô-đun D bạn muốn đẩy nó sang nhánh chính, nhưng trong khi đó, một trong những đồng đội của bạn đã phát triển Mô-đun mới E, F sửa đổi C.
Vì vậy, bây giờ điều đã xảy ra là kho lưu trữ cục bộ của bạn đang thiếu tiến độ ban đầu của dự án và do đó việc đẩy các thay đổi của bạn sang nhánh chính có thể dẫn đến xung đột và có thể khiến Mô-đun D của bạn gặp trục trặc.

 enter image description here

Để tránh những vấn đề như vậy và để làm việc song song với tiến độ ban đầu của dự án, có hai cách:

1. Git Fetch- Điều này sẽ Tải xuống tất cả các thay đổi đã được thực hiện cho dự án Origin/nhánh chính không có trong chi nhánh địa phương của bạn. Và sẽ chờ lệnh Git Merge áp dụng các thay đổi đã được tìm nạp vào Kho lưu trữ hoặc chi nhánh của bạn.

 enter image description here

Vì vậy, bây giờ Bạn có thể theo dõi cẩn thận các tập tin trước khi hợp nhất nó vào kho lưu trữ của bạn. Và bạn cũng có thể sửa đổi D nếu được yêu cầu vì Đã sửa đổi C.

 enter image description here

2. Git Pull- Điều này sẽ cập nhật chi nhánh địa phương của bạn với Origin/nhánh chính, tức là thực sự nó là sự kết hợp giữa Git Fetch và Git hợp nhất với nhau .Nhưng điều này có thể gây ra Xung đột với xảy ra, vì vậy nên sử dụng Git Pull với một bản sao sạch.

 enter image description here

89
Aman Tiwari

Chúng tôi chỉ đơn giản nói:

git pull == git fetch + git merge

Nếu bạn chạy git pull, bạn không cần hợp nhất dữ liệu thành cục bộ. Nếu bạn chạy git fetch, điều đó có nghĩa là bạn phải chạy git merge để nhận mã mới nhất đến máy cục bộ của bạn. Nếu không, mã máy cục bộ sẽ không được thay đổi nếu không hợp nhất. 

Vì vậy, trong Git Gui, khi bạn tìm nạp, bạn phải hợp nhất dữ liệu. Tự tìm nạp sẽ không làm thay đổi mã tại địa phương của bạn. Bạn có thể kiểm tra xem khi bạn cập nhật mã bằng cách tìm nạp Một lần tìm nạp và xem; mã nó sẽ không thay đổi. Sau đó, bạn hợp nhất ... Bạn sẽ thấy mã đã thay đổi.

82
Selvamani

git fetch kéo mã từ máy chủ từ xa xuống các nhánh theo dõi trong kho lưu trữ cục bộ của bạn. Nếu điều khiển từ xa của bạn được đặt tên Origin (mặc định) thì các nhánh này sẽ nằm trong Origin/, ví dụ Origin/master, Origin/mybranch-123, v.v ... Đây không phải là các nhánh hiện tại của bạn, chúng là bản sao của các nhánh đó từ máy chủ.

git pull thực hiện git fetch nhưng sau đó cũng hợp nhất mã từ nhánh theo dõi vào phiên bản hiện tại của nhánh đó. Nếu bạn chưa sẵn sàng cho những thay đổi đó, chỉ cần git fetch trước tiên.

79
Michael Durrant

git fetch sẽ truy xuất các nhánh từ xa để bạn có thể git diff hoặc git merge chúng với nhánh hiện tại. git pull sẽ chạy tìm nạp trên brach từ xa được theo dõi bởi nhánh hiện tại và sau đó hợp nhất kết quả. Bạn có thể sử dụng git fetch để xem có bản cập nhật nào cho chi nhánh từ xa mà không cần hợp nhất chúng với chi nhánh địa phương của bạn không.

75
ntanase

Tìm nạp Git

Bạn tải xuống các thay đổi cho chi nhánh địa phương của bạn từ Origin thông qua tìm nạp. Tìm nạp yêu cầu repo từ xa cho tất cả các cam kết mà người khác đã thực hiện nhưng bạn không có trên repo địa phương của bạn. Tìm nạp tải xuống các cam kết này và thêm chúng vào kho lưu trữ cục bộ.

Hợp nhất Git

Bạn có thể áp dụng các thay đổi được tải xuống thông qua tìm nạp bằng lệnh hợp nhất. Hợp nhất sẽ lấy các xác nhận được lấy từ tìm nạp và cố gắng thêm chúng vào chi nhánh địa phương của bạn. Hợp nhất sẽ giữ lịch sử cam kết của các thay đổi cục bộ của bạn để khi bạn chia sẻ chi nhánh của mình với Push, Git sẽ biết cách người khác có thể hợp nhất các thay đổi của bạn.

Kéo Git

Tìm nạp và hợp nhất chạy với nhau thường xuyên đủ để một lệnh kết hợp cả hai, kéo, được tạo. Pull thực hiện tìm nạp và sau đó hợp nhất để thêm các cam kết đã tải xuống vào chi nhánh địa phương của bạn.

71
Pinkesh Sharma

Sự khác biệt duy nhất giữa git pullgit fetch là:

git pull kéo từ một nhánh từ xa và hợp nhất nó.

git fetch chỉ tìm nạp từ nhánh từ xa nhưng nó không hợp nhất

tức là git pull = git fetch + git merge ...

50
Rohitashv Singhal

Git cho phép các cam kết cũ hơn theo thời gian được áp dụng sau các cam kết mới hơn . Vì điều này, hành động chuyển giao các cam kết giữa các kho được chia thành hai bước:

  1. Sao chép các cam kết mới từ chi nhánh từ xa sang sao chép chi nhánh từ xa này bên trong repo cục bộ. 

    (repo để hoạt động repo) [email protected] >> remote/Origin/[email protected]

  2. Tích hợp các cam kết mới cho chi nhánh địa phương

    (hoạt động bên trong repo) remote/Origin/[email protected] >> [email protected]

Có hai cách thực hiện bước 2. Bạn có thể:

  1. Ngã ba nhánh cục bộ sau tổ tiên chung cuối cùng và thêm các xác nhận mới song song với các xác nhận duy nhất cho kho lưu trữ cục bộ, được hoàn thành bằng cách hợp nhất cam kết, đóng ngã ba. 
  2. Chèn các xác nhận mới sau khi tổ tiên chung cuối cùng và áp dụng lại cam kết duy nhất cho kho lưu trữ cục bộ.

Trong thuật ngữ git, bước 1 là git fetch, bước 2 là git merge hoặc git rebase

git pullgit fetchgit merge

44
Pawel Furmaniak

Sự khác biệt giữa git pullgit fetch là gì?

Để hiểu điều này, trước tiên bạn cần hiểu rằng git cục bộ của bạn không chỉ duy trì kho lưu trữ cục bộ của bạn mà còn duy trì một bản sao cục bộ của kho lưu trữ từ xa.

git fetch mang đến bản sao cục bộ của kho lưu trữ từ xa. Ví dụ: nếu kho lưu trữ từ xa của bạn là GitHub - bạn có thể muốn tìm nạp bất kỳ thay đổi nào được thực hiện trong kho lưu trữ từ xa sang bản sao cục bộ của kho lưu trữ từ xa. Điều này sẽ cho phép bạn thực hiện các hoạt động như so sánh hoặc hợp nhất.

git pull mặt khác sẽ đưa các thay đổi trong kho lưu trữ từ xa đến nơi bạn giữ mã của riêng mình. Thông thường, git pull sẽ thực hiện git fetch trước để đưa bản sao cục bộ của kho lưu trữ từ xa cập nhật và sau đó nó sẽ hợp nhất các thay đổi vào kho lưu trữ mã của riêng bạn và có thể là bản sao làm việc của bạn. 

36
Donal

Git có được nhánh của phiên bản mới nhất từ ​​điều khiển từ xa đến cục bộ bằng hai lệnh: 

  1. git fetch: Git sẽ có phiên bản mới nhất từ ​​xa đến cục bộ, nhưng nó không tự động hợp nhất . git fetch Origin mastergit log -p master..Origin/mastergit merge Origin/master

     Các lệnh trên có nghĩa là tải xuống phiên bản mới nhất của nhánh chính từ Origin từ xa đến nhánh Master gốc. Và sau đó so sánh chi nhánh chủ địa phương và chi nhánh gốc. Cuối cùng, hợp nhất. 

  2. git pull: Git sẽ lấy phiên bản mới nhất từ ​​xa và hợp nhất vào cục bộ.

     git pull Origin master

     Lệnh trên tương đương với git fetchgit merge. Trong thực tế, git fetch có thể an toàn hơn vì trước khi hợp nhất, chúng ta có thể thấy các thay đổi và quyết định có hợp nhất hay không.

35
Marcus Thornton

git pull == (git fetch + git merge) 

git fetch không thay đổi cho các chi nhánh địa phương.

Nếu bạn đã có một kho lưu trữ cục bộ với một điều khiển từ xa được thiết lập cho dự án mong muốn, bạn có thể lấy tất cả các nhánh và thẻ cho điều khiển từ xa hiện có bằng cách sử dụng git fetch. ... Fetch không thực hiện bất kỳ thay đổi nào đối với các nhánh cục bộ, vì vậy bạn sẽ cần hợp nhất một nhánh từ xa với một nhánh cục bộ được ghép nối để kết hợp các thay đổi mới tìm nạp. từ github

33
Iggy

Trên thực tế, Git duy trì một bản sao mã của riêng bạn và Kho lưu trữ từ xa.

Lệnh git fetch làm cho bản sao cục bộ của bạn được cập nhật bằng cách lấy dữ liệu từ kho lưu trữ từ xa. Lý do chúng tôi cần điều này là vì ai đó có thể đã thực hiện một số thay đổi đối với mã và bạn muốn tự cập nhật. 

Lệnh git pull đưa các thay đổi trong kho lưu trữ từ xa đến nơi bạn giữ mã của riêng mình. Thông thường, git pull thực hiện điều này bằng cách thực hiện tìm nạp trước để đưa bản sao cục bộ của kho lưu trữ từ xa, sau đó nó hợp nhất các thay đổi vào kho lưu trữ mã của riêng bạn và có thể là bản sao làm việc của bạn.

32
Pokemon

Cố gắng rõ ràng và đơn giản.

Lệnh git pull thực sự là một lệnh shortcut cho git fetch theo sau là git merge hoặc lệnh git rebase tùy thuộc vào cấu hình của bạn. Bạn có thể định cấu hình kho Git của mình để git pull là một lần tìm nạp theo sau là một rebase.

31
montells

Một đại diện đồ họa đơn giản cho người mới bắt đầu,

 enter image description here

đây,

git pull  

sẽ lấy mã từ kho lưu trữ và rebase với cục bộ của bạn ... trong git pull có khả năng các xác nhận mới được tạo.

nhưng trong 

git lấy 

sẽ tìm nạp mã từ kho lưu trữ và chúng tôi cần khởi động lại thủ công bằng cách sử dụng git rebase

ví dụ: tôi sẽ lấy từ chủ máy chủ và khởi động lại nó trong chủ địa phương.

1) git pull (rebase sẽ tự động thực hiện):

git pull Origin master

ở đây Origin là repo từ xa của bạn master là chi nhánh của bạn

2) git fetch (cần rebase thủ công):

git fetch Origin master

nó sẽ tìm nạp các thay đổi máy chủ từ Origin. và nó sẽ ở địa phương của bạn cho đến khi bạn tự mình khởi động lại nó. chúng ta cần sửa các xung đột bằng tay bằng cách kiểm tra mã.

git rebase Origin/master

điều này sẽ rebase mã vào địa phương. trước đó đảm bảo bạn ở chi nhánh phải.

30
Mohideen ibn Mohammed
git pull = git fetch + git merge 
29
Saqib R.

Từ Pro Git § 2.5 Git Cơ bản - Làm việc với điều khiển từ xa: Tìm nạp và kéo từ xa của bạn :

Điều quan trọng cần lưu ý là lệnh fetch kéo dữ liệu vào kho lưu trữ cục bộ của bạn - nó không phải là tự động hợp nhất nó với bất kỳ công việc nào của bạn hoặc sửa đổi những gì bạn có thể hiện đang làm việc Bạn phải hợp nhất nó thủ công vào công việc của bạn khi bạn sẵn sàng.

Nếu bạn có một nhánh được thiết lập để theo dõi một nhánh từ xa, bạn có thể sử dụng Lệnh git pull để tự động tìm nạp và sau đó hợp nhất một điều khiển từ xa chi nhánh vào chi nhánh hiện tại của bạn. Điều này có thể dễ dàng hơn hoặc nhiều hơn quy trình làm việc thoải mái cho bạn; và theo mặc định, lệnh git clone tự động thiết lập nhánh chính cục bộ của bạn để theo dõi từ xa nhánh chính trên máy chủ mà bạn đã nhân bản (giả sử điều khiển từ xa có nhánh chính). Chạy git pull thường lấy dữ liệu từ máy chủ ban đầu bạn được nhân bản và tự động cố gắng hợp nhất nó vào mã mà bạn hiện đang làm việc.

28
Zhenxiao Hao

git kéo 

Nó thực hiện hai chức năng bằng cách sử dụng một lệnh duy nhất.

Nó tìm nạp tất cả các thay đổi được thực hiện cho nhánh từ xa và sau đó hợp nhất những thay đổi đó vào nhánh cục bộ của bạn. Bạn cũng có thể sửa đổi hành vi kéo bằng cách vượt qua --rebase. Sự khác biệt giữa hợp nhất và rebase có thể được đọc tại đây

git tìm nạp

Git fetch chỉ thực hiện một nửa công việc của git pull. Nó chỉ mang những thay đổi từ xa vào repo cục bộ của bạn nhưng không áp dụng chúng cho các chi nhánh của bạn. Bạn phải áp dụng rõ ràng những thay đổi đó. Điều này có thể được thực hiện như sau:

git fetch
git rebase Origin/master
22
Animesh Sharma

Người ta phải ghi nhớ bản chất của git. Bạn có điều khiển từ xa và các chi nhánh địa phương của bạn (không nhất thiết phải giống nhau). So với các hệ thống kiểm soát nguồn khác, đây có thể là một chút rắc rối. 

Thông thường khi bạn kiểm tra từ xa, một bản sao cục bộ được tạo để theo dõi điều khiển từ xa. 

git fetch sẽ làm việc với chi nhánh từ xa và cập nhật thông tin của bạn. 

Đây thực sự là trường hợp nếu các SWE khác đang làm việc cùng một nhánh và hiếm khi xảy ra trong một dev nhỏ - một nhánh - một kịch bản dự án.

Công việc của bạn trên chi nhánh địa phương vẫn còn nguyên vẹn. Để mang lại các thay đổi cho chi nhánh địa phương của bạn, bạn phải hợp nhất/rebase các thay đổi từ chi nhánh từ xa.

git pull thực hiện chính xác hai bước này (tức là --rebase để rebase thay vì hợp nhất)

Nếu lịch sử địa phương và lịch sử từ xa có xung đột, bạn sẽ buộc phải thực hiện hợp nhất trong một lần đẩy git để xuất bản các thay đổi của mình.

Do đó, nó thực sự phụ thuộc vào bản chất của môi trường làm việc của bạn và trải nghiệm những gì sẽ sử dụng.

22
g24l

Từ git cheat sheet

git fetch <remote> // Download all changes from <remote>, but don't integrate into HEAD
git pull <remote> <branch> // Download changes and directly merge/integrate into HEAD
20
Nan Xiao

Từ những gì tôi hiểu, 

Git pull - Kéo xuống từ một điều khiển từ xa được chỉ định (Được chỉ định bởi người dùng) và sẽ ngay lập tức hợp nhất nó vào một nhánh mà chúng ta hiện đang sử dụng. Về cơ bản, nó là sự pha trộn của các lệnh Fetch và Merge.

Git Fetch - Nó giống như Kéo, nhưng nó sẽ không thực hiện bất kỳ sự hợp nhất nào. Vì vậy, bạn có thể theo dõi cẩn thận các tập tin trước khi hợp nhất nó. 

Url này phải giúp đỡ để hiểu thêm: Sự khác biệt giữa git pull, git fetch và git clone (và git rebase).

17
Pragyaditya Das

Trong ngắn hạn và đơn giản:

git fetch: Hãy xem nếu có công cụ mới.

git pull: Lấy những thứ mới và đặt nó lên trên những thứ của bạn. 

8
miva2

Tôi tin rằng hầu hết các câu trả lời đã trả lời khá tốt. Tôi sẽ nhấn mạnh khi nào nên sử dụng mà thay vào đó.

 Enter image description here

Tìm nạp có thể hữu ích khi bạn cần cập nhật các nhà phát triển khác, nhưng vẫn muốn tiếp tục công việc của mình. Những người thường xuyên muốn ngoại tuyến và làm việc sử dụng fetch để nhận cập nhật mới nhất cho đến khi cô ấy/anh ấy trực tuyến. Sau này khi cô ấy/anh ấy cảm thấy thoải mái với những thay đổi của mình, hãy hợp nhất những người từ chi nhánh vào không gian làm việc của anh ấy/cô ấy.

Trong khi những người đang làm việc trực tuyến và rất chắc chắn về những thay đổi của họ và muốn nhận mã mới nhất và merge ngay lập tức sử dụng pull. Tôi hiếm khi sử dụng fetch vì để kiểm tra các bản cập nhật mới nhất, tôi kiểm tra chúng qua trang web GitHub và tôi luôn làm việc ngoại tuyến. Như tôi đã đề cập, bạn có thể đã sử dụng cho kịch bản trên.

5
ishandutta2007

Lấy Git

Giúp bạn biết về các bản cập nhật mới nhất từ ​​git repository. Giả sử bạn làm việc trong một nhóm bằng cách sử dụng GitFlow, trong đó nhóm làm việc trên nhiều branches (tính năng). Với git fetch --allcommand bạn có thể biết về tất cả branches mới trong vòng repository.

Chủ yếu là git fetch được sử dụng với git reset. Ví dụ: bạn muốn hoàn nguyên tất cả các thay đổi cục bộ của mình về trạng thái kho lưu trữ hiện tại.

git fetch --all // get known about latest updates
git reset --hard Origin/[branch] // revert to current branch state

Kéo Git

Lệnh này cập nhật branch của bạn với trạng thái repositorybranch hiện tại. Hãy tiếp tục với GitFlow. Nhiều tính năng branches là nhánh merged thành develop và khi bạn muốn phát triển các tính năng mới cho dự án, bạn phải truy cập branch và thực hiện git pull để có trạng thái hiện tại là developbranch

Tài liệu cho GitFlow https://Gist.github.com/peterdeweese/4251497

3
Andrei Todorut

Git fetch đồng bộ danh mục của kho lưu trữ từ xa đến địa phương của bạn. Nó sẽ không hợp nhất các thay đổi tập tin/mã từ xa đến chi nhánh địa phương của bạn.

Git pull tải các thay đổi liên quan đến chi nhánh địa phương hiện tại của bạn và sau đó hợp nhất nó.

1
Arnel Lenteria

Từ tuyệt vời này Attlassian guide: 

Lệnh git fetch tải xuống các cam kết, tệp và ref từ kho lưu trữ từ xa vào repo cục bộ của bạn. 

Tìm nạp là những gì bạn làm khi bạn muốn xem mọi người other đang làm gì. Nó tương tự như cập nhật svn ở chỗ nó cho phép bạn xem lịch sử trung tâm đã tiến triển như thế nào, nhưng nó không buộc bạn phải thực sự hợp nhất các thay đổi vào kho lưu trữ của mình. Git cô lập nội dung được tìm nạp dưới dạng từ nội dung cục bộ hiện có, nó hoàn toàn không ảnh hưởng đến công việc phát triển cục bộ của bạn. Nội dung được tìm nạp phải được kiểm tra rõ ràng bằng cách sử dụng lệnh git checkout. Điều này làm cho việc tìm nạp một cách an toàn để xem xét các cam kết trước khi tích hợp chúng với kho lưu trữ cục bộ của bạn.

Khi tải xuống nội dung từ một repo từ xa, các lệnh git pullgit fetch có sẵn để hoàn thành nhiệm vụ. Bạn có thể coi git fetch phiên bản 'an toàn' của hai lệnh. Nó sẽ tải xuống nội dung từ xa nhưng không cập nhật trạng thái làm việc của đại diện địa phương của bạn, giữ nguyên công việc hiện tại của bạn. git pull là lựa chọn thay thế mạnh mẽ hơn, nó sẽ tải xuống nội dung từ xa cho nhánh cục bộ đang hoạt động và ngay lập tức thực thi git merge để tạo một cam kết hợp nhất cho nội dung từ xa mới. Nếu bạn có các thay đổi đang chờ xử lý, điều này sẽ gây ra xung đột và khởi động luồng giải quyết xung đột hợp nhất.


Với git pull:

  • Bạn không nhận được bất kỳ sự cô lập. 
  • Nó ảnh hưởng đến sự phát triển địa phương của bạn.
  • Nó không cần phải được kiểm tra rõ ràng. Bởi vì nó ngầm thực hiện một git merge.
  • Về cơ bản nó KHÔNG an toàn. Nó hung hăng.
  • Không giống như git fetch khi nó chỉ ảnh hưởng đến .git/refs/remotes của bạn, git pull sẽ ảnh hưởng đến cả .git/refs/remotes.git/refs/heads/ của bạn.

Hmmm ... vậy nếu tôi không cập nhật bản sao làm việc với git fetch, thì tôi sẽ thực hiện thay đổi ở đâu? Trường hợp git fetch lưu trữ các cam kết mới?

Câu hỏi tuyệt vời. Nó đặt nó ở một nơi nào đó tách biệt với bản sao làm việc của bạn. Nhưng lại ở đâu? Hãy cùng tìm hiểu.

Trong thư mục dự án của bạn (tức là nơi bạn thực hiện các lệnh git): 

  1. ls. Điều này sẽ hiển thị các tập tin và thư mục. Không có gì mát mẻ, tôi biết.

  2. Bây giờ làm ls -a. Điều này sẽ hiển thị các tệp chấm tức là các tệp bắt đầu bằng . Sau đó, bạn sẽ có thể thấy một thư mục có tên: .git

  3. Làm cd .git. Điều này rõ ràng sẽ thay đổi thư mục của bạn. 
  4. Bây giờ đến phần thú vị; làm ls. Bạn sẽ thấy một danh sách các thư mục. Chúng tôi đang tìm kiếm refs. Làm cd refs.
  5. Thật thú vị khi xem những gì bên trong tất cả các thư mục, nhưng hãy tập trung vào hai trong số chúng. headsremotes. Sử dụng cd để kiểm tra bên trong chúng. 
  6. BẤT K _ git fetch mà bạn làm sẽ cập nhật các mục trong thư mục /.git/refs/remotes. Nó sẽ không cập nhật bất cứ điều gì trong thư mục /.git/refs/heads.
  7. BẤT K _ git pull trước tiên sẽ thực hiện git fetch, cập nhật các mục trong thư mục /.git/refs/remotes, sau đó hợp nhất với cục bộ của bạn và sau đó thay đổi đầu trong thư mục /.git/refs/heads

Một câu trả lời liên quan rất tốt cũng có thể được tìm thấy Trường hợp 'git fetch' tự đặt nó ở đâu?

Đồng thời tìm "Ký hiệu gạch chéo" từ Quy ước đặt tên nhánh Git post.

1
Honey

Như đã trả lời hầu hết không có nghi ngờ rằng git-pull là git-fetch cộng với hợp nhất. Tôi muốn chỉ ra rằng:

khi bạn muốn kiểm tra trước khi hợp nhất thì bạn nên sử dụng git-fetch theo sau bởi git-pull.

Trên cronjob rất hữu ích khi thực hiện như trong tập lệnh bên dưới:

#!/bin/sh

git fetch upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, let's pull"
    git pull upstream master
    git Push Origin master
fi
0
Chetabahana