iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1
Software Development

用樂高玩轉 GIT 版本控制系列 第 18

Day 18 - 讓我們一起來,談把儲存庫發佈到網路上 Push Remote

  • 分享至 

  • xImage
  •  

之前的幾天,談了許多在本地儲存庫的操作,一直都還沒提到該怎麼與其他人一同共用儲存庫,今天的主題會以發布到網路上為軸心,跟大家介紹關於把 GIT 儲存庫發佈到網路上這些事情。

如果在沒有電腦、網路,要共筆樂高手冊,我們會怎麼做?

假設我們現在沒有電腦,也沒有網路;但我們需要有一個共同儲存樂高手冊的環境,可以放多個專案,可能有人會想一起做一台直升機,於是建立了直升機專案;有人想一起做模型船就會有做模型船的專案;一起參加專案的人,都可以拿到樂高手冊目前每個步驟的編輯狀態。

如果我們有一個專案,要在這樣的環境與更多人一起協作,這時候我們可以怎麼做?細想了一下,可能會有這些步驟。

  1. 在這個共同儲存空間,申請一個新的位置,準備存放公開給一起參加專案的人的位置。
  2. 把目前有一些步驟的樂高手冊複製一份。
  3. 而後把複製好的這一份,放到共同儲存的這個空間。
  4. 之後如果我們還有新的步驟要更新,就只要把新的步驟複製到這個共用空間即可。

這時候,如果我們手上的這個專案,開始有不同版本的需求,有某一群人負責 A 版本的手冊,另外一群人負責 B 版本,那這兩群人在把新的步驟更新到共用儲存庫的時候要特別注意什麼事情?

  1. 在更新手冊的時候,一定會特別跟共用儲存空間說,目前新的這系列的步驟,是對應 A 或 B 版本。
  2. 而我們有不同版本之後,在與共用空間,取得其他人的共筆,我們就會特別去了解,目前看到的步驟是什麼版本的。

以上,就是我目前想到在沒有電、沒有網路的環境下,要怎麼跟一群人,在不同的空間,而一起完成一本樂高手冊。

那在 GIT 的環境與樂高手冊共用儲存空間怎麼對比呢?

共同儲存庫空間:

在有電、有網路的現代,我們所謂 GIT 共同儲存庫空間,也就是我們現在常見的 GitHub.comGitLab.com 等平台提供者。
在這邊,大家都可以申請自己的專案,作為儲存自己的 GIT 儲存庫。

不同的版本怎麼對應:

不同的版本,也就是 GIT 上的 branch 分支機制,在把本地儲存庫推送到共同儲存庫的時候,必須讓共同儲存庫知道你現在分享步驟 (commit) 的屬於什麼分支,對應共用儲存庫上的什麼分支。

1. 以 GitHub 為例,在上面開一個新的儲存庫

在 GitHub 的介面中,可以看到右上角的位置,有一個 + 號,在這邊可以找到「New repository」,點選後,只需要設定這個儲存庫 (Repository) 的名稱,而後設定這個儲存庫的「可視性」,在 GitHub 上,一般帳號的儲存庫可以區分為 Public (公開)及 Private(私密) 兩種,設定為私密,則一開始只有自己可以看到。

建立 Repository 過程 1

在目前的 GitHub 介面中,還可以連帶幫忙在初始檔案後,連帶新建立 README 檔案及忽略檔 (.gitignore) 及授權宣告檔 (license),如果是想先建立儲存庫後直接進行存取,也可以點選。但如果是既有的專案儲存庫要上傳進來,則建議不要。

在點選「Create repository」之後,可以看到以下的畫面:

建立 Repository 後的畫面

這個畫面有兩個重點,一個是儲存庫的位置如: git@github.com:mouson/ironman2019-01.git,另外一個是底下的主題,本地儲存庫與遠端儲存庫對應的方法。

2. 把本地的儲存庫與遠端的 GitHub 建立對應

在建立好儲存庫之後,可以看到,系統提示,當我們要推出一個已經存在的儲存庫,則可以執行以下指令。這些指令是什麼意思呢?

git remote add origin git@github.com:mouson/ironman2019-01.git
git push -u origin master

3. 宣告一個遠端儲存庫的位置:

git remote add origin git@github.com:mouson/ironman2019-01.git
  • git remote 在 GIT 上關於遠端儲存庫相關的指令都歸 git remote 管。
  • git remote add origin,新建一個遠端儲存庫,名字叫 origin
  • origin git@github.com:mouson/ironman2019-01.gitorigin 這個遠端儲存庫的實際路徑為 git@github.com:mouson/ironman2019-01.git

