pull差異 - vs git pull




'git pull'和'git fetch'有什麼區別? (20)

git pull和之間有什麼區別git fetch

要理解這一點,首先需要了解本地git不僅維護本地存儲庫,還維護遠程存儲庫的本地副本。

git fetch使您的遠程存儲庫的本地副本保持最新。例如,如果您的遠程存儲庫是GitHub - 您可能希望將遠程存儲庫中所做的任何更改提取到遠程存儲庫的本地副本。這將允許您執行比較或合併等操作。

git pull另一方面,將遠程存儲庫中的更改記錄到您保留自己的代碼的位置。通常,git pullgit fetch首先使遠程存儲庫的本地副本更新,然後將更改合併到您自己的代碼存儲庫以及可能的工作副本中。

主持人注意:鑑於此問題已經發布了67個答案 (其中一些已刪除),請考慮在發布另一個問題之前是否提供任何新內容

git pullgit fetch什麼區別?


獎金:

在談到上述答案中的提取和提取時,我想分享一個有趣的技巧,

git pull --rebase

上面的命令是我git生活中最有用的命令,節省了大量的時間。

在將新提交推送到服務器之前,請嘗試此命令,它將自動同步最新的服務器更改(使用fetch + merge),並將您的提交放在git log的頂部。 無需擔心手動拉/合併。

有關詳細信息,請訪問: http://gitolite.com/git-pull--rebasehttp://gitolite.com/git-pull--rebase


git fetch將代碼從遠程服務器下拉到本地存儲庫中的跟踪分支。如果你的遙控器被命名為origin(默認值),那麼這些分支會內origin/,例如origin/masterorigin/mybranch-123等等。這些都不是你當前的分支,它們是本地從服務器這些分支的副本。

git pull做了git fetch但隨後合併從跟踪分支代碼到分支您當前的本地版本。如果你尚未做好應對這一改變的準備,那就git fetch先行。


git fetch將檢索遠程分支機構,這樣就可以git diffgit merge它們與當前分支。git pull將在當前分支跟踪的遠程brach上運行fetch,然後合併結果。您可以使用git fetch以查看遠程分支是否有任何更新,而無需將它們與本地分支合併。


好的 ,這裡有一些關於git pullgit fetch ,所以你可以理解實際的差異...用幾句簡單的話來說, fetch獲取最新的數據,但不是代碼更改,也不會弄亂你當前的本地分支代碼,但取代碼更改並將其合併到您的本地分支,繼續閱讀以獲取有關每個代碼的更多詳細信息:

git fetch

它會將所有引用對像以及任何新分支下載到本地存儲庫...

從一個或多個其他存儲庫中獲取分支和/或標記(統稱為“refs”),以及完成其歷史記錄所需的對象。 遠程跟踪分支已更新(有關控制此行為的方法,請參閱下面的說明)。

默認情況下,還會獲取指向要獲取的歷史記錄的任何標記; 效果是獲取指向您感興趣的分支的標記。可以使用--tags或--no-tags選項或配置remote..tagOpt來更改此默認行為。 通過使用明確提取標記的refspec,您可以獲取不指向您感興趣的分支的標記。

git fetch可以從一個命名的存儲庫或URL中獲取,也可以一次從多個存儲庫中獲取,如果有,則有一個遙控器。 配置文件中的條目。 (參見git-config 1 )。

如果未指定遠程,則默認情況下將使用原始遠程,除非為當前分支配置了上游分支。

獲取的引用名稱及其指向的對象名稱將寫入.git / FETCH_HEAD。 腳本或其他git命令可以使用此信息,例如git-pull。

git pull

它會將遠程更改應用到本地的當前分支 ...

將來自遠程存儲庫的更改合併到當前分支中。 在默認模式下,git pull是git fetch的簡寫,後跟git merge FETCH_HEAD。

更準確地說,git pull使用給定的參數運行git fetch並調用git merge將已檢索的分支頭合併到當前分支中。 使用--rebase,它運行git rebase而不是git merge。

應該是傳遞給git-fetch 1的遠程存儲庫的名稱。 可以命名任意遠程引用(例如,標記的名稱)或甚至具有相應遠程跟踪分支的引用集合(例如,refs / heads / :refs / remotes / origin / ),但通常它是名稱遠程存儲庫中的分支。

從git-branch --track設置的當前分支的“遠程”和“合併”配置中讀取和的默認值。

我還創建了下面的視覺效果 ,向您展示git fetchgit pull如何協同工作......

1


簡要地

git fetch類似於pull但不合併。 即它獲取遠程更新( refsobjects ),但您的本地保持不變(即origin/master更新但master保持不變)。

git pull從遙控器拉下並立即合併。

更多

回購克隆克隆

