[Git] Git 指令集

軟體:Git
說明文件
練習網站:Learn Git Branching
簡介:指令應用方法

 

Git status 看目前的狀態

  • git status
    # 目前的狀態
  • git status -s
    #--short 目前的狀態精簡版

 

Git 初始化

  • git init
    # 初始化
  • git init --bare
    # Git Server 用
  • git clone <A>
    # 從 A 複製

 

 Git 新增檔案

  • git add .
    # 全部加入(不含刪除檔案)
  • git add -u
    # --update 只加入修改過的檔案,新增的檔案不加入
  • git add -A
    # 全部加入 = git add . + git add -u
  • git add <fileA>
    # 加入 fileA

 

Git 刪除檔案

  • git rm <fileA>
    # 移除 fileA

 

Git 修改檔名、搬移目錄

  • git mv <fileA> <fileB>
    # 將 A 改為 B

 

Git Commit

  • git commit
    # 提交
  • git commit -m 'commit message'
    # 快速提交
  • git commit -a
    # 所有修改的檔案都 commit,但是 untracked file 還是得要先 add
  • git commit -v
    # 加入比對結果
  • git commit --amend
    # 修改前一次提交 

 

Git 檔案

  • git ls-files
    # 目前控管的檔案 
  • git ls-files -u
    # --unmerged 列出未 merge 的檔案
  • git ls-files -d
    # 查看已刪除的檔案
  • git ls-files -d | xargs git checkout --
    # 將已刪除的檔案還原

 

Git 產生新的 branch

  • git branch
    # 列出目前有多少 branch
  • git branch -r
    # 列出所有 Repository branch 
  • git branch -a
    # 列出所有 branch
  • git branch <new-branch>
    # 產生新的 branch (名稱: new-branch)
  • git branch <new-branch> 'Any commit'
    # 由 Any commit 產生新的 branch(new-branch)
  • git checkout -b <new-branch>
    # 產生新的 branch, 並同時切換過去 new-branch
  • git branch -d <new-branch>
    # 刪除 new-branch,需執行過 merge 的分支
  • git branch -D <new-branch>
    # 強制刪除 new-branch
  • git branch -f <branch-name> <A>
    # 強制移動 branch 指向 A

 

Git checkout 切換 branch

  • git checkout <branch-name>
    # 切換到 branch-name
  • git checkout -b <branch-name> --track <remote>/<branch-name>
    # 等同於 git checkout <branch-name>,若 remote 存在,會自動建立本地分支

 

Git diff (未指定的話,以工作目錄為主)

  • git diff
    # 比較 目前位置 與 staging area
  • git diff <A>
    # 與 A 有哪些資料不同
  • git diff --cached
    # --staged 比較 staging area 跟本來的 Repository
  • git diff <A> <B>
    # 比較 A 跟 B 差異,從 A -> B
  • git diff <A>:file1 <B>:file2
    # A 的 file1 跟 B 的 file2 的 diff
  • git diff --stat
    # 統計 diff
  • git diff -M
    # 檢測有無更名

 

Git Tag

  • git tag
    # 列出所有 tag
  • git tag <tagA> <A>
    # 將 A 標記為 tagA
  • git tag -d <tagA>
    # 將 tagA 刪掉

 

Git log (用工具觀看較為方便,例:gitk)

  • git log
    # 列出版本紀錄
  • git log -10
    # 列出前十筆
  • git log --decorate
    # 列出所有 log 含別名(tag)
  • git log --all
    # 列出所有的 log (含合併)
  • git log -p
    # 列出修改過的檔案內容
  • git log <A>
    # A 的所有 log
  • git log -p <A>
    # 將 A 的內容差異列出
  • git log --name-only
    # 列出此次 log 有哪些檔案被修改
  • git log --stat --summary
    # 查每個版本間的更動檔案和行數
  • git log -S'foo()'
    # log 裡面有 foo() 這字串的
  • git log --graph
    # 圖形化表示
  • git log --oneline
    # 一行顯示

 

Git Ref log

  • git reflog
    # 列出版本歷史紀錄
    # 修改任何參照( ref )的內容,或變更任何分支的 HEAD 參照內容,就會建立歷史紀錄
  • git log -g
    # reflog 的完整 commit 內容
  • git reflog delete HEAD@{id}
    # 刪除特定歷史紀錄,不影響任何儲存庫(repository)的任何內容
  • git reflog expire --expire=now --all
    # 清除所有歷史紀錄

 

Git show

  • git show <A>
    # 查 A 的內容

 

Git reset 重置

  • git reset --hard <commit>
    # 還原到特定 commit,不保留檔案
  • git reset --soft <commit>
    # 還原到特定 commit,保留檔案
  • git reset HEAD <A>
    # A 從 staging area 狀態回到 untracked (檔案內容並不會改變)

 

Git revert 反向還原變更

  • git revert <commit>
    # 反向做 <commit>,並提交
  • git revert <commit> -n
    # --no-commit 反向做 commit,但不提交,後續提交使用 git revert --continue
  • git revert --continue
    # 完成操作,並提交
  • git revert --abort
    # 放棄反向,回到原始狀態

 

Git cherry-pick 挑選多個 commit,接在 HEAD 之後進行變更

  • git cherry-pick <commit>
    # 重覆做 <commit>的動作並提交,版本訊息與原本的一致
  • git cherry-pick <commit> -x
    # 同上,但自動加上 (cherry picked from commit)
  • git cherry-pick <commit> -e
    # --edit 編輯訊息
  • git cherry-pick <commit> -n
    # --no-commit,不提交,後續提交使用 git commit

 

