在 Day 18 的內容中,提到了可以使用 git push
指令把本地的儲存庫發送到共同的儲存庫中心,那麼共用儲存庫與本地儲存庫之間要怎麼溝通呢?
這個所謂的溝通,也可以把它想像成就是兩地儲存庫的物件同步,使本地與共用儲存庫都有一樣的 commit、一樣的 HASD Code、一樣的 GIT 物件。
git push -u origin master
的時候, GIT 的區域模型發生了什麼事情呢?首先在是 push
指令,會往設定的遠端 origin
發送
而後,因為 origin
參數後面帶了 master
所以到遠端後,會知道,目前發送過來的 GIT 物件,是要放在遠端上的 master
這個分支。
接著依序把目前本地有的物件送到遠端的 master
這個分支上。
接著為了方便記憶遠端分支上面的狀態,GIT 會在本地的儲存庫上,也新增一個紀錄遠端狀態的分支
,通常這個分支名稱會標示為 origin/master
,代表著遠端目前 master 分支,指在什麼位置。
直接使用 HASH Code 呈現的方法,可以想像,在 git push 完畢之後,在本地會建立一個 origin/master
貼紙,指在跟本地 master
分支一樣的位置。
git push -u origin master
之後,本地的分支大概會長這樣。就是多了一個分支貼紙。一樣的,我們使用 git push
這個指令,而因為上面以及使用了 -u
設定了本地 master
對應的遠端 origin
的 master
分支,所以只需要下 git push
指令,不再需要接其他參數。現在,本地因為有遠端目前的分支的狀態 (通常在 git push
之前,會至少先使用 git fetch
指令,取得遠端狀態,這邊先假設遠端沒有任何變化。),所以知道,目前本地比遠端多了一個 HASH D 這個 Commit,因此這時候只需要傳送 HASH D 到遠端,傳送完畢後,只需要把 origin/master
這個分支貼紙,往下移動到根本地 master
分支一樣的位置。
如果以動畫表示在 git push
之後,本地分支的變化,概略可以用底下的動畫表示。
git fetch
在 GIT 系統中,要跟遠端取得遠端多的物件,就是使用 git fetch
指令,這時候,因為目前操作的 master
分支已經在 git push
的時候,設定了對應,因此一樣不需要再設定其他參數。
要取得 Server 端新的物件狀態,可以使用 git fetch
指令。
當執行完畢 git fetch 指令之後,本地的 origin/master
分之,在取得 HASH D
之後,會連帶的把本地 origin/master
這個分支貼紙,往 HASH D 移動,完成 fetch 動作。
如果只看 git fetch 的本地 master 分支變化,概略如下動畫:
為什麼會把 git 與遠端溝通操作的過程留在 Day 20 才講,主要是因為,看完上面的說明之後,會發現,對於本地而言, GIT 與遠端的操作,無論是 git push
或是 git fetch
,對於本地,都只是一個分支貼紙的操作,所以在講與遠端溝通之前,先把 git merge
、git rebase
等指令先講了一次。
至於與遠端同步儲存庫物件、溝通時,如果遇到衝突該怎麼處理,就留待下一篇繼續說明。