git rebase將當前分支中不在上游分支中的東西保存到臨時區域。 您的分支現在與開始更改之前的分支相同。 因此, git pull -rebase將下拉遠程更改,回退本地分支,逐個重播您當前分支頂部的更改,直到您獲得最新信息。

此外, git branch -a將向您顯示所有分支機構的確切內容 - 本地和遠程分支。

這篇博文很有用:

git pull,git fetch和git clone(以及git rebase)之間的區別 - Mike Pearce

並涵蓋git pullgit fetchgit clonegit rebase

====

UPDATE

我想我會更新這個以顯示你在實踐中如何實際使用它。

  1. 從遠程更新本地倉庫(但不要合併):

    git fetch

  2. 下載更新後,讓我們看看差異:

    git diff master origin / master

  3. 如果您對這些更新感到滿意,請合併:

    git pull

筆記:

在第2步:有關本地和遠程分支之間的差異的更多信息,請參閱: 比較本地git分支與遠程分支?

在第3步:在這裡做一個git rebase origin可能更準確(例如在快速變化的回購中)。 請參閱另一個答案中的@Justin Ohms評論。

另見: longair.net/blog/2009/04/16/git-fetch-and-mergelongair.net/blog/2009/04/16/git-fetch-and-merge


git pull ==(git fetch + git merge)

git fetch不會更改為本地分支。

如果您已經有一個本地存儲庫,其中包含為所需項目設置的遠程數據庫,則可以使用git fetch獲取現有遠程數據庫的所有分支和標記。... Fetch不會對本地分支進行任何更改,因此您需要將遠程分支與配對的本地分支合併以合併新的提取更改。來自github


一個簡單的初學者圖形表示,

這裡,

git pull  

將使用您的本地從存儲庫和rebase獲取代碼...在git pull中可能會創建新的提交。

但在 ,

git fetch

將從存儲庫中獲取代碼,我們需要使用手動重新綁定它 git rebase

例如:我將從服務器主服務器獲取並在我的本地主服務器中重新綁定它。

1)git pull(rebase將自動完成):

git pull origin master

這裡的原點是你的遠程倉庫主人是你的分支

2)git fetch(需要手動rebase):

git fetch origin master

它將從源獲取服務器更改。它將在你的本地,直到你自己改變它。我們需要通過檢查代碼手動修復衝突。

git rebase origin/master

這會將代碼重新綁定到本地。在那之前確保你在正確的分支。


實際上Git維護著您自己的代碼和遠程存儲庫的副本。

該命令git fetch通過從遠程存儲庫獲取數據使您的本地副本保持最新。我們需要這個的原因是因為其他人可能對代碼進行了一些更改,並且您希望自己更新。

該命令git pull將遠程存儲庫中的更改帶到您保留自己的代碼的位置。通常,git pull這是通過首先執行'git fetch'來使遠程存儲庫的本地副本更新,然後將更改合併到您自己的代碼存儲庫以及可能的工作副本中。


將git的設計理念與更傳統的源控制工具(如SVN)的理念進行對比非常重要。

Subversion是使用客戶端/服務器模型設計和構建的。 有一個存儲庫是服務器,幾個客戶端可以從服務器獲取代碼,對其進行處理,然後將其提交回服務器。 假設客戶端可以在需要執行操作時始終聯繫服務器。

Git旨在支持更加分散的模型而不需要中央存儲庫(儘管如果您願意,您當然可以使用它)。 此外,git的設計使客戶端和“服務器”不需要同時在線。 Git的設計使得不可靠鏈接的人們甚至可以通過電子郵件交換代碼。 可以完全斷開連接並刻錄CD以通過git交換代碼。

為了支持這個模型,git使用您的代碼維護一個本地存儲庫,還有一個鏡像遠程存儲庫狀態的附加本地存儲庫。 通過在本地保留遠程存儲庫的副本,即使無法訪問遠程存儲庫,git也可以找出所需的更改。 稍後當您需要將更改發送給其他人時,git可以將它們作為一組更改從遠程存儲庫已知的時間點進行傳輸。

  • git fetch是一個命令,它說“使我的遠程存儲庫的本地副本更新。”

  • git pull說“將遠程存儲庫中的更改帶到我保存自己代碼的位置。”

通常git pull通過執行git fetch來使遠程存儲庫的本地副本更新,然後將更改合併到您自己的代碼存儲庫以及可能的工作副本中。

需要注意的是,工作站上通常至少有三個項目副本 。 一個副本是您自己的存儲庫,具有您自己的提交歷史記 第二個副本是您正在編輯和構建的工作副本。 第三個副本是遠程存儲庫的本地“緩存”副本。


我們簡單地說:

git pull == git fetch + git merge

如果運行git pull,則無需將數據合併到本地。如果您運行git fetch,則表示您必須運行git merge以獲取本地計算機的最新代碼。否則,如果沒有合併,則不會更改本地機器代碼。

