git常用命令梳理總結
阿新 • • 發佈:2021-07-15
一、新建程式碼庫
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常用命令梳理總結》
======================================================================