1. 程式人生 > 其它 >git常用命令梳理總結

git常用命令梳理總結

一、新建程式碼庫

1.git clone用法:git clone [<選項>] [--] <倉庫> [<路徑>]

# 用法:git clone [<選項>] [--] <倉庫> [<路徑>]

    -v, --verbose         #更加詳細
    -q, --quiet           #更加安靜
    --progress            #強制顯示進度報告
    -n, --no-checkout     #不建立一個檢出
    --bare                #建立一個純倉庫
    --mirror              #建立一個映象倉庫(也是純倉庫)
    -l, --local           #從本地倉庫克隆
    --no-hardlinks        #不使用本地硬連結,始終複製
    -s, --shared          #設定為共享倉庫
    --recurse-submodules[=<路徑規格>] #在克隆時初始化子模組
    --recursive ...       --recurse-submodules #別名
    -j, --jobs <n>        #併發克隆的子模組的數量
    --template <模板目錄>  #模板目錄將被使用
    --reference <倉庫>       #參考倉庫
    --reference-if-able <倉庫> #參考倉庫
    --dissociate          #僅在克隆時參考 --reference 指向的本地倉庫
    -o, --origin <名稱>   #使用 <名稱> 而不是 'origin' 去跟蹤上游
    -b, --branch <分支>   #檢出 <分支> 而不是遠端 HEAD
    -u, --upload-pack <路徑> #遠端 git-upload-pack 路徑
    --depth <深度>        #建立一個指定深度的淺克隆
    --shallow-since <時間> #從一個特定時間建立一個淺克隆
    --shallow-exclude <版本>#深化淺克隆的歷史,除了特定版本
    --single-branch       #只克隆一個分支、HEAD 或 --branch
    --no-tags             #不要克隆任何標籤,並且後續獲取操作也不下載它們
    --shallow-submodules  #子模組將以淺下載模式克隆
    --separate-git-dir <git目錄>#git目錄和工作區分離
    -c, --config <key=value>#在新倉庫中設定配置資訊
    --server-option <server-specific>#傳輸選項
    -4, --ipv4            #只使用 IPv4 地址
    -6, --ipv6            #只使用 IPv6 地址
    --filter <引數>       #物件過濾
    --remote-submodules   #任何克隆的子模組將使用它們的遠端跟蹤分支
    --sparse              #初始化稀疏檢出檔案,只包含根目錄檔案

# 下載一個專案和它的整個程式碼歷史
$ git clone [url]

#clone下來的repo會以url最後一個斜線後面的名稱命名,建立一個資料夾,如果想要指定特定的名稱,可以git clone [url] newname指定.

$ git clone [url] newname

2.git init 用法:git init [-q | --quiet] [--bare] [--template=] [--shared[=]][]

git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]][<directory>]

#將使用模板的目錄/ directory from which templates will be used

    --template <template-directory>

#建立一個空倉庫/create a bare repository

    --bare

#指定 git 儲存庫將在多個使用者之間共享/specify that the git repository is to be shared amongst several users

    --shared[=<permissions>]

#安靜/be quiet

    -q, --quiet

#將 git dir 與工作樹分開/separate git dir from working tree

    --separate-git-dir <gitdir>

#覆蓋初始分支的名稱/override the name of the initial branch

    -b, --initial-branch <name>

#指定要使用的雜湊演算法/specify the hash algorithm to use

    --object-format <hash>

# git-init - 建立一個空的 Git 儲存庫或重新初始化一個現有的儲存庫
$ git init

# 在本地新建一個repo,進入一個專案目錄,執行git init,會初始化一個repo,並在當前資料夾下建立一個.git資料夾.
$ git init [project-name]
$ git init repo

二、配置

1.git config 用法:git config [<選項>]

#用法:git config [<選項>]

#配置檔案位置
    --global              #使用全域性配置檔案
    --system              #使用系統級配置檔案
    --local               #使用倉庫級配置檔案
    --worktree            #使用工作區級別的配置檔案
    -f, --file <檔案>     #使用指定的配置檔案
    --blob <資料物件 ID>  #從給定的資料物件讀取配置

#操作
    --get                 #獲取值:name [value-regex]
    --get-all             #獲得所有的值:key [value-regex]
    --get-regexp          #根據正則表示式獲得值:name-regex [value-regex]
    --get-urlmatch        #獲得 URL 取值:section[.var] URL
    --replace-all         #替換所有匹配的變數:name value [value_regex]
    --add                 #新增一個新的變數:name value
    --unset               #刪除一個變數:name [value-regex]
    --unset-all           #刪除所有匹配項:name [value-regex]
    --rename-section      #重新命名小節:old-name new-name
    --remove-section      #刪除一個小節:name
    -l, --list            #列出所有
    -e, --edit            #開啟一個編輯器
    --get-color           #獲得配置的顏色:配置 [預設]
    --get-colorbool       #獲得顏色設定:配置 [stdout-is-tty]

#型別
    -t, --type <>         #取值為該型別
    --bool                #值是 "true" 或 "false"
    --int                 #值是十進位制數
    --bool-or-int         #值是 --bool or --int
    --path                #值是一個路徑(檔案或目錄名)
    --expiry-date         #值是一個到期日期

