Git快速入手 - 使用Git Bash


Git分散式版本控制軟體使用簡單功能豐富,支援windows/macOS/Linux平台,

操作上可使用Git Bash(console指令式),Git GUI(圖形化介面)

GUI也有不少第三方免費/付費的版本像 Sourcetree,GitHub Desktop,我倒覺得官方的就很好用(如下圖)



Git官網有相當完整且豐富的多國語言使用手冊,建議有時間真要閱覽一遍



Git安裝 - Windows

官網下戴安裝檔https://git-scm.com/download/ (目前2023年10月最新版本2.42.0)

然後就一路無腦Next安裝,完成內容如下

預設安裝路徑 C:\Program Files\Git



初次設定

第一次使用須要先設定 使用者名稱 和 e-mail 

執行 Git Bash 啟動Git,輸入

$ git config --global user.name "名稱"

$ git config --global user.email 郵件位置

--global設定會儲存在C:\Users\使用者帳號 的 .gitconfig

完成後可用指令查看結果 (包含C:\Program Files\Git\etc\config 的設定)

$ git config --list



專案建立

1. 建立一個資料夾,滑鼠右鍵New > Folder,或在Git Bash用mkdir隨你高興

2. Git Bash路徑切入Folder,輸入指令

$ git init

建立project1的Git repository(儲存倉),資料夾內會多一個 .git 的隱藏資料來,所有project1資料

夾內檔案的變化(新增/修改/刪除)都會儲存在 .git 裡頭



新增檔案

3. 丟個隨意檔案到project1資料夾內,然後輸入指令查看repository狀態

$ git status

剛丟入的檔案被警示為 Untracked files,提醒使用者使用指令 git add 把檔案加入追蹤


4. 輸入指令

$ git add hello.c

$ git add .

小點數的功能等同 -A, --all 指所有 Untracked files


檔案已轉為staged,仍須要提交commit確認列入repository的tracking list,輸入指令

$ git commit -m "注解"


這就完成新增檔案時所須要的操作,如果已經tracking的檔案修改或刪除,步驟也是 add 再提交 commit



Git專有名詞解釋

Local Repository本地儲存庫:個人電腦上建立的Git專案資料夾

Working Directory工作區:儲存庫有檔案異動時(新增/修改/刪除)時都將列在工作區使用者確認

Staging Area預存區:工作區的異動被確認後改為 Staged 存在Staging Area,提交commit後會產生

新的commit節點並清除預存區

Working tree:指Working Directory + Staging Area

Remote Repository:遠端儲存庫,像Github或其它雲端平台

Untracked files:初次加入Repository沒有被Git追蹤控管

Changes not staged for commit:己被追蹤,再次被修改/刪除,會被丟回工作區

Changes to be committed:工作區的檔案 git add後移至 Staging Area 等待提交

Committed:Staging Area的檔案執行 git commit後,清除working tree,產生新的commit


Git的操作指令及流程基本如下圖



每提交一次 git commit 就會產生新的commit節點,Git版本控制就是藉由這許多節點來達成 回溯/還原 分支/版本

commit number每個節點的id,用于還原

HEAD:目前使用者所處的分支及commit節點

main:分支名稱

origin/main:遠端repo所處的分支

origin/HEAD:遠端repo HEAD所在的commit


$ git log 

可以查看Repository所有修改的歷史記錄,每個commit number,HEAD位在分支main


這是以Sourcetree顯示Repository整個歷史,

可以在任意節點產生分支branch,貼上標籤tag





Git指令



指令 Comment
clone 複製repository到本地
init 建立空的Git repository儲存庫
add 添加staged files
mv 檔案移動/更名
restore 撤銷staged files
rm 檔案刪除
bisect
diff
grep 檢索文件文字
log 查看歷史commit logs
show 顯示當前commit的內容
status 查看Repository狀態
branch 查看分支
commit 提交/確認變更至repository
merge 分支/遠端合併
rebase
reset 重置HEAD所在commit狀態
switch 切換分支
checkout 切換分支(功能上比switch強大)
tag
tag 查看標籤
fetch 確認遠端是否有更新
pull 從remote下戴/合併至local
push 上傳至remote
remote 遠端repo操作
--version 查看Git版本
clean 移除未追蹤的文件


git init


建立repository儲存庫,路徑切到folder最上層,產生 .git 的專案夾(隱藏)

$ git init



git status


查看完整的working tree狀態

$ git status


查看簡潔的working tree狀態

$ git status -s



第一行綠色是Staging Area,第二行紅色為Working Directory

M:修改,    D:刪除,    ??:新增未追蹤

沒有要確認/提交的需求:nothing to commit, working tree clean

新增文件:Untracked files

文件修改:Changes not staged for commit - modified

刪除文件:Changes not staged for commit - deleted



git add


repo資料夾內任何有變化的檔案都會在被列在working directory,須指令 git add 確認並改為staged files

$ git add <file name>

一個個檔案確認太慢,在add後加參數dot或--all全部異動確認

$ git add .

$ git add --all



git restore


回溯/還原處于Working Directory,Unstaged狀態的文件 (對新增文件Untracking files無效)

git restore <file name>

git restore .

回溯/還原處于Staging area,staged files狀態的文件至Working Directory為Unstaged files

git restore --staged <file name>



git clean


刪除repo資料夾內處Untracked files

git clean -f



git commit


提交staged文件到repo列入追蹤並新增commit

git commit -m "<comment>"

這個指令等於git add + git commit;但對新增文件無效

