簡介
在開發專案時,版本控制是很重要的,透過版本控制系統可以紀錄檔案修改的歷史紀錄、追蹤檔案修改前後的差異、回復到特定版本的檔案內容。若修改後發生問題,也能夠追蹤修改的部分,方便地找出是哪個部分導致了問題的發生。
Git 是一個分散式的版本控制系統,由 Linus Torvalds 開發,一開始是為了管理 Linux Kernel 原始碼,後來設計出 Git 版本控制系統,因為它的分散式、效能好、支援本地存取以及無痛分支的特性,近年來受到許多人的喜愛。
安裝
On Linux
1
| $ sudo apt-get install git
|
On Windows
可以直接從Git官方網站下載,安裝後記得在系統環境變數的 PATH
中加上 <Git install path>/bin
才能使用 git 指令。
初始設定
1 2 3 4 5 6 7 8 9 10 11 12
| $ git config --global user.name "username" $ git config --global user.email "email" $ git config --global core.editor vim $ git config --global merge.tool vimdiff $ git config --global core.autocrlf false $ git config --list
$ git config --global alias.co checkout $ git config --global alias.br branch $ git config --global alias.ci commit $ git config --global alias.st status
|
如果想要不需要密碼就能夠操作 GitHub 專案,可以參考[GitHub] 免密碼 push/pull/clone 操作專案.
常用指令
建立新的 Repository
忽略部分檔案
建立 .gitignore
檔案,並編輯其內容:
Status
1 2
| $ git st $ git diff <file_name>
|
檔案追蹤
1 2 3
| $ git add <file_name> $ git reset <file_name> $ git rm --cache <file_name>
|
Commit
1 2 3
| $ git ci -m 'Commit message.' $ git log $ git ci --amend
|
Remote
1 2 3 4
| $ git remote -v $ git remote add <name> <repo url> $ git remote remove <name> $ git remote set-url <name> <repo url>
|
Push
1
| $ git push <name> <branch>
|
Clone
1
| $ git clone <repository> [<directory>]
|
Pull
1
| $ git pull <name> <branch>
|
Branch
為了將修改記錄的整體流程分開儲存,讓分開的分支不受其他分支的影響,所以在同一個數據庫裡可以同時進行多個不同的修改。
Master branch
在數據庫進行最初的提交後,Git 會建立一個名為 master 的分支。之後的提交在切換分支之前都會增加在 master 分支裡。
Integration branch
- 新的分支會建立在它的上面,而且 Integration 分支是為了可以隨時建立發布版本的分支。
- 如果要進行更改的話,最好先建立 Topic 分支並在上面做操作。
- 通常大家會將 master 分支當作 Integration 分支使用。
Topic branch
- 為了開發功能或修復錯誤之類的任務所建立的分支。
- 若同時進行多個任務時,您必須建立多個的 Topic 分支。
- Topic 分支是從穩定的 Integration 分支上建立的,完成作業後,要將 Topic 分支合併到 Integration 分支。
如何在開發流程中應用 Branch 可以參考另一篇文章: Git Flow 開發流程.
Branch常用指令
建立Branch
1 2
| $ git branch <branch_name> [<base>] $ git branch
|
刪除Branch
1
| $ git branch -d <branch>
|
切換Branch
1 2 3 4 5
| $ git checkout <branch_name>
|
執行 checkout
之後,工作目錄裡的檔案會根據切換到不同的分支而呈現該分支最後提交的內容。而 checkout
之後的提交,則屬於切換後的分支的。
HEAD & Stash
- HEAD
- 代表當前分支的最新提交名稱
- 在建立新的數據庫時,Git 會預設 HEAD 指向 master 分支。
- Stash
- Stash 是暫時儲存檔案修改內容的區域。
- Stash 可以暫時儲存工作目錄還沒提交的修改內容,可以在事後再取出暫時儲存的修改,應用到原先的分支或者其他的分支中。
合併Branch
Topic 分支完成作業後,必須合併到主要分支 (Integration branch),合併分支可以使用 merge
或 rebase
。
Merge
1 2 3
| $ git checkout <main_branch> $ git merge --no-ff <branch_name> $ git merge --abort
|
--no-ff
不要做 fast-forward 的動作。 Fast-forward 是指當被 merge 對象(branch_name)是目前分支(main_branch)的 child 時, merge 後會完全看不出來有 merge 過。
- 修改內容的歷史記錄會維持原狀,但是合併後的歷史紀錄會變得更複雜
- 如果在同一行文字進行修改,則會產生衝突
- 解決合併衝突: 修改發生衝突的地方,之後再 commit 一次
Rebase
1 2
| $ git checkout <branch_name> $ git rebase <main_branch>
|
rebase 可以看成是修改某個 branch 的參考基準 (base), 把目前分支的 commit 接到另一個分支後面 (通常是 main_branch ).
合併後的歷史記錄會比較清楚簡單,但是會比使用 merge 更容易發生衝突。
只能用在還沒有 push 的情況下。
解決合併衝突: 修改發生衝突的地方,修改好之後,如果要繼續 rebase 操作,則在 rebase 後加上 –continue,如果要取消 rebase 的話,則加上–abort.
1 2 3
| $ git add file.txt $ git rebase --continue $ git rebase --abort
|
參考資料