#其它
    -z, --null            #終止值是 NUL 位元組
    --name-only           #只顯示變數名
    --includes            #查詢時參照 include 指令遞迴查詢
    --show-origin         #顯示配置的來源(檔案、標準輸入、資料物件,或命令列)
    --show-scope          #顯示配置的作用域(工作區、本地、全域性、系統、命令)
    --default <取值>      #使用 --get 引數,當缺少設定時使用預設值

#Git的設定檔案為.gitconfig,它可以在使用者主目錄下(全域性配置),也可以在專案目錄下(專案配置)。
# 顯示當前的Git配置
$ git config --list

# 編輯Git配置檔案
$ git config -e --global

# 設定提交程式碼時的使用者資訊
$ git config --global user.name "[name]"
$ git config --global user.email "[email address]"

三、增加/刪除檔案

1.git add 用法:git add [<選項>] [--] <路徑規格>...

#用法:git add [<選項>] [--] <路徑規格>...

    -n, --dry-run         #演習
    -v, --verbose         #冗長輸出

    -i, --interactive     #互動式揀選
    -p, --patch           #互動式挑選資料塊
    -e, --edit            #編輯當前差異並應用
    -f, --force           #允許新增忽略的檔案
    -u, --update          #更新已跟蹤的檔案
    --renormalize         #對已跟蹤檔案(暗含 -u)重新歸一換行符
    -N, --intent-to-add   #只記錄,該路徑稍後再新增
    -A, --all             #新增所有改變的已跟蹤檔案和未跟蹤檔案
    --ignore-removal      #忽略工作區中移除的路徑(和 --no-all 相同)
    --refresh             #不新增,只重新整理索引
    --ignore-errors       #跳過因出錯不能新增的檔案
    --ignore-missing      #檢查在演習模式下檔案(即使不存在)是否被忽略
    --chmod (+|-)x        #覆蓋列表裡檔案的可執行位
    --pathspec-from-file <檔案> #從檔案讀取路徑表示式
    --pathspec-file-nul   #使用 --pathspec-from-file,路徑表示式用空字元分隔

# 新增指定檔案到暫存區
$ git add [file1] [file2] ...

# 新增指定目錄到暫存區,包括子目錄
$ git add [dir]

# 添加當前目錄的所有檔案到暫存區,會遞迴地添加當前工作目錄中的所有檔案.
$ git add .

# 對於同一個檔案的多處變化,可以實現分次提交
$ git add -p

2.git rm 用法:git rm [<選項>] [--] <檔案>...

#用法:git rm [<選項>] [--] <檔案>...
    -n, --dry-run         #演習
    -q, --quiet           #不列出刪除的檔案
    --cached              #只從索引區刪除
    -f, --force           #忽略檔案更新狀態檢查
    -r                    #允許遞迴刪除
    --ignore-unmatch      #即使沒有匹配,也以零狀態退出
    --pathspec-from-file <檔案> #從檔案讀取路徑表示式
    --pathspec-file-nul   #使用 --pathspec-from-file,路徑表示式用空字元分隔

# 刪除工作區檔案,並且將這次刪除放入暫存區
$ git rm [file1] [file2] ...

# 停止追蹤指定檔案,但該檔案會保留在工作區
$ git rm --cached [file]

# 改名檔案,並且將這個改名放入暫存區

3.git mv 用法:git mv [<選項>] <源>... <目標>

#用法:git mv [<選項>] <源>... <目標>

    -v, --verbose         #冗長輸出
    -n, --dry-run         #演習
    -f, --force           #強制移動/重命令,即使目標存在
    -k                    #跳過移動/重新命名錯誤

$ git mv [file -original] [file -renamed ="token punctuation"]

4.git clean 用法:git clean [-d] [-f] [-i] [-n] [-q] [-e <模式>] [-x | -X] [--] <路徑>...

#用法:git clean [-d] [-f] [-i] [-n] [-q] [-e <模式>] [-x | -X] [--] <路徑>...
    -q, --quiet           #不列印刪除檔案的名稱
    -n, --dry-run         #演習
    -f, --force           #強制
    -i, --interactive     #互動式清除
    -d                    #刪除整個目錄
    -e, --exclude <模式>  #新增 <模式> 到忽略規則
    -x                    #也刪除忽略的檔案
    -X                    #只刪除忽略的檔案

#從工作目錄中移除沒有追蹤的檔案.
$ git clean -df
-d表示同時移除目錄,-f表示force,因為在git的配置檔案中,clean.requireForce=true,如果不加-f,clean將會拒絕執行.

四、程式碼提交

1.git commit 用法:git commit [<選項>] [--] <路徑規格>...

#用法:git commit [<選項>] [--] <路徑規格>...

    -q, --quiet           #提交成功後不顯示概述資訊
    -v, --verbose         #在提交說明模板裡顯示差異

#提交說明選項
    -F, --file <檔案>     #從檔案中讀取提交說明
    --author <作者>       #提交時覆蓋作者
    --date <日期>         #提交時覆蓋日期
    -m, --message <說明>  #提交說明
    -c, --reedit-message <提交>
                          #重用並編輯指定提交的提交說明
    -C, --reuse-message <提交>
                          #重用指定提交的提交說明
    --fixup <提交>        #使用 autosquash 格式的提交說明用以修正指定的提交
    --squash <提交>       #使用 autosquash 格式的提交說明用以壓縮至指定的提交
    --reset-author        #現在將該提交的作者改為我(和 -C/-c/--amend 引數共用)
    -s, --signoff         #新增 Signed-off-by: 簽名
    -t, --template <檔案>
                          #使用指定的模板檔案
    -e, --edit            #強制編輯提交
    --cleanup <模式>      #設定如何刪除提交說明裡的空格和#註釋
    --status              #在提交說明模板裡包含狀態資訊
    -S, --gpg-sign[=<key-id>]
                          #GPG 提交簽名
