Mars's Blog

Git常用指令學習

一、說明

版本控制在軟體開發中非常重要,有了版本控制不但可以記錄軟體變動脈絡,還能多線開發、合併、摘取、回遡、差異比對等功能,在團隊合作中尤其重要。

版本控制用指令很多,在只介紹Git在開發中的常用指令。

二、環境準備

  • 於 GitHub 中建立 repository: git-learning

    • 登入Github並點選右上角+號,再選New repository
    • 填寫資料
  • 取得 repo: git-learning 的uri

    • 進入git-learning後點選 clone or download,並複製網址

      上圖採用ssh方式與git連線

三、指令介紹

環境設定

設定Git操作者的名子與信箱

git使用前,需設定作者資訊

1
2
$ git config --global user.name {我的名子}
$ git config --global user.email {我的信箱}

註:{我的名子},{我的信箱}代表變數,在此輸入Git操作者名子,信箱

語系設定

Linux環境下git操作需設定執行語系,以免看到亂碼

1
2
3
4
$ echo "export LESSCHARSET=utf-8;" | sudo tee -a ~/.bashrc
$ echo "export LESSCHARSET=utf-8;" | sudo tee -a /etc/bash.bashrc
$ echo "export LC_ALL=en_US.UTF-8;" | sudo tee -a ~/.bashrc
$ echo "export LC_ALL=en_US.UTF-8;" | sudo tee -a /etc/bash.bashrc

原因是 git log 預設是使用 less 這個工具來瀏覽,所以需要額外設定編碼。

編輯器

設定操作git編輯時使用的編輯器,推荐vim或vi

1
$ git config --global core.editor vim

將操作Git的編輯器設定成vim,如無vim可改用vi

與遠端協同工作

Git工作分本地端(local)、遠端(remote),自己在本地端的任何變更需推送(push)到遠端,其他人才可以獲取(fetch)自己的變動內容。

下載遠端 repository

下載遠端資源庫至本地端工作目錄中。

  • 指令 git clone
    1
    2
    3
    # 格式:git clone <repo> [<directory>]
    # 範例:
    $ git clone git@github.com:marshung24/git-learning.git
    • 克隆目標資源庫
    • 克隆成功後,可在執行目錄下看到剛剛克隆的專案目錄

推送至遠端

推送本地端變動至遠端。

  • 指令 git push
    1
    2
    3
    # 格式:git push
    # 範例:
    $ git push
    • 將本地commit推送至遠端伺服器
    • 強制推送:git push -f

獲取遠端記錄

獲取遠端的變動記錄。當他人有推送變動時,需使用本指令獲取最新記錄。

  • 指令 git fetch
    1
    2
    3
    # 格式:git fetch
    # 範例:
    $ git fetch
    • 當多人協同作業時,要看到其他人推送至伺服器的結果時使用 git fetch 取得

獲取並合併

  • 指令 git pull
    1
    2
    3
    # 格式:git pull <branch>
    # 範例:
    $ git pull master

    git pull 效果等於 git fetch 加 git merge

查看記錄

查看記錄

  • 指令 git log
    1
    2
    3
    # 格式:git log
    # 範例:
    $ git log

查看HEAD的移動記錄

  • 指令 git reflog
    1
    2
    3
    # 格式:git reflog
    # 範例:
    $ git reflog
    • 如果誤操作時,可用此找查之前的記錄
    • 有commit過的檔案被蓋掉,可通過git reflog、git reset還原

檔案變動管理

查看目前變動

  • 指令 git status
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 格式:git status
    # 範例:
    # 查看目錄下的檔案清單
    $ ls
    LICENSE README.md
    # 建立空檔案 index.php
    $ touch index.php
    # 在檔案 README.md 最後增加一新行,文字為test
    $ echo "test" >> README.md
    # 查看目前變動
    $ git status

    可看到一個檔案變動 README.md ,一個未處理檔案 index.php

暫存變動:

  • 指令 git add
    1
    2
    3
    4
    # 格式:git add <file>
    # 範例:
    $ git add README.md
    $ git status

    暫存變動,使用git status查看目前變動

暫存全部變動:
git add -u

不含未處理過的檔案

暫存全部變動:
git add .

含未處理過的檔案

暫存路徑變動: git add

含未處理過的檔案

取消暫存變動:

  • 指令 git reset HEAD
    1
    2
    3
    4
    # 格式:git reset HEAD <file>
    # 範例:
    $ git add README.md
    $ git status

    取消不小心 git add 的檔案

收藏

收藏變動

  • 指令 git stash
    1
    2
    3
    # 格式:git stash
    # 範例:
    $ git stash
    • 承 查看目前變動 狀況下做git stash,只會收藏Git處理過的檔案,不會收藏Git未處理過的檔案
    • 收藏後,檔案會回到變動前的狀況

查看收藏:

  • 指令 git stash list
    1
    2
    3
    # 格式:git stash list
    # 範例:
    $ git stash list

    圖中可看到目前有一筆收藏

取出收藏:

  • 指令 git stash pop
    1
    2
    3
    # 格式:git stash pop
    # 範例:
    $ git stash pop

    取出收藏後,檔案會回到變動後的狀況

提交:

  • 指令 git commit
    1
    2
    3
    4
    # 格式:git commit
    # 範例:
    $ git add README.md
    $ git commit
    • 提交前(git commit)必需暫存變動(git add)
    • 不進編輯器直接提交
      • git commit -m “提交內容描述”
    • 修改最近的提交記錄
      • git commit –amend

分支管理

查看分支

  • 指令 git branch
    1
    2
    3
    # 格式:git branch
    # 範例:
    $ git branch

    不加任何參數時為查看分支

建立新分支

  • 指令 git branch
    1
    2
    3
    4
    5
    6
    # 格式:git branch
    # 範例:
    # 以SHA-1 commit位置為基底建立branch_a
    $ git branch branch_a cbbb519abe0b959443c22aab38fe8cab9702eb2b
    # 以master位置為基底建立branch_b
    $ git branch branch_b master
    • 不會checkout到該分支
    • 推送剛建立的分支new_branch至遠端
      • git push origin new_branch

刪除分支

  • 指令 git branch -d
    1
    2
    3
    4
    # 格式:git branch -d <branch>
    # 範例:
    # 刪除分支new_branch (本地端)
    $ git branch -d new_branch

    有未合併資料時不可刪

  • 強制刪除:git branch -D
  • 刪除遠端分支:git push origin :
    • 使用git push 並在分支名前加上冒號(:)

合併分支: git merge

切換分支: git checkout

清除變動檔案: git checkout

清除分支所有變動: git checkout – .

變更工作目錄至commit: git reset

只移動branch位置,不變動檔案

變更工作目錄至commit: git reset –hard
移動branch位置,並重置檔案

建立tag: git tag

推送tag: git push origin

同等: git push origin refs/tags/

刪除tag: git tag -d

刪除遠端tag: git push origin refs/tags/
必需先把本地tag刪除(推送空tag)

變基: git rebase -i

摘取: cherry-pick

worktree

git worktree add -b hotfix ../hotfix master
git worktree prune
git worktree list
git worktree lock