Git

Git

2022/06/29 (新增連結)

基本概念

Git是個分散式版本管理系統 (Version Control System),所以,使用Git的使用者都會擁有一份完整的程式碼。Git本身並沒有權限管控,所以,一般而言,會利用git server來協助權限管控。如果不想自己架設git server,可以使用git雲端服務。常用的git雲端服務有:githubgitlabbitbucket。這三個雲端服務的主要差別在於在github免費的專案都必須是公開的,所以,目前大部分的open source專案都可以在github上找到,也可以有免費的私密專案,但是,只能有三個成員。在gitlab上,目前不管是公開或私密的專案都是免費的。在bitbucket上,允許5個成員以下的小專案(不管是公開或私密)免費使用 (2017/4/11起提供教育單位免費免限制的使用)。Bitbucket在權限的管控上比較完整,有四個層級:Global、Project、Repository、Branch (詳參: 4 Levels of Bitbucket Server Permissions)。

組態管理在敏捷開發很重要,由於週期很短,所以,通常會進行持續性整合、持續性交付甚至DevOps,沒有組態管理工具,就很難進行持續性整合。當然,組態管理不是敏捷開發的專利,傳統的開發方法下,只要是開發人員的數量到了一定程度,就會使用組態管理工具。

Git - vscode.ppt

2022/04/28 (更新投影片)

設定

當使用git時,我們會有本地資料庫(local repository)及遠端資料庫(remote repository),通常我們會把遠端資料庫(remote repository)設在git server上。

首先,我們要先設定remote repository,可以使用githubgitlab。先要開一個帳號,接下來開一個專案。

接下來,要進行本地端的設定,首先,先安裝git。本地端可以下載git for Windows或者Download for macOS 。使用macOS時,如果已經安裝過XCode,git就已經安裝,可直接使用。如果安裝過homebrew,建議利用homebrew安裝,如果沒有,就透過binary安裝。

安裝好之後,要做一些設定,首先,在命令列下(如:git bash)設定使用者的名字與email。

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

要讓git了解這個專案是個git專案,就要先進行初始化。這時候,會產生一個.git的隱藏資料夾,在這裡面會有git所需要的檔案 (本地資料庫),如果沒有進行這個步驟,git就不認得這個專案。記得,這個動作只要做一次,重複進行會把原本的紀錄刪除重建。

$ git init

** 有時候,有些工具 (如:create-react-app)會自動把專案設定為git專案,就不需要進行初始設定。但是,要注意branch的名稱。

另外,要注意github以及gitlab產生新專案的預設主分支是main (過去是master),但是利用git init的時候,local的預設主分支是可能是master。所以,當我們要push main時,會有同樣的問題,因為local的分支的名稱是master。

$git push origin main

改local branch的名稱 (如:master到main)

$git branch -m master main

接下來就是連接遠端資料庫,這個指令的意思是設定遠端資料庫,add是新增一個遠端資料庫,origin是遠端資料庫的名稱 (你可以用其他的名稱),後面是遠端資料庫的URL。

$ git remote add origin https://gitlab.com/benwu/web.git

如果遠端的專案都已經設定好了,也可以先開一個空白的資料夾,利用clone複製遠端的專案

$ git clone https://gitlab.com/benwu/web.git

基本操作

基本上這些操作都可以利用編輯器裡的功能進行,也可以透過指令操作,我們來看一下常用的操作與對應的指令。

status

status可以看目前的狀態,對於初學者來說,可以比較清楚的理解目前的狀況

$ git status

add

接下來,進行git的基本操作,第一件事是設定哪些檔案已經完成 (staged)。通常會利用編輯器裡的功能,如果要利用指令,會使用git add,如果要將這個資料夾裡的所有檔案都設定為已經完成,可以下:

$ git add .

如果只是一個檔案 (如:index.html)

$ git add index.html

或者所有的html檔案

$ git add *.html

如果想知道那些檔案被加入,可以利用:

$ git status

commit

Commit是將剛剛的更動儲存到本地的資料庫,如果要利用指令,會使用git commit,並且會設定這次更動內容的註解,例如:「home page」。

$ git commit -m "home page"

遠端操作

管理remote