git commit -m "<comment>"

在HEAD所在的commit加入新的staged

git commit --amend



git log


查看所有標籤

git tag

新增標籤,tag在當前HEAD所在commit上

git tag -a <tag name> -m <comment>

新增標籤在指定的commit上

git tag -a <tag name> -m <comment> <commit number>

刪除標籤

git tag -a <tag name>



git rm


解除追蹤,保留檔案

git rm --cached <file name>

解除追蹤,刪除檔案

git rm -f <file name>



git branch


查看所有分支

git branch

下圖列出有三個分支,目前HEAD在分支main


刪除分支,merge後才可刪除分支

git branch -d <branch name>

強制刪除分支

git branch -D <branch name>



git switch


建立新的分支,並切換到新分支上

git switch -c <branch name>

切換到指定的branch上

git switch <branch name>

切換到指定的tag

git switch --detach <tag name>



git checkout


HEAD回到上個commit節點

git checkout HEAD^

git checkout HEAD~1

HEAD定位到某個commit節點

git checkout <commit number/tag name/branch name>



git reset


清除staging area所有staged files,退回working directory,commit會消失(小心使用)

git reset

取消head所在commit的內容,並退回到上個commit (不影響repo資料夾內的文件)

(因為本來commit的內容被取消, working directory會多出unstaged file)

git reset HEAD^

git reset HEAD~1

head回到上個/指定的commit版本(repo資料夾的文件內容也會變動)

git reset --hard HEAD^

git reset --hard HEAD~1



git remote


確認local repo是否有註冊遠端伺服器的路徑

git remote -v

註冊遠端伺服器,origin是自行定義路徑的名稱

git retmoe add origin <url>

EX:git retmoe add origin https://github.com/nios71/project_2.git



git clone


從雲端拷貝到local

git clone  <url>

EX:git clone https://github.com/user_name/repository_name



git fetch


確認雲端是否有更新

git fetch



git merge


配合git fetch融合更新的部分到local repo

git merge



git pull


等於fetch + merge

git pull



git push


上傳到雲端伺服器,branch name相同遠端可不寫

git push <url> <local branch name><remote branch name> 

ex:git push origin master:master

ex:git push origin master






忽略檔案變更

在repo folder內創建名為 .gitignore 的檔案,內容列表的檔案Git都會忽略變更,內容示意如下

# 不要追蹤檔名為 .a 結尾的檔案

*.a

# 但是要追蹤 lib.a,即使上面已指定忽略所有的 .a 檔案

!lib.a

# 只忽略根目錄下的 TODO 檔案,不包含子目錄下的 TODO

/TODO

# 忽略 build/ 目錄下所有檔案

build/

# 忽略 doc/notes.txt,但不包含 doc/server/arch.txt

doc/*.txt

# 忽略所有在 doc/ 目錄底下的 .pdf 檔案

doc/**/*.pdf

#忽略檔名/資料夾名稱帶特定字元

*特定字元*


# : 表示註解

/ 結尾:代表目錄

[] : 表示匹配中括弧內的任一個字元

! : 反向規則



Github

GitHub是使用Git作為版本控制軟體的線上軟體原始碼代管服務平台,

當然使用者也可以架設自已的雲端Git管理平台

這邊演示在Github建立一個Repository,下戴到本機,修改,再上傳


1. 第一步當然在Github (https://github.com/)註冊帳號

2. 點擊 New repository 創建儲存庫,

如果你希望這個儲存庫做為網頁使用,名稱須定為 <你的Github使用者名稱>.github.io

如 mygit71.github.io,然後就可以看到一個新的(空空的)Repository



裡面有幾項很重要的訊息,它告知了你上傳/下載所需要的https或SSH地址,以及如何從本機上傳文件到Github


現在Github(雲端)已經有一個名為 者用者名.github.io 的repository

但本機沒有,要嘛使用上圖 git init 的方式在本機建立同名的repository,或者直接從Github clone複製到本機


3. 這裡我使用clone複製到本機

$ git clone https://github.com/<user_name>/<user_name>.github.io.git

現在本機就會出現repo資料夾,Git Bash路徑切到資料夾內,使用 git status 確認這是個Git repository


4. 產生一個 index.html,並且加入repository

T0494@T0500-NB MINGW64 ~/Desktop/mygit71.github.io (main)

$ echo "Hello world!" > index.html


T0494@T0500-NB MINGW64 ~/Desktop/mygit71.github.io (main)

$ git add .

T0494@T0500-NB MINGW64 ~/Desktop/mygit71.github.io (main)

$ git commit -m "add file index.html"


T0494@T0500-NB MINGW64 ~/Desktop/mygit71.github.io (main)

$ git status

On branch main

Your branch is based on 'origin/main', but the upstream is gone.

(use "git branch --unset-upstream" to fixup)


nothing to commit, working tree clean


5. 這裡先為遠端Github的地址建立一個代號origin,之後就不必每次都輸入一串字

git remote add origin https://github.com/<user_name>/<user_name>.github.io.git

可用 remote -v 確認是否完成,或到資料夾查看 ~/.git/config 內容

git remote -v


6. 把本機repository同步到Github

git push

去刷新(F5)你的Github頁面就可以看到檔案新增到雲端


7. 建立你的網頁位址,進入Github頁面,點擊 About 右側的齒輪

<使用者名稱>.github.io 這就是你的網站位址,完成後輸入此位址就能看到 Hello world! 的頁面





參考資料來源 https://git-scm.com/