#提交內容選項
    -a, --all             #提交所有改動的檔案
    -i, --include         #新增指定的檔案到索引區等待提交
    --interactive         #互動式新增檔案
    -p, --patch           #互動式新增變更
    -o, --only            #只提交指定的檔案
    -n, --no-verify       #繞過 pre-commit 和 commit-msg 鉤子
    --dry-run             #顯示將要提交的內容
    --short               #以簡潔的格式顯示狀態
    --branch              #顯示分支資訊
    --ahead-behind        #計算完整的領先/落後值
    --porcelain           #機器可讀的輸出
    --long                #以長格式顯示狀態(預設)
    -z, --null            #條目以 NUL 字元結尾
    --amend               #修改先前的提交
    --no-post-rewrite     #繞過 post-rewrite 鉤子
    -u, --untracked-files[=<模式>]
                          #顯示未跟蹤的檔案,“模式”的可選引數:all、normal、no。(預設:all)
    --pathspec-from-file <檔案>
                          #從檔案讀取路徑表示式
    --pathspec-file-nul   #使用 --pathspec-from-file,路徑表示式用空字元分隔

# 提交暫存區到倉庫區
$ git commit -m [message]

# 提交暫存區的指定檔案到倉庫區
$ git commit [file1] [file2] ... -m [message]

# 提交工作區自上次commit之後的變化,直接到倉庫區
$ git commit -a

# 提交時顯示所有diff資訊
$ git commit -v

# 如果程式碼沒有任何新變化,則用來改寫上一次commit的提交資訊
$ git commit --amend -m [message]

# 重做上一次commit,幷包括指定檔案的新變化
$ git commit --amend [file1] [file2] ...

五、分支

1.git branch 用法:git branch [通用選項] [具體的 git-branch 動作] [--merged | --no-merged]

#用法:git branch [<選項>] [-r | -a] [--merged | --no-merged]
  或:git branch [<選項>] [-l] [-f] <分支名> [<起始點>]
  或:git branch [<選項>] [-r] (-d | -D) <分支名>...
  或:git branch [<選項>] (-m | -M) [<舊分支>] <新分支>
  或:git branch [<選項>] (-c | -C) [<老分支>] <新分支>
  或:git branch [<選項>] [-r | -a] [--points-at]
  或:git branch [<選項>] [-r | -a] [--format]

#通用選項
    -v, --verbose         #顯示雜湊值和主題,若引數出現兩次則顯示上游分支
    -q, --quiet           #不顯示資訊
    -t, --track           #設定跟蹤模式(參見 git-pull(1))
    -u, --set-upstream-to <上游>
                          #改變上游資訊
    --unset-upstream      #取消上游資訊的設定
    --color[=<何時>]      #使用彩色輸出
    -r, --remotes         #作用於遠端跟蹤分支
    --contains <提交>     #只打印包含該提交的分支
    --no-contains <提交>  #只打印不包含該提交的分支
    --abbrev[=<n>]        #用 <n> 位數字顯示 SHA-1 雜湊值

#具體的 git-branch 動作:
    -a, --all             #列出遠端跟蹤及本地分支
    -d, --delete          #刪除完全合併的分支
    -D                    #刪除分支(即使沒有合併)
    -m, --move            #移動/重新命名一個分支,以及它的引用日誌
    -M                    #移動/重新命名一個分支,即使目標已存在
    -c, --copy            #拷貝一個分支和它的引用日誌
    -C                    #拷貝一個分支,即使目標已存在
    -l, --list            #列出分支名
    --show-current        #顯示當前分支名
    --create-reflog       #建立分支的引用日誌
    --edit-description    #標記分支的描述
    -f, --force           #強制建立、移動/重新命名、刪除
    --merged <提交>       #只打印已經合併的分支
    --no-merged <提交>    #只打印尚未合併的分支
    --column[=<風格>]     #以列的方式顯示分支
    --sort <key>         #排序的欄位名
    --points-at <物件>    #只打印指向該物件的分支
    -i, --ignore-case     #排序和過濾屬於大小寫不敏感
    --format <格式>       #輸出格式

# 列出所有本地分支
$ git branch

# 列出所有遠端分支
$ git branch -r

# 列出所有本地分支和遠端分支
$ git branch -a

# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]

# 新建一個分支,指向指定commit
$ git branch [branch] [commit]

# 新建一個分支,與指定的遠端分支建立追蹤關係
$ git branch --track [branch] [remote-branch]

# 建立追蹤關係,在現有分支與指定的遠端分支之間
$ git branch --set-upstream [branch] [remote-branch]

#遠端建立一個和本地一樣的分支,本地分支和遠端分支建立跟蹤關係
git branch --set-upstream-to=origin/develop  develop

# 刪除本地分支
$ git branch -d [branch-name]

# 刪除遠端分支
$ git branch -dr [remote/branch]

