我們從progit 一書中可以看到:
遠程倉庫名字 “origin” 與分支名字 “master” 一樣,在 Git 中并沒有任何特別的含義一樣, 同時“master”是當你運行git init時默認的起始分支名字,原因僅僅是它的廣泛使用,“origin” 是當你運行 git clone 時默認的遠程倉庫名字, 如果你運行 git clone -o booyah,那么你默認的遠程分支名字將會是 booyah/master,
我們使用 git remote -v 或者 查看.git/config 可以看到 origin 的含義,
當我們通過使用 git remote -v 命令的時候我們可以看到如下:
origin https://github.com/yaowenxu/yaowenxu.github.io.git (fetch)
origin https://github.com/yaowenxu/yaowenxu.github.io.git (push)
origin 這兩種形式,
但是
origin 并不是指得是遠程的倉庫,而是指得是遠程倉庫在本地的一個指標(這個指標有可能過時的),當我們使用使用merge 的時候,我們進行合并的時候只是上一次fetch 從遠程拿到的版本,不是遠程倉庫的最新版本,
比如命令:
git merge origin master
指的就是將本地的遠端分支與本地的master 分支進行合并,
這里 git merge origin master 可以和 git merge origin/master 進行對比
或者可以對比一下 git pull origin master 對比一下,你是不是會有新得體會,
我們或許可以再看一下 progit 上面對 遠程倉庫的最新的解釋:
遠程分支(remote branch)是對遠程倉庫中的分支的索引,它們是一些無法移動的本地分支;只有在 Git 進行網路互動時才會更新,遠程分支就像是書簽,提醒著你上次連接遠程倉庫時上面各分支的位置,
其實:
在clone完成之后,Git 會自動為你將此遠程倉庫命名為origin(origin只相當于一個別名,運行git remote –v或者查看.git/config可以看到origin的含義),并下載其中所有的資料,建立一個指向它的master 分支的指標,我們用(遠程倉庫名)/(分支名) 這樣的形式表示遠程分支,所以origin/master指向的是一個remote branch(從那個branch我們clone資料到本地),但你無法在本地更改其資料,
同時,Git 會建立一個屬于你自己的本地master 分支,它指向的是你剛剛從remote server傳到你本地的副本,隨著你不斷的改動檔案,git add, git commit,master的指向會自動移動,你也可以通過merge(fast forward)來移動master的指向,
我們通過 git branch -a 可以看到所有分支:
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
可以發現:master 就是本地分支, origin/master 指得就是遠程分支,origin/master 指得是最近一次fetch 拿下來的最新版本,

上面這個圖就可以很好得講解,我們git 所合并得是commit. git merge origin master 指得是將本地庫所關聯的遠程倉庫對應的commit id 來和本地master進行合并,
而: 本地遠程倉庫記錄檔案是:.git\refs\remotes\origin\master 本地倉庫記錄的檔案是:.git\refs\heads\master
根據 sean-zou 的博客我們可以知道:
1、git fetch只會將本地庫所關聯的遠程庫的commit id更新至最新
2、git pull會將本地庫更新至遠程庫的最新狀態
所以 git fetch 和 git merge 共同效果并不完全等同于 git pull
或者用英文來定義一下 fetch 和 pull 更為明白:
- git fetch is the command that says “bring my local copy of the remote repository up to date.”
- git pull says “bring the changes in the remote repository where I keep my own code.”
所以可以這么 理解orgin 或者 orgin/master 這個只是遠程倉庫在本地倉庫的一個指標,我們可以使用 git fetch 命令來進行更新,
所以在進行merge 的時候 不要忘了先進行git fetch 進行更新到最新的遠程倉庫,
我們借用OoBa的一個圖,他詳細得對比了pull 和 fetch,merge ,當然更為詳細的內容可以參考《ProGit》一書,

參考文獻:
1. http://www.zhanglian2010.cn/2014/07/git-pull-vs-fetch-and-merge/
2. https://git-scm.com/book/zh/v1/Git-分支
3. https://blog.csdn.net/a19881029/article/details/42245955
4. 《ProGit》- v2.1.8
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225614.html
標籤:其他
