到這裡,我們對於 git 本身已經介紹的差不多了。
接下來我們要分享的是遠端倉庫的部分。
之前的 git 都是在自己的電腦上運作,但實際與伙伴開發或者專案應該都是放在主機當中的。
像是 github 或自己公司的網站主機等等。
所以我們要在主機當中建立一個遠端倉庫,平常在自己的電腦寫程式,完成後再推到主機的倉庫,
然後從正式環境把倉庫的程式拉回來完成更新。
我們就以我家的檔案下載平臺為例,分享一下操作的過程。
準備
首先,我們要先建立好遠端倉庫,讓我們可以從電腦把資料推上去或拉回來。
遠端倉庫只要建立一次,以後就可以一直使用。
使用 git 推或拉的機制其實是透過 ssh 的連線,所以主機本身的 ssh 伺服器需要先架設好。
我們這邊以 git 教學為主,ssh 的部分就不多說了。
當然,主機也要裝好 git 套件,就像我們當時安裝了 windows 版的 git 那樣,現在只是改成 linux 版而已。
所以我們要準備的就兩件事:
- 主機架設好 ssh server
- 主機安裝好 git
建立遠端倉庫資料夾
我們使用 ssh 登入檔案下載平臺的主機,打算將遠端倉庫的資料夾叫做 repo
並且放在 /home 資料夾下面。
logo@gaga:~$ cd /home
logo@gaga:/home$ sudo mkdir repo
[sudo] password for logo:
logo@gaga:/home$ cd repo
logo@gaga:/home/repo$
上面是 linux 的指令,已經操作 git bash 一陣子的我們應該不陌生,只差在 linux 需要執行權限時的 sudo 並輸入密碼而已。
我們已經在 /home 下建立了 repo 的資料夾,但目前他還是一個很單純的空目錄,跟 git 完全扯不上關係。
因為需要在 repo 寫入資料,所以 repo 的資料夾的權限和擁有者都需要設定好,至少自己要能存取,如果有其他伙伴合作群組的話也要考慮一下。
大致上就是 chown 跟 chmod 兩個 linux 指令吧。
初始化遠端倉庫
想要當成遠端倉庫,需要先初始化,也就是讓這個資料夾跟 git 開始關連,
就像我們當初在 windows 使用 git init 讓資料夾開始可以使用 git 的道理有點類似,
只是這次是倉庫,而不是 client 端。其實就是多了個 --bare
參數而已。
# 我們切換到 /home/repo 遠端倉庫的資料夾下 並使用 git init --bare 來初始化 repo 資料夾
logo@gaga:/home/repo$ git init --bare
Initialized empty Git repository in /home/repo/
# 看看有什麼東西在裡面了
logo@gaga:/home/repo$ ls
branches config description HEAD hooks info objects refs
有這些就是成功囉。
提醒一下,如果有其他伙伴合作,記得 repo 裡面的權限要設定一下,因為大家都會把資料寫入該資料夾,所以都要有寫入的權限。
專案本地提交
接著,我們的檔案下載平臺還沒有 git 機制,所以也要把他弄好,這部分跟 windows 一樣。
就是切換到檔案下載平臺的程式所在資料夾做這幾件事:
- git init
- git add .
- git commit -m '第一次提交'
初始化、記錄存檔與本地提交。
因為第一次提交,可能裡面有很多檔案與資料夾,就會需要一段時間,
如果有什麼不想上傳的,就在 .gitignore 設定。
# 看一下正式環境的狀態
logo@gaga:~$ git log -1
commit 692839b484e0b7e68046520aa8d68a84826d54ed
Author: logo <logo@gaga.tw>
Date: Sun Apr 19 13:16:36 2020 +0800
第一次提交
設定本地到遠端倉庫的連結
我們需要在正式環境告訴 git 要推到哪個倉庫,或者要從哪個倉庫來拉取資料。
因此需要設定一下,在正式環境的資料夾下:
logo@gaga:~$ git remote add origin gaga.tw:/home/repo
- remote 遠端相關指令
- add origin 增加 origin 這個名稱當作倉庫的代號,名字可以自己取
- gaga.tw:/home/repo 倉庫的位置,包括 dns 與倉庫的絕對路徑,也可以用 ip
推上倉庫
專案做完第一次的本地提交後,我們要把他推到倉庫去,所以都在同一臺主機中。
logo@gaga:~$ git push origin master
The authenticity of host 'gaga.tw (114.34.178.107)' can't be established.
ECDSA key fingerprint is SHA256:aCIuTdLtDzt4IFQF+l/F4SGlBnuyLdq4Gz79Iw/ayvg.
Are you sure you want to continue connecting (yes/no)? yes # 確定要連線
Warning: Permanently added 'gaga.tw,114.34.178.107' (ECDSA) to the list of known
hosts.
logo@gaga.tw's password: # 輸入 ssh 連線密碼
Counting objects: 189, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (185/185), done.
Writing objects: 100% (189/189), 194.72 KiB | 0 bytes/s, done.
Total 189 (delta 74), reused 0 (delta 0)
remote: Resolving deltas: 100% (74/74), done.
To gaga.tw:/home/repo
* [new branch] master -> master
- push 推上倉庫,因為剛剛用 remote 設定好要推到哪邊了,所以只要這樣下指令就可以了
- origin 就是剛剛設定的倉庫代號
- master 就是目前的分支,一開始建立預設是 master 主幹道
透過上面的指令我們把正式環境的程式推到遠端倉庫去了。
本地協做
再來,我們是要在自己的電腦上開發程式,因此我們回到電腦端,
把倉庫的專案 clone 一份回來:
# 切換到 D 槽
$ cd /d
# 把專案 clone 回來
$ git clone logo@gaga.tw:/home/repo download
Cloning into 'download'...
logo@gaga.tw's password: # 輸入 ssh 密碼
remote: Counting objects: 189, done.
remote: Compressing objects: 100% (111/111), done.
remote: Total 189 (delta 74), reused 189 (delta 74)
Receiving objects: 100% (189/189), 194.72 KiB | 3.42 MiB/s, done.
Resolving deltas: 100% (74/74), done.
- clone 就是完整複製一份
- logo@gaga.tw:/home/repo 帳號@位置:倉庫路徑
- download 複製回來要放在 download 資料夾,不存在的話他會自己新增
我們切換到 download 資料夾下看一下 log
$ git log -1
commit 692839b484e0b7e68046520aa8d68a84826d54ed (HEAD -> master, origin/master,
origin/HEAD)
Author: logo <logo@gaga.tw>
Date: Sun Apr 19 13:16:36 2020 +0800
第一次提交
就算是他自己新增的資料夾,也會幫我們初始化,看起來沒問題。
開發流程
最後,我們說明通常的開發方式與流程,現在每個要一起開發檔案下載平臺的伙伴都可以 clone 一份回去,
然後修改程式,本地提交,最後加上一個動作,就是把專案推到倉庫:
# 我修改了一些程式
$ git add .
$ git commit -m '修正寄信錯誤問題'
[master 5204237] 修正寄信錯誤問題
1 file changed, 2 insertions(+), 2 deletions(-)
# 在本地端測試都沒問題了就可以推到倉庫
$ git push origin master
logo@gaga.tw's password: # 輸入 ssh 密碼
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 409 bytes | 409.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0)
To gaga.tw:/home/repo
692839b..5204237 master -> master
然後,我們到主機端的正式環境,將倉庫的專案拉回來,也就是更新正式環境的程式:
logo@gaga:~$ git pull origin master
logo@gaga.tw's password: # 輸入 ssh 密碼
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From gaga.tw:/home/repo
* branch master -> FETCH_HEAD
692839b..5204237 master -> origin/master
Updating 692839b..5204237
Fast-forward
include/def_func.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
logo@gaga:~/www/download$ git log -1
commit 5204237f746438d67e5ac0136764cb01597551d9
Author: Logo Kuo <logo@forblind.org.tw>
Date: Sun Apr 19 14:12:20 2020 +0800
修正寄信錯誤問題
這樣正式環境的程式才算更新完成,保險點就再做一次測試看有沒有什麼問題。
以後的開發流程就會是:
- 先從遠端倉庫把最新的專案拉回本地端
- 在本地電腦寫程式
- 在本地測試程式
- 測試完成後推上遠端倉庫
- 到主機的正式環境將專案從倉庫拉回來更新
- 在正式環境測試程式
所以正式環境只做 pull 的動作,不要直接去改正式環境的程式,這樣太危險了,
因為在正式環境修改程式,就只能在正式環境直接測試,這樣系統一有問題整個就是大亂。
一定要在自己的開發端寫程式並測試完成後推到倉庫,然後正式環境選個良辰吉時把專案拉回來更新。
比較大的系統要先發更新公告或按照更新時間或流程,不能隨時亂更新。
如果有和其他伙伴合作的專案,因為不確定對方有沒有推新版到倉庫,所以每次最好先拉回最新版專案再進行編輯。
當然,如果你編輯到一半,有人推新版上去,你在推上去時就會要你先 pull, 然後就會自動 merge,
有衝突就走之前分享過的衝突處理,處理完再 push 上去。
補充
在下 push 或 pull 時加上 -u
參數,之後只要直接輸入 git push
就可以了,
例如 git push -u origin master
這樣之後只要輸入 git push
就行了。
當然也可以自己建立 alias
而 pull 其實就是 fetch + merge 而已。