2. git checkout用法:git checkout [<選項>] [<分支>] -- <檔案>...

#用法:git checkout [<選項>] <分支>
  或:git checkout [<選項>] [<分支>] -- <檔案>...

    -b <分支>             #建立並檢出一個新的分支
    -B <分支>             #建立/重置並檢出一個分支
    -l                    #為新的分支建立引用日誌
    --guess               #二次猜測 'git checkout <無此分支>'(預設)
    --overlay             #使用疊加模式(預設)
    -q, --quiet           #不顯示進度報告
    --recurse-submodules[=<checkout>]
                          control recursive updating of submodules
    --progress            #強制顯示進度報告
    -m, --merge           #和新的分支執行三方合併
    --conflict <風格>     #衝突輸出風格(merge 或 diff3)
    -d, --detach          #HEAD 從指定的提交分離
    -t, --track           #為新的分支設定上游資訊
    -f, --force           #強制檢出(丟棄本地修改)
    --orphan <新分支>     #新的沒有父提交的分支
    --overwrite-ignore    #更新忽略的檔案(預設)
    --ignore-other-worktrees
                          #不檢查指定的引用是否被其他工作區所佔用
    -2, --ours            #對尚未合併的檔案檢出我們的版本
    -3, --theirs          #對尚未合併的檔案檢出他們的版本
    -p, --patch           #互動式挑選資料塊
    --ignore-skip-worktree-bits
                          #對路徑不做稀疏檢出的限制
    --pathspec-from-file <檔案>
                          #從檔案讀取路徑表示式
    --pathspec-file-nul   #使用 --pathspec-from-file,路徑表示式用空字元分隔

# 新建一個分支,並切換到該分支
$ git checkout -b [branch]

# 切換到指定分支,並更新工作區
$ git checkout [branch-name]

# 切換到上一個分支
$ git checkout -

# 恢復暫存區的指定檔案到工作區
$ git checkout [file]

# 恢復某個commit的指定檔案到暫存區和工作區
$ git checkout [commit] [file]

# 恢復暫存區的所有檔案到工作區
$ git checkout .

3.git merge 用法: git merge [<選項>] [<提交>...]

#用法:git merge [<選項>] [<提交>...]
  或:git merge --abort
  或:git merge --continue

    -n                    #在合併的最後不顯示差異統計
    --stat                #在合併的最後顯示差異統計
    --summary             (和 --stat 同義)
    --log[=<n>]           #在合併提交資訊中新增(最多 <n> 條)精簡提交記錄
    --squash              #建立一個單獨的提交而不是做一次合併
    --commit              #如果合併成功,執行一次提交(預設)
    -e, --edit            #在提交前編輯提交說明
    --cleanup <模式>      #設定如何刪除提交說明裡的空格和#註釋
    --ff                  #允許快進(預設)
    --ff-only             #如果不能快進就放棄合併
    --rerere-autoupdate   #如果可能,重用衝突解決更新索引
    --verify-signatures   #驗證指定的提交是否包含一個有效的 GPG 簽名
    -s, --strategy <策略>
                          #要使用的合併策略
    -X, --strategy-option <option=value>
                          #所選的合併策略的選項
    -m, --message <說明>  #合併的提交說明(針對非快進式合併)
    -F, --file <路徑>     #從檔案中讀取提交說明
    -v, --verbose         #更加詳細
    -q, --quiet           #更加安靜
    --abort               #放棄當前正在進行的合併
    --quit                --abort,#但是保留索引和工作區
    --continue            #繼續當前正在進行的合併
    --allow-unrelated-histories
                          #允許合併不相關的歷史
    --progress            #強制顯示進度報告
    -S, --gpg-sign[=<key-id>]
                          GPG #提交簽名
    --autostash           #在操作前後執行自動貯藏和彈出貯藏
    --overwrite-ignore    #更新忽略的檔案(預設)
    --signoff             #新增 Signed-off-by: 簽名
    --no-verify           #繞過 pre-merge-commit 和 commit-msg 鉤子

# 合併指定分支到當前分支
$ git merge [branch]

# 選擇一個commit,合併進當前分支
$ git merge [commit-id]

4.git cherry-pick用法:git cherry-pick [<選項>] <提交號>...

#用法:git cherry-pick [<選項>] <提交號>...
  或:git cherry-pick <子命令>

    --quit                #終止反轉或揀選操作
    --continue            #繼續反轉或揀選操作
    --abort               #取消反轉或揀選操作
    --skip                #跳過當前提交併繼續
    --cleanup <模式>      #設定如何刪除提交說明裡的空格和#註釋
    -n, --no-commit       #不要自動提交
    -e, --edit            #編輯提交說明
    -s, --signoff         #新增 Signed-off-by: 簽名
    -m, --mainline <父編號>
                          #選擇主幹父提交編號
    --rerere-autoupdate   #如果可能,重用衝突解決更新索引
    --strategy <策略>     #合併策略
    -X, --strategy-option <選項>
                          #合併策略的選項
    -S, --gpg-sign[=<key-id>]
                          #GPG 提交簽名
    -x                    #追加提交名稱
    --ff                  #允許快進式
    --allow-empty         #保留初始化的空提交
    --allow-empty-message
                          #允許提交說明為空
    --keep-redundant-commits
                          #保持多餘的、空的提交