新增remote,請複製你的github/gitlab的連結 (如:https://gitlab.com/benwu/web.git)

$ git remote add origin https://gitlab.com/benwu/web.git

也可以clone remote (remote的預設名稱是 origin)

$ git clone https://gitlab.com/benwu/web.git

看目前所有已新增的remote

git remote -v

push

Push是將更動從本地資料庫送到遠端資料庫,注意,如果沒有設定好遠端對應的branch,會無法進行push,請利用upstream設定 (詳見:分支操作)。

$ git push

如果你有多個遠端,也可以指定遠端,例如:origin

$ git push origin

fetch

fetch是從遠端資料庫取得內容,注意,如果沒有設定好遠端,會無法進行fetch。

$ git fetch

如果你有多個遠端,也可以指定遠端,例如:origin

$ git fetch origin

pull

Pull是從遠端資料庫取得內容,並且進行合併,如果,注意,如果沒有設定好遠端(upstream),會無法進行pull,請利用upstream設定 (詳見:分支操作)。

$ git pull

如果你有多個遠端,也可以指定遠端,例如:origin

$ git pull origin

分支操作

一般而言,我們會將已完成的工作push到遠端資料庫讓大家使用,可是如果有人就是很白目,常常把沒完成的內容push上去,那怎麼辦呢? 比較容易的解決方法是利用分支。

新建及切換分支

新建分支的指令就是利用git branch,例如要加個ben的分支,可以:

$ git branch ben

切換分支

$ git checkout ben

或者,這時候,會從現在的分支建立一個分支,並且切換到該分支。

$ git checkout -b ben

如果想切換到其他的分支,例如:master

$ git checkout master

切換分支之後,所有的commit、push、pull就是針對該分支進行。

如果不清楚自己在哪個branch,可以利用git branch來看現在在哪個分支上:

$ git branch

看遠端的branch

$ git branch -r

修改內容後,執行push

$ git add .

$ git push

$ git commit -m "date added"

如果看到:

fatal: The current branch ben has no upstream branch.

To push the current branch and set the remote as upstream, use


    git push --set-upstream origin ben

push並設定upstream

$ git push --set-upstream origin ben

如果只要設定upstream

$ git branch --set-upstream-to=origin/ben ben

push特定的分支 (如:ben)

$ git pull origin ben

合併分支

當我們要把benwu合併到原本的master時,我們要先切換回master,再去進行合併:

$ git checkout master
$ git merge ben

如果有衝突,請先參閱解決衝突,解決衝突之後,才能完成merge。

接下來就可以push已經合併了ben的master

$ git push

conflict

rebase

workflow

常見問題

「error: src refspec xxxx does not match any」

可能的原因:

1.local沒有這個branch (可能打錯字)

$ git push origin mian

另外,要注意github以及gitlab產生新專案的預設主分支是main (過去是master),但是利用git init的時候,local的預設主分支是可能是master。所以,當我們要push main時,會有同樣的問題,因為local的分支的名稱是master。

$ git push origin main

改local branch的名稱 (如:master到main)

$ git branch -m master main

2.加上HEAD (『Git』git push相關與error: src refspec does match any解法)

$ git push origin HEAD:master

3.local跟remote名稱不一致 (Willy's Fish教學筆記 )

Local name : ZeWeiNote

Remote name : feature/ZeWeiNote

fast-forward (待修改)

「You are not allowed to force push code to a protected branch on」

當使用Gitlab時,為了保持某些branch(如:master)的完整性,系統會有protected branch的功能,第一、避免protected branch被任意產生,第二,避免protected branch被更動(push),第三、避免protected branch被強迫更動(force pushing),第四、避免protected branch被刪除。在setting下,選擇repository,下面可以找到protected branch的設定。

解決方案:1.設定開發者(developer)及管理者(masters)可以merge,這樣的話,所有的更動都應該,先新增branch,等確定之後,合併(m,erge)回master(最好的做法)。2.可以開發者(developer)及管理者(masters)可以push,這樣的話,還可以管制protected branch的產生與刪除。3.可以將該branch改為unprotected (最不好的做法)。

如何取消剛剛的commit?

(待完成)

如何取消剛剛的merge?

(待完成)

參考資料

Server

首先,要在git server上建帳號 並開好repository及設定好repository的權限,通常,每個repository會有一個URL,利用這個URL來存取repository。常用的雲端服務有: GitHub、Bitbucket及GitLab

github

gitlab

Client

git client有很多 (詳參: https://www.slant.co/topics/2089/~git-clients-for-windows)

Visual Studio Code **

Sourcetree

GitKraken

Katalon Studio

Eclipse

目前的Eclipse版本(Helios以上)已經內建git,以下就以Eclipse的內建功能為例說明相關步驟。

要先有一位同學(如:組長)先建立local repository,並將專案commit到local repository,然後再將local repository的內容push到remote repository (在git server上)。完成後,就可以在git server上看到專案的內容了。

其他同學會利用Import下載專案,首先,先選擇Import,Git/Projects from Git,因為目前還沒建立local repository,所以,先選擇Clone URI,選擇remote repository上的branch(例如:master)以及local repository的路徑。

當任何一位同學修改專案內容時,就可以進行Commit and Push,將更動的內容送到remote repository給其他同學,其他同學可以利用Pull下載最新的更動。也可以利用workspace synchronization進行同步,同時上傳也下載最新的更動,如果有多人同時更動同一檔案,也可以比對各版本的內容。

現在的版本管理軟體都支援分支(branch)的概念,原本是讓程式開發者能依據不同的使用者(如:公司或單位)開發不同的版本,不過,現在即使是只開發一個版本,也常使用分支。首先,每個repository會有一個稱為"master"的分支。通常,我們會維持master為最終穩定版本。為避免影響目前的最終穩定版本,當每位同學要開始進行修改時,會先產生一個新分支,當這個分支被完整測試後,再合併(merge)回master。這樣的話,就比較不會因為某一位同學push有問題的程式碼而造成大家都找不到最終穩定版本 (詳參: https://backlogtool.com/git-guide/tw/stepup/stepup1_1.html)。

參考資料 (待整理)

Git