所以在Git Gui中,當你進行提取時,你必須合併數據。獲取本身不會使您的本地代碼更改。您可以通過提取一次來查看更新代碼並查看; 它不會改變的代碼。然後你合併......你會看到更改後的代碼。


我喜歡用一些視覺表現來掌握這些東西。 也許其他開發者也希望看到它,所以這是我的補充。 我不完全確定這一切都是正確的,所以如果你發現任何錯誤請發表評論。

                                         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.

獲取遙控器鏡像的一些主要優點是:

  • 性能(滾動所有提交和消息,而不試圖通過網絡擠壓它)
  • 關於本地倉庫狀態的反饋(例如,我使用Atlassian的SourceTree,它會給我一個燈泡,指示我是否提交了與原點相比提前或落後。這些信息可以使用GIT FETCH更新)。

有時,視覺表示有幫助。


用最簡單的術語來說, git pull執行git fetch然後執行git merge

您可以隨時進行git fetch來更新refs/remotes/<remote>/下的遠程跟踪分支。

此操作永遠不會更改refs/heads下的任何本地分支,並且可以安全地執行而無需更改工作副本。 我甚至聽說有人在後台的cron作業中定期運行git fetch (雖然我不建議這樣做)。

使用git pull可以使本地分支與其遠程版本保持同步,同時還可以更新其他遠程跟踪分支。

Git文檔: git pull


試圖清晰簡單。

混帳拉命令實際上是一個shortcutgit的取指隨後混帳合併混帳底墊取決於您的配置命令。您可以配置Git存儲庫,以便git pull是一個fetch,後跟一個rebase。



GIT FetchGIT Pull之間的區別可以通過以下場景來解釋:( 記住圖片比單詞更響亮!,我提供了圖形表示)

讓我們舉一個例子,說明您正在與團隊成員一起開展項目。所以他們將成為項目的一個主要分支,所有貢獻者必須將它分叉到他們自己的本地存儲庫,然後在這個本地分支上工作以修改/添加模塊然後推回到主分支。

因此,初始狀態的兩個分支的,當你在分叉本地倉庫主體工程會像這- ( ABC在模塊已經完成的項目)

現在,你已經開始了新的模塊(假設上工作D),當你完成D你想要它推到主分支模塊,但與此同時發生的事情是你的一個隊友已經制定了新的模塊EF並修改C
所以現在發生的事情是您的本地存儲庫缺乏項目的原始進度,因此將更改推送到主分支可能會導致衝突並可能導致模塊D出現故障。

為避免此類問題並與項目的原始進度並行工作,他們有兩種方式:

1. Git Fetch-這將下載對原始/主分支項目所做的所有更改,這些更改在本地分支中不存在。並將等待Git Merge命令將已提取的更改應用於您的存儲庫或分支。

所以現在您可以在將文件合併到存儲庫之前仔細監視這些文件。D如果需要,你也可以修改因為修改C

2. Git Pull-這將使用origin / main分支更新您的本地分支,即實際上它的作用是Git Fetch和Git的組合一個接一個地合併。但這可能會導致衝突發生,因此建議使用Git Pull和乾淨的副本。


Git允許在較新的提交後應用按時間順序排列的舊提交。因此,在存儲庫之間傳輸提交的操作分為兩個步驟:

  1. 將新提交從遠程分支複製到本地存儲庫中的此遠程分支的副本。

    (回購回購業務) [email protected] >> remote/origin/[email protected]

  2. 將新提交集成到本地分支

    (內部回購操作) remote/origin/[email protected] >> [email protected]

有兩種方法可以執行第2步。您可以:

  1. fork最後一個共同祖先之後的本地分支,並添加與本地存儲庫唯一的提交並行的新提交,通過合併提交,關閉fork來最終確定。
  2. 在最後一個共同祖先之後插入新提交並重新應用對本地存儲庫唯一的提交。

git術語中,步驟1是git fetch,步驟2是git mergegit rebase

git pullgit fetchgit merge


git-pull - Fetch from and merge with another repository or a local branch
SYNOPSIS

git pull   …
DESCRIPTION

Runs git-fetch with the given parameters, and calls git-merge to merge the 
retrieved head(s) into the current branch. With --rebase, calls git-rebase 
instead of git-merge.

Note that you can use . (current directory) as the <repository> to pull 
from the local repository — this is useful when merging local branches 
into the current branch.

Also note that options meant for git-pull itself and underlying git-merge 
must be given before the options meant for git-fetch.

如果您想要合併歷史記錄,您可以選擇,如果您只是想要“codez”,則可以獲取,因為某些人已在此處標記了一些文章。


git pull = git fetch + git merge 




git-fetch