$ git cherry-pick [commit]

5.用法:git push [<選項>] [<倉庫> [<引用規格>...]]

#用法:git push [<選項>] [<倉庫> [<引用規格>...]]
    -v, --verbose         #更加詳細
    -q, --quiet           #更加安靜
    --repo <倉庫>         #倉庫
    --all                 #推送所有引用
    --mirror              #映象所有引用
    -d, --delete          #刪除引用
    --tags                #推送標籤(不能使用 --all or --mirror)
    -n, --dry-run         #演習
    --porcelain           #機器可讀的輸出
    -f, --force           #強制更新
    --force-with-lease[=<引用名>:<期望值>]
                          #要求引用舊的取值為設定值
    --recurse-submodules (check|on-demand|no)
                          #控制子模組的遞迴推送
    --thin                #使用精簡打包
    --receive-pack <receive-pack>
                          #接收包程式
    --exec <receive-pack>
                          #接收包程式
    -u, --set-upstream    #設定 git pull/status 的上游
    --progress            #強制顯示進度報告
    --prune               #清除本地刪除的引用
    --no-verify           #繞過 pre-push 鉤子
    --follow-tags         #推送缺失但有關的標籤
    --signed[=(yes|no|if-asked)]
                          #用 GPG 為推送簽名
    --atomic              #需要遠端支援原子事務
    -o, --push-option <server-specific>
                          #傳輸選項
    -4, --ipv4            #只使用 IPv4 地址
    -6, --ipv6            #只使用 IPv6 地址


六、標籤

1.git tag用法

#用法:git tag [-a | -s | -u <key-id>] [-f] [-m <訊息> | -F <檔案>] <標籤名> [<頭>]
  或:git tag -d <標籤名>...
  或:git tag -l [-n[<數字>]] [--contains <提交>] [--no-contains <提交>] [--points-at <物件>]
		[--format=<格式>] [--[no-]merged [<提交>]] [<模式>...]
  或:git tag -v [--format=<格式>] <標籤名>...

    -l, --list            #列出標籤名稱
    -n[<n>]               #每個標籤資訊列印 <n> 行
    -d, --delete          #刪除標籤
    -v, --verify          #驗證標籤

#標籤建立選項
    -a, --annotate        #附註標籤,需要一個說明
    -m, --message <說明>  #標籤說明
    -F, --file <檔案>     #從檔案中讀取提交說明
    -e, --edit            #強制編輯標籤說明
    -s, --sign            #附註並附加 GPG 簽名的標籤
    --cleanup <模式>      #設定如何刪除提交說明裡的空格和#註釋
    -u, --local-user <key-id>
                          #使用另外的私鑰簽名該標籤
    -f, --force           #如果存在,替換現有的標籤
    --create-reflog       #建立引用日誌

#標籤列表選項
    --column[=<風格>]     #以列的方式顯示標籤列表
    --contains <提交>     #只打印包含該提交的標籤
    --no-contains <提交>  #只打印不包含該提交的標籤
    --merged <提交>       #只打印已經合併的標籤
    --no-merged <提交>    #只打印尚未合併的標籤
    --sort <key>          #排序的欄位名
    --points-at <物件>    #只打印指向該物件的標籤
    --format <格式>       #輸出格式
    --color[=<何時>]      #遵照格式中的顏色輸出
    -i, --ignore-case     #排序和過濾屬於大小寫不敏感

# 列出所有tag
$ git tag

# 新建一個tag在當前commit
$ git tag [tag]

# 新建一個tag在指定commit
$ git tag [tag] [commit]

# 刪除本地tag
$ git tag -d [tag]

# 刪除遠端tag
$ git push origin :refs/tags/[tagName]

# 檢視tag資訊
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]

七、檢視資訊

1.git status用法:git status [<選項>] [--] <路徑規格>...

#用法:git status [<選項>] [--] <路徑規格>...
    -v, --verbose         #冗長輸出
    -s, --short           #以簡潔的格式顯示狀態
    -b, --branch          #顯示分支資訊
    --show-stash          #顯示貯藏區資訊
    --ahead-behind        #計算完整的領先/落後值
    --porcelain[=<版本>]  #機器可讀的輸出
    --long                #以長格式顯示狀態(預設)
    -z, --null            #條目以 NUL 字元結尾
    -u, --untracked-files[=<模式>]
                          #顯示未跟蹤的檔案,“模式”的可選引數:all、normal、no。(預設:all)
    --ignored[=<模式>]    #顯示已忽略的檔案,可選模式:traditional、matching、no。(預設:traditional)
    --ignore-submodules[=<何時>]
                          #忽略子模組的更改,“何時”的可選引數:all、dirty、untracked。(預設:all)
    --column[=<風格>]     #以列的方式顯示未跟蹤的檔案
    --no-renames          #不檢測重新命名
    -M, --find-renames[=<n>]
                          #檢測重新命名,可以設定索引相似度

#查詢repo的狀態.
git status
#-s表示short, -s的輸出標記會有兩列,第一列是對staging區域而言,第二列是對working目錄而言.
git status -s

2.git log用法:git log [<選項>] [<版本範圍>] [[--] <路徑>...]

