1. 程式人生 > >git 的 origin 的含義

git 的 origin 的含義

是你 app 命令 但是 查看 詳細 遠程倉庫 fig 參考文獻

我們從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

git 的 origin 的含義