4. 跟儲存庫告知分支怎麼對應

在 GitHub 提供的範例指令中,還有一段:

git push -u origin master

這一段是什麼意思呢?

  • git push push 指令在做的事情,主要就是把本地儲存庫的資料推向遠端所使用。
  • push origin master 把目前的分支,推向 origin 這個儲存庫,(origin 這個儲存庫在哪裡,在上一個步驟已經設定。),推向儲存庫的哪裡?推向遠端儲存庫的 master 這個分支。
  • push -u origin master-u 是「set upstream」設定上游的意思,完整指令為「--set-upstream」,意思是說,在推向遠端的 master 分支後,也連帶的在本地建立本地分支與遠端分支的對應;當未來我同樣在 master 進行 git push 的時候,就不用再輸入 -u 後面的這一連串 origin master
  • 從上面的說明,可以得知,如果有需求把本地的 master 推向遠端的 develop 分支,也是可以的,並沒有一定 master 只能對應 master。

自此之後,可以看到,在遠端與本地的儲存庫,都擁有著一樣的分支,一樣的物件,一樣的 Commit,一樣的 HASH Code。所以我們也可以想像,Push 的功能,也就是把本地擁有的儲存庫物件,也在遠端的共用中心,複製一份。也因此一起使用這個儲存庫的人們,自然的,也就都擁有同樣的 GIT 物件、Commit、Hash Code。這也就是為什麼會有人說,因為 GIT 的特性,就算遠端的資料全損毀了,只要還有人有一份,也都還能夠還原,因為共同使用這個儲存庫的人,都有一模一樣的物件,再找一個地方 Push 出去就好。

一起使用這個儲存庫的人們,自然的,也就都擁有同樣的 GIT 物件、Commit、Hash Code

上圖,中間的畫面是本地 SourceTree 的線圖,兩旁則是 GitHub 上儲存庫的畫面。

5. 使用 SourceTree GUI 介面怎麼對應?

git remote add origin git@github.com:mouson/ironman2019-01.git
  • 首先在 SourceTree 介面的右上角,有一個設定(Setting) 按鈕,而後選擇「Remotes」選項,選擇「add」按鈕。
    新增遠端位置
  • 在畫面上「Remote name:」的部分,填入 origin
  • 接著複製 git@github.com:mouson/ironman2019-01.git 這一段,在「URL / path」的地方貼上,底下的資訊 SourceTree 就會自動地幫忙選填完成。
    設定遠端的路徑
  • 點選 「OK」按鈕完成新增。
    按鈕完成新增出現一個遠端路徑
git push -u origin master
  • 在畫面上選擇「Push」按鈕,可以跳出目前畫面中的選擇 push 的視窗。
  • 在畫面上,選擇要推向遠端的分支,如畫面框起來的 master 分支,選擇後 SourceTree 會預設對應遠端的 master,而畫面中提到的「Track?」則是上面所提到的-u/--set-upstream的概念。

設定遠端對應的分支及是否要追蹤

6. GIT 怎麼記錄這些資訊?

在本地的儲存庫上,其實存在的一個 .git 的隱藏資料夾,在這個資料夾裡頭存放著前面所提到的 GIT 物件等,也存放著一個放置 GIT 設定檔的文件,上面所做的設定,都記錄在 .git/config 這個檔案之中。

.git/config

如上檔案,可以發現三個區塊區 core、remote、branch。

  • remote 的部分就是實際紀錄遠端位置的地方,在這邊可以看到上面建立的 origin 這個位置,所對應的 url 遠端路徑在哪裡。
  • branch 也就是紀錄**本地 branch**這個分支,跟遠端的對應是remote = origin,也就是 origin 這個遠端。
  • branch 推出之後,要跟遠端的誰合併?merge = refs/heads/master 遠端的 master 這個分支。

總結:

至於,遠端分支與本地分支怎麼用圖解的,除了把本地分支推到遠端分支外,要怎麼跟遠端分支取得最新的版本呢?這是接下來要繼續講的。


上一篇
Day 17 - 能在一起無憂無慮多幸運,談 GIT 解衝突
下一篇
Day 19 - 與共同儲存中心開始溝通 談 git push 與 git fetch
系列文
用樂高玩轉 GIT 版本控制30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言