使用 git 進行版本控管的一個好處是可以進行多人協作,團隊程式碼被放在如 GitHub、GitLab 之類的遠端空間,每位成員的裝置都可以把自己的版本「推」上去,或者把團隊最新的版本「拉」下來。
本篇文章將快速複習把本地檔案「推」上去、以及把遠端檔案「拉」下來的流程。
先在本地端一個經 git init
初始化的資料夾建立立一個名為 file.txt
的檔案,內容為 "Initial content"
:
echo "Hello World" > hello_world.txt
把這個檔案加進預存區:
git add hello_world.txt
再形成一個 commit:
git commit -m "Initial commit"
透過 git log
檢查,確認現在在本地端已經有一個 commit:
以 GitHub 為例,找到右上角(下圖紅色箭頭處)可以點選「New Repository」的按鍵:
此時 GitHub 會跳出新倉儲的設定頁面,包含:
-
取代)這些都設定好之後,就可以點擊下圖中藍色箭頭處的「Create repository」按鈕,建立一個 GitHub 遠端倉儲。
建立好的倉儲頁面如下:
依照遠端倉儲中的提示,我們可以用下列指令,在本地倉儲把遠端倉儲網址 https://github.com/ruifuhong/Day-7.git
命名為 origin
,這樣之後要對這個倉儲推拉,都不用再輸一遍網址(但記得裡面的 ruifuhong
要改成自己的 GitHub 帳號名稱):
git remote add origin https://github.com/ruifuhong/Day-7.git
這時再下 git push
指令如下:
git push origin main
我們就成功把本地端的 commit 推到遠端倉儲了:
把剛剛的遠端倉儲頁面重新整理,就可以看到原本在本地端的 commit(下圖黃色箭頭處)連同與該 commit 相關的檔案(下圖灰色箭頭處),都被推上去了:
現在只要對這個遠端倉儲有存取權限的人,都可以看到當中的 commit 及檔案,也可以把檔案拉到自己的本地端。
要拉到的本地端有兩種情況,一是還沒有這個資料夾、二是已經有這個資料夾。
使用的指令是 git clone
,後面加上遠端倉儲網址:
git clone https://github.com/ruifuhong/Day-7
整包遠端倉儲就被克隆下來了:
資料夾名稱就是遠端倉儲名稱 Day-7
,遠端倉儲的檔案也都被拉到本地端:
如果本地端已經有個資料夾,可以放要被拉下來的檔案(不一定要跟遠端倉儲名稱相同),則使用 git pull
指令。
現在我們在本地端做一個新的 git 資料夾,裡面沒有剛剛的檔案,例如我剛剛在 code/
資料夾,經過 cd ..
跳出之後再用以下指令做出名為 copy/
資料夾:
mkdir copy
接著進入 copy/
資料夾:
cd copy
這是一個新的資料夾,因此要操作 git 功能也要初始化:
git init
我們就可以把剛剛遠端倉儲的檔案拉下來了!不過因為在這個資料夾裡沒有設定 origin
,下 git pull
指令把檔案拉下來時,要把遠端倉儲完整網址輸入:
git pull https://github.com/ruifuhong/Day-7.git
這樣就拉下來了:
輸入 ls
或直接打開資料夾都可發現,原本在 code/
資料夾有的東西,在新建的 copy/
資料夾也能看到:
這邊我們是拉到一個全新的 git 倉儲,但在一般來說,會在本地端有舊版本專案時才會使用 git pull
,把遠端最新版本「同步(sync)」到本地端,如下個段落組員 A 下 git pull
的時間點。
假設剛剛 code/
資料夾屬於組員 A、copy/
資料夾屬於組員 B,組員 B 也可以在自己的本地端開發,之後推上遠端給組員 A 去拉。
例如組員 B 在本地端以下列指令開名為 feature
的分支:
git branch feature
接著切換到 feature
分支上:
git switch feature
在上面建立一個空的文字檔 feature.txt
:
touch feature.txt
把這個新建的 feature.txt
放到組員 B 本地倉儲的預存區:
git add feature.txt
再放到組員 B 的本地倉儲,形成 commit:
git commit -m "Add feature file"
再用 git push
推到同一個遠端倉儲,只是在 /code
這裡沒有設定 origin
,所以要輸入完整遠端倉儲網址:
git push https://github.com/ruifuhong/Day-7
新增的 featureB
分支與 feature.txt
檔案就被推上去了:
在遠端倉儲頁面也可以看到相關提示:
假設組員 B 或團隊任何一人想要把 feature
分支可以合併進 main
分支,就可以直接在遠端倉儲中,點擊上圖黃框處最右邊的綠色按鈕發 PR(pull request),來到以下頁面:
在上圖輸入關於這個 PR 的標題與說明後,點擊右下角的綠色「Create pull request」發起合併請求:
組長或任何有權限的人可以檢視這個 PR 的人,可以在上面給予回饋,接著決定選「Close pull request」把這個 PR 關掉,或者點「Merge pull request」許可這個合併,合併的話會新生成一個 commit(可以想成把 git merge
拉到遠端來做)。
現在假設我們允許合併,點選「Merge pull request」按鈕後跑出以下畫面,要我們輸入 commit 訊息:
我們直接使用預設的 commit 訊息,就點「Confirm merge」,我們就成功在遠端把 feature
分支合併進 main
分支了:
如果此時組員 A 在本地的倉儲輸入 git pull
指令(因為有設定 origin
,所以不用複製完整遠端倉儲網址):
git pull origin main
這樣就把剛剛合併完的分支都拉下來了:
因為遠端已經把 feature
分支合併進 main
分支,因此 git pull
之後「看起來」只會拿到 main
分支。
以上是模擬與遠端倉儲互動、以及與其他人協作的流程,如果對當中的操作仍不熟悉,可參考高見龍老師的下列文章複習:
往後我們將基於這些基礎,仔細觀察每個輸入指令後,git 裡面發生的事情。
以上層瓷器指令與遠端倉儲互動時,常用的指令包含:
git push
:把本地端倉儲推到如 GitHub、GitLab 之類的遠端倉儲。git clone
:本地端還沒有此倉儲任何內容時,把整包克隆下來。git pull
:本地端已有倉儲時,可透過此指令,把本地版本更新到與遠端同步。git merge
,過程中,團隊成員可檢視 PR 內容,決定是否允許合併,也可以給予回饋。