0%

[Git] Git 安裝及使用

Git

簡介

在開發專案時,版本控制是很重要的,透過版本控制系統可以紀錄檔案修改的歷史紀錄、追蹤檔案修改前後的差異、回復到特定版本的檔案內容。若修改後發生問題,也能夠追蹤修改的部分,方便地找出是哪個部分導致了問題的發生。

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 # 設定是否自動將LF(\n)轉為CRLF(\r\n)
$ git config --list # 檢查目前的設定

# alias
$ 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

1
$ git init

忽略部分檔案

建立 .gitignore 檔案,並編輯其內容:

1
$ vim .gitignore
1
2
3
# in .gitignore
data/
node_modules/

Status

1
2
$ git st                        # 檢查狀態
$ git diff <file_name> # 檢查檔案修改的部分

檔案追蹤

1
2
3
$ git add <file_name>           # 增加
$ git reset <file_name> # reset已追蹤的檔案
$ git rm --cache <file_name> # 刪除, 加上--cache則不會刪除原檔案

Commit

1
2
3
$ git ci -m 'Commit message.'   # 提交檔案
$ git log # 檢查提交的歷史紀錄
$ git ci --amend # 修改最近的commit

Remote

1
2
3
4
$ git remote -v                         # list remote repository
$ git remote add <name> <repo url> # 新增remote repository
$ git remote remove <name> # 刪除remote repository
$ git remote set-url <name> <repo url> # 修改remote repository url

Push

1
$ git push <name> <branch>              # push到remote repository, -f: 強制push

Clone

1
$ git clone <repository> [<directory>]  # 複製remote repository

Pull

1
$ git pull <name> <branch>              # 從遠端repository pull最新的內容到local repository

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>]         # 建立branch, base:  從哪個分支切出來的
$ git branch # 顯示branch列表, 並顯示目前所在的 branch

刪除Branch

1
$ git branch -d <branch>

切換Branch

1
2
3
4
5
$ git checkout <branch_name>

# -b: 可以同時建立和切換
# $ git checkout -b <branch_name> [<base>]

執行 checkout 之後,工作目錄裡的檔案會根據切換到不同的分支而呈現該分支最後提交的內容。而 checkout 之後的提交,則屬於切換後的分支的。

HEAD & Stash

  • HEAD
    • 代表當前分支的最新提交名稱
    • 在建立新的數據庫時,Git 會預設 HEAD 指向 master 分支。
  • Stash
    • Stash 是暫時儲存檔案修改內容的區域。
    • Stash 可以暫時儲存工作目錄還沒提交的修改內容,可以在事後再取出暫時儲存的修改,應用到原先的分支或者其他的分支中。

合併Branch

Topic 分支完成作業後,必須合併到主要分支 (Integration branch),合併分支可以使用 mergerebase

Merge
1
2
3
$ git checkout <main_branch>        # 切換到要合併的主要 branch
$ git merge --no-ff <branch_name> # 將指定的 branch 合併到當前使用的 branch
$ git merge --abort # 取消 merge

--no-ff 不要做 fast-forward 的動作。 Fast-forward 是指當被 merge 對象(branch_name)是目前分支(main_branch)的 child 時, merge 後會完全看不出來有 merge 過。

  • 修改內容的歷史記錄會維持原狀,但是合併後的歷史紀錄會變得更複雜
  • 如果在同一行文字進行修改,則會產生衝突
  • 解決合併衝突: 修改發生衝突的地方,之後再 commit 一次
Rebase
1
2
$ git checkout <branch_name>    # 切換到要合併的次要 branch
$ git rebase <main_branch> # 更改次要 branch 的 base (改為 main_branch)
  • rebase 可以看成是修改某個 branch 的參考基準 (base), 把目前分支的 commit 接到另一個分支後面 (通常是 main_branch ).

  • 合併後的歷史記錄會比較清楚簡單,但是會比使用 merge 更容易發生衝突。

  • 只能用在還沒有 push 的情況下。

  • 解決合併衝突: 修改發生衝突的地方,修改好之後,如果要繼續 rebase 操作,則在 rebase 後加上 –continue,如果要取消 rebase 的話,則加上–abort.

    1
    2
    3
    $ git add file.txt        # file.txt 為發生衝突的檔案, 修改好之後再加入
    $ git rebase --continue # 繼續 rebase
    $ git rebase --abort # 取消 rebase

參考資料