Git rebase 將 HEAD 之後所有 commit(含 HEAD) 接到其他 commit 上(接支),若有重覆會忽略之
可能會導致無法上傳遠端

    o---a---o---o---o---o---o---o---o  A
         \
          o---o---o---o---o  B
                           \
                            o---o---o  *C
  • git rebase <branchA>
    # 基礎版本設為 branchA,並執行本分支上的所有變更 (開頭接到 branchA)
    # 目前在 C,執行 git rebase A,會從 a 到 C 接到 A 的最後面
        o---a---o---o---o---o---o---o---o  A
             \                           \
              o---o---o---o---o  B        o'---o'---o'---o'---o'
                                                               \
                                                                o'---o'---o'  *C
    
  • git rebase  [--onto <newbase>] [<upstream> [<branch>]]
    # 找出 upstream 與 branch 的共同袓先,branch 由此之後的變化到終點這段,接在 newbase(新分支點) 上
    # git rebase --onto A B C
        o---o---o---o---o---o---o---o---o  A
            |                            \
            |                             o'--o'--o'  *C
             \
              o---o---o---o---o  B
    
  • git rebase <commitA> -i
    # 互動式編輯從目前 commit 到 commitA(不含) 的所有 commit
    • 調換順序 => 直接調換即可
    • 修正 commit 訊息 => reword or r
    • 編輯,拆解,新增 commit => edit or e
    • 與上一個 commit 合併,並合併訊息進行編輯 => squash
    • 與上一個 commit 合併,但只保留上一個 commit 的訊息 => fixup
    • 刪除 commit => 直接移除

 

Git stash 暫存

  • git stash
    # 同 git stash save 丟進暫存區(不含 untracked)
  • git stash save
    # 丟進暫存區,並加入註解
  • git stash -u
    # --include-untracked 丟進暫存區(包括 untracked)
  • git stash list
    # 列出所有暫存區的資料
  • git stash pop
    # 取出最新的一筆, 並移除.
  • git stash apply
    # 取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除
  • git stash apply "stash@{id}"
    # 取出特定暫存版
  • git stash clear
    # 把 stash 都清掉
  • git stash drop "stash@{id}"
    # 刪除特定暫存版

 

Git merge 合併

  • git merge <A> <B> <C> ...
    # 將 A, B, C ... 合併進來

 

Git blame

  • git blame <fileA>
    # 關於 fileA的所有 commit 紀錄

 

Git Config (default --local)
(套用順序 system -> global -> local),前者會被後者覆蓋

  • git config --list
    # 列出目前設定
  • git config --list --system
    # 列出目前 System-level 設定,儲存在 C:\Program Files (x86)\Git\etc\gitconfig
  • git config --list --global
    # 列出目前 User-level設定,儲存在 C:\Users\<使用者帳號>\.gitconfig
  • git config --list --local
    # 列出目前 Repository-level 設定,儲存在 .git\config
  • git config [config_section.config_name]
    # 取得特定選項值
  • git config [config_section.config_name] [config_value]
    # 設定特定選項值
  • git config --global core.editor "\"C:\Program Files (x86)\Notepad++\notepad++.exe\""
    # 指定預設文字編輯器
  • git config --edit --system | --global | --local
    #直接編輯設定檔
  • git config --global help.autocorrect 1
    # 自動訂正打錯的參數
  • git config --local commit.template "G:\git-commit-template.txt"
    # 自訂 commit 訊息範本
  • git config --global alias.<別名> <指令>
    # 加入別名執行指令
  • git config --global gc.reflogExpire "never"|"7 days"
    # 設定歷史紀錄的過期時間
  • git config --global gc.reflogExpireUnreachable "never"|"7 days"
    # 設定歷史紀錄的過期時間
  • git config --local gc.master.reflogExpire "14 days"
    # 設定特定分支歷史紀錄的過期時間
  • git config --local gc.master.reflogExpireUnreachable "14 days"
    # 設定特定分支歷史紀錄的過期時間

 

Git 維護

  • git gc
    # 指垃圾收集 (garbage collect)
    # 此命令會做很多工作:
    # 收集所有鬆散對象並存入 packfile
    # 合併 packfile 進一個大的 packfile
    # 將不被任何 commit 引用並已存在一段時間 (數月) 的對象刪除
    # 整理前和整理後的差異, 可由: git count-objects 看到

 

Git remote 維護遠端檔案

  • git remote
    #列出所有 remote
  • git remote add <A> <Web>
    # 加入遠端 Repository 命名為 A
  • git remote rm <A>
    # 移除 A
  • git remote update
    # 更新所有 Repository branch
  • git remote set-url <A> <Web>
    # 更改 A 的遠端位址
  • git ls-remote
    # 列出遠端所有分支

 

抓取遠端 Repository

  • git fetch
    # 預設為 origin
  • git fetch <A>
    # 抓取 A,但不影響 local
  • git fetch --tags
    # 抓取 tags
  • git fetch --all
    # 抓取所有 remotes

 

下載遠端 Repository

  • git pull
    # 預設為 origin
  • git pull <A>
    # 抓取 A,直接更新 local

 

提交遠端 Repository

  • git push
    # 預設為 origin
  • git push <A>
    # 提交 A
  • git push <A> --force
    # 強制提交 A,可用在上傳錯誤,強制更正 GitHub
  • git push <A> <branchB>
    # 指定分支 branchB 提交 A
  • git push --tags
    # 提交 tags
  • git push --all
    # 提交所有 branches

 

參考:

留言