用法:git log [<選項>] [<版本範圍>] [[--] <路徑>...]
或:git show [<選項>] <物件>...

    -q, --quiet           不顯示差異輸出
    --source              顯示源
    --use-mailmap         使用郵件對映檔案
    --mailmap             --use-mailmap 的別名
    --decorate-refs <模式>
                          只修飾與 <模式> 匹配的引用
    --decorate-refs-exclude <模式>
                          不修飾和 <模式> 匹配的引用
    --decorate[=...]      修飾選項
    -L <n,m:file>         處理檔案中第 n 到 m 之間的行,從 1 開始

# 顯示當前分支的版本歷史
$ git log

# 顯示commit歷史,以及每次commit發生變更的檔案
$ git log --stat

# 搜尋提交歷史,根據關鍵詞
$ git log -S [keyword]

# 顯示某個commit之後的所有變動,每個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit之後的所有變動,其"提交說明"必須符合搜尋條件
$ git log [tag] HEAD --grep feature

# 顯示某個檔案的版本歷史,包括檔案改名
$ git log --follow [file]
$ git whatchanged [file]

# 顯示指定檔案相關的每一次diff
$ git log -p [file]

# 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示所有提交過的使用者,按提交次數排序
$ git shortlog -sn

#檢視倉庫的操作日誌
$ git reflog

# 顯示指定檔案是什麼人在什麼時間修改過
$ git blame [file]

# 顯示暫存區和工作區的程式碼差異
$ git diff

# 顯示暫存區和上一個commit的差異
$ git diff --cached [file]

# 顯示工作區與當前分支最新commit之間的差異
$ git diff HEAD

# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch]

# 顯示今天你寫了多少行程式碼
$ git diff --shortstat "@{0 day ago}"

# 顯示某次提交的元資料和內容變化
$ git show [commit]

# 顯示某次提交發生變化的檔案
$ git show --name-only [commit]

# 顯示某次提交時,某個檔案的內容
$ git show [commit]:[filename]

# 顯示當前分支的最近幾次提交
$ git reflog


HEAD@{0}代表HEAD當前的值,HEAD@{3}代表HEAD在3次變化之前的值.git會將變化記錄到HEAD對應的reflog檔案中,其路徑為.git/logs/HEAD, 分支的reflog檔案都放在.git/logs/refs目錄下的子目錄中

# 從本地master拉取程式碼更新當前分支:branch 一般為master
$ git rebase [branch]

3.git rebase -i 用法

#用法:git rebase [-i] [options] [--exec <命令>] [--onto <新基線> | --keep-base] [<上游> [<分支>]]
  或:git rebase [-i] [選項] [--exec <命令>] [--onto <新基線>] --root [<分支>]
  或:git rebase --continue | --abort | --skip | --edit-todo

    --onto <版本>         #變基到給定的分支而非上游
    --keep-base           #使用上游和分支的合併基線做為當前基線
    --no-verify           #允許執行 pre-rebase 鉤子
    -q, --quiet           #安靜。暗示 --no-stat
    -v, --verbose         #顯示上游變化的差異統計
    -n, --no-stat         #不顯示上游變化的差異統計
    --signoff             #為每一個提交新增一個 Signed-off-by: 簽名
    --ignore-whitespace   #傳遞給 'git am
    --committer-date-is-author-date
                          #傳遞給 'git am
    --ignore-date         #傳遞給 'git am
    -C <n>                #傳遞給 'git apply'
    --whitespace <動作>   #傳遞給 'git apply'
    -f, --force-rebase    #揀選所有提交,即使未修改
    --no-ff               #揀選所有提交,即使未修改
    --continue            #繼續
    --skip                #跳過當前補丁並繼續
    --abort               #終止並檢出原有分支
    --quit                #終止但保持 HEAD 不變
    --edit-todo           #在互動式變基中編輯待辦列表
    --show-current-patch  #顯示正在應用或合併的補丁檔案
    --apply               #使用應用策略進行變基
    -m, --merge           #使用合併策略進行變基
    -i, --interactive     #讓使用者編輯要變基的提交列表
    --rerere-autoupdate   #如果可能,重用衝突解決更新索引
    --empty <{drop,keep,ask}>
                          #如何處理成為空提交的提交
    --autosquash          #在 -i 互動模式下,移動以 squash!/fixup! 開頭的提交
    -S, --gpg-sign[=<key-id>]
                          #使用 GPG 簽名提交
    --autostash           #在操作前後執行自動貯藏和彈出貯藏
    -x, --exec <exec>     #MkDocs可編輯列表的每一個提交下面增加一行 exec
    -r, --rebase-merges[=<模式>]
                          #嘗試對合並提交變基而不是忽略它們
    --fork-point          #使用 'merge-base --fork-point' 來優化上游
    -s, --strategy <策略>
                          #使用給定的合併策略
    -X, --strategy-option <選項>
                          #將引數傳遞給合併策略
    --root                #將所有可達的提交變基到根提交
    --reschedule-failed-exec
                          #自動重新安排任何失敗的 `exec`
    --reapply-cherry-picks
                          #應用所有更改,甚至那些已在上游存在的

八、遠端同步

1.git remote 用法

用法:git remote [-v | --verbose]
  或:git remote add [-t <分支>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <名稱> <地址>
  或:git remote rename <舊名稱> <新名稱>
  或:git remote remove <名稱>
  或:git remote set-head <名稱> (-a | --auto | -d | --delete | <分支>)
  或:git remote [-v | --verbose] show [-n] <名稱>
  或:git remote prune [-n | --dry-run] <名稱>
  或:git remote [-v | --verbose] update [-p | --prune] [(<組> | <遠端>)...]
  或:git remote set-branches [--add] <名稱> <分支>...
  或:git remote get-url [--push] [--all] <名稱>
  或:git remote set-url [--push] <名稱> <新的地址> [<舊的地址>]
  或:git remote set-url --add <名稱> <新的地址>
  或:git remote set-url --delete <名稱> <地址>
    -v, --verbose         冗長輸出;必須置於子命令之前
$ git remote update  --更新遠端倉儲
# 下載遠端倉庫的所有變動
$ git fetch [remote]

# 顯示所有遠端倉庫
$ git remote -v

# 顯示某個遠端倉庫的資訊
$ git remote show [remote]

# 增加一個新的遠端倉庫,並命名
$ git remote add [shortname] [url]

2.git pull 用法:git pull [<選項>] [<倉庫> [<引用規格>...]]

#用法:git pull [<選項>] [<倉庫> [<引用規格>...]]

    -v, --verbose         #更加詳細
    -q, --quiet           #更加安靜
    --progress            #強制顯示進度報告
    --recurse-submodules[=<on-demand>]
                          #控制子模組的遞迴獲取
#和合並相關的選項
    -r, --rebase[=(false|true|merges|preserve|interactive)]
                          #使用變基操作取代合併操作以合入修改
    -n                    #在合併的最後不顯示差異統計
    --stat                #在合併的最後顯示差異統計
    --log[=<n>]           #在合併提交資訊中新增(最多 <n> 條)精簡提交記錄
    --signoff[=...]       #新增 Signed-off-by: 簽名
    --squash              #建立一個單獨的提交而不是做一次合併
    --commit              #如果合併成功,執行一次提交(預設)
    --edit                #在提交前編輯提交說明
    --cleanup <模式>      #設定如何刪除提交說明裡的空格和#註釋
    --ff                  #允許快進式
    --ff-only             #如果不能快進就放棄合併
    --verify-signatures   #驗證指定的提交是否包含一個有效的 GPG 簽名
    --autostash           #在操作前後執行自動貯藏和彈出貯藏
    -s, --strategy <策略>
                          #要使用的合併策略
    -X, --strategy-option <option=value>
                          #所選的合併策略的選項
    -S, --gpg-sign[=<key-id>]
                          #GPG 提交簽名
    --allow-unrelated-histories
                          #允許合併不相關的歷史
#和獲取相關的引數
    --all                 #從所有的遠端抓取
    -a, --append          #追加到 .git/FETCH_HEAD 而不是覆蓋它
    --upload-pack <路徑>  #上傳包到遠端的路徑
    -f, --force           #強制覆蓋本地分支
    -t, --tags            #抓取所有的標籤和關聯物件
    -p, --prune           #清除遠端已經不存在的分支的跟蹤分支
    -j, --jobs[=<n>]      #併發拉取的子模組的數量
    --dry-run             #演習
    -k, --keep            #保持下載包
    --depth <深度>        #深化淺克隆的歷史
    --shallow-since <時間>
                          #基於時間來深化淺克隆的歷史
    --shallow-exclude <版本>
                          #深化淺克隆的歷史,除了特定版本
    --deepen <n>          #深化淺克隆的歷史
    --unshallow           #轉換為一個完整的倉庫
    --update-shallow      #接受更新 .git/shallow 的引用
    --refmap <引用對映>   #指定獲取操作的引用對映
    -o, --server-option <server-specific>
                          #傳輸選項
    -4, --ipv4            #只使用 IPv4 地址
    -6, --ipv6            #只使用 IPv6 地址
    --negotiation-tip <版本>
                          #報告我們只擁有從該物件開始可達的物件
    --show-forced-updates
                          #在所有更新分支上檢查強制更新
    --set-upstream        #為 git pull/fetch 設定上游

# 取回遠端倉庫的變化,並與本地分支合併
$ git pull [remote] [branch]

3.git push用法:git push [<選項>] [<倉庫> [<引用規格>...]]

#用法:git push [<選項>] [<倉庫> [<引用規格>...]]

    -v, --verbose         #更加詳細
    -q, --quiet           #更加安靜
    --repo <倉庫>         #倉庫
    --all                 #推送所有引用
    --mirror             # 映象所有引用
    -d, --delete          #刪除引用
    --tags                #推送標籤(不能使用 --all or --mirror)
    -n, --dry-run         #演習
    --porcelain           #機器可讀的輸出
    -f, --force           #強制更新
    --force-with-lease[=<引用名>:<期望值>]
                          #要求引用舊的取值為設定值
    --recurse-submodules (check|on-demand|no)
                          #控制子模組的遞迴推送
    --thin                #使用精簡打包
    --receive-pack <receive-pack>
                          #接收包程式
    --exec <receive-pack>
                          #接收包程式
    -u, --set-upstream    #設定 git pull/status 的上游
    --progress            #強制顯示進度報告
    --prune               #清除本地刪除的引用
    --no-verify           #繞過 pre-push 鉤子
    --follow-tags         #推送缺失但有關的標籤
    --signed[=(yes|no|if-asked)]
                          #用 GPG 為推送簽名
    --atomic              #需要遠端支援原子事務
    -o, --push-option <server-specific>
                          #傳輸選項
    -4, --ipv4            #只使用 IPv4 地址
    -6, --ipv6            #只使用 IPv6 地址

# 上傳本地指定分支到遠端倉庫
$ git push [remote] [branch]

# 強行推送當前分支到遠端倉庫,即使有衝突
$ git push [remote] --force

# 推送所有分支到遠端倉庫
$ git push [remote] --all

# 本地存在一個分支,名稱叫:develop_dev,但遠端沒有怎麼辦?
$ git push origin develop_dev

# 刪除遠端分支
$ git push origin --delete [branch-name]

九、撤銷

1.git reset 用法

usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
   or: git reset [-q] [<tree-ish>] [--] <pathspec>...
   or: git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]
   or: git reset --patch [<tree-ish>] [--] [<pathspec>...]
    -q, --quiet           #be quiet, only report errors
    --mixed               #reset HEAD and index
    --soft                #reset only HEAD
    --hard                #reset HEAD, index and working tree
    --merge               #reset HEAD, index and working tree
    --keep                #reset HEAD but keep local changes
    --recurse-submodules[=<reset>]
                          #control recursive updating of submodules
    -p, --patch           #select hunks interactively
    -N, --intent-to-add   #record only the fact that removed paths will be added later
    --pathspec-from-file <file>
                          #read pathspec from file
    --pathspec-file-nul   #with --pathspec-from-file, pathspec elements are separated with NUL character

# 重置暫存區的指定檔案,與上一次commit保持一致,但工作區不變
$ git reset [file]

# 重置暫存區與工作區,與上一次commit保持一致
$ git reset --hard

# 重置當前分支的指標為指定commit,同時重置暫存區,但工作區不變
$ git reset [commit]

# 重置當前分支的HEAD為指定commit,同時重置暫存區和工作區,與指定commit一致
$ git reset --hard [commit]

# 重置當前HEAD為指定commit,但保持暫存區和工作區不變
$ git reset --keep [commit]

# 新建一個commit,用來撤銷指定commit
# 後者的所有變化都將被前者抵消,並且應用到當前分支
$ git revert [commit]

十、儲藏

1.git stash 用法

usage: git stash list [<options>]
   or: git stash show [<options>] [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash clear
   or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
          [-u|--include-untracked] [-a|--all] [-m|--message <message>]
          [--pathspec-from-file=<file> [--pathspec-file-nul]]
          [--] [<pathspec>...]]
   or: git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
          [-u|--include-untracked] [-a|--all] [<message>]

1.1 stash當前修改,檢視儲存

#實際應用中推薦給每個stash加一個message,用於記錄版本,使用git stash save取代git stash命令。示例如下:
$ git stash save "儲存一個readme.md檔案"

#會顯示這個棧的list.
$ git stash list
stash@{0}: On master: 儲存一個readme.md檔案
stash@{1}: On master: groups.cs
stash@{2}: WIP on master: 6a9a740 添加了一個檔案
stash@{3}: WIP on master: 77acf37 初始提交

1.2 重新應用快取的stash

#git stash pop這個指令將快取堆疊中的第一個stash刪除,並將對應修改應用到當前的工作目錄下
$ git stash pop

#git stash apply命令,將快取堆疊中的stash多次應用到工作目錄中,但並不刪除stash拷貝

#取出stash中的上一個專案(stash@{0}),並且應用於當前的工作目錄.
$ git stash apply

#也可以指定別的專案
$ git stash apply stash@{1}

1.3 移除stash

#刪除stash中的專案,刪除上一個,也可指定引數刪除指定的一個專案.
$ git stash list
stash@{0}: On master: groups.cs
stash@{1}: WIP on master: 6a9a740 添加了一個檔案
stash@{2}: WIP on master: 77acf37 初始提交
$ git stash drop stash@{0}
Dropped stash@{0} (6fa4af7aa7fc9f33547b3f62493d3c7c3ba9923f)

#或者使用git stash clear命令,刪除所有快取的stash
$ git stash clear

1.4 檢視指定stash的diff

#可以使用git stash show命令,後面可以跟著stash名字
$ git stash show

 user.cs | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

#在該命令後面新增-p或--patch可以檢視特定stash的全部diff
$ git stash show -p

1.5 從stash建立分支

#想用更方便的方法來重新檢驗儲藏的變更,可以執行 git stash branch,會建立一個新的分支,檢出儲藏工作時所處的提交,重新應用.
$ git stash branch stash_dev

1.5 暫存未跟蹤或忽略的檔案

#預設情況下,git stash會快取下列檔案:
  新增到暫存區的修改(staged changes)
  Git跟蹤的但並未新增到暫存區的修改(unstaged changes)

#預設情況下,git stash不會快取下列檔案:
  在工作目錄中新的檔案(untracked files)
  被忽略的檔案(ignored files)

#git stash命令提供了引數用於快取上面兩種型別的檔案;
   #使用-u或者--include-untracked可以stash untracked檔案;
   git stash push -u -m "全部儲藏"

   #使用-a或者--all命令可以stash當前目錄下的所有修改;
   git stash push -a -m "全部儲藏"
   git stash -a -m "全部儲藏"
======================================================================
創作不易,本人熱衷開源共享 《git常用命令梳理總結》
======================================================================