如下 commit 若省略,則默認爲 HEAD.即 commit 的默認取值爲 HEAD.git
git reset [commit] [--] paths 使用指定提交 commit 下的文件 paths 替換掉暫存區中的同名文件.shell
-- 可選,爲了不 paths 與引用同名而發生衝突,可使用 -- 做爲分隔.app
git reset [mode] [commit]
ui
根據 mode 的取值可能執行下列操做,mode 可取值: --soft,--mixed,--hardspa
更改引用的指向: 若當前處於分離頭指針的狀態,則將 HEAD 引用文件的內容更改成 commit 的 SHA1 值;不然,將 HEAD 指向引用文件(即當前分支對應的引用文件)的內容更改成 commit 的 SHA1 值.3d
替換暫存區: 將 commit 對應的 tree object 的內容寫至 .git/index 中,即替換後,暫存區的內容與 commit 對應的 tree object 一致.版本控制
替換工做區: 替換後,工做區的內容變得與暫存區的內容一致(注意工做區中未被追蹤的文件不會被移除).指針
--soft 則僅執行第 1 步操做.日誌
--mixed mode 的默認取值,執行前 2 步操做.code
--hard 上述 3 步操做所有執行.
git reflog show [ref]
顯示 ref 對應的引用文件內容變動狀況.ref 的默認取值爲 HEAD.如:
# 至關於將 .git/logs/HEAD 的內容格式化後顯出出來 $ git reflog show HEAD 91d5974 HEAD@{0}: reset: moving to HEAD^ ac4d8f1 HEAD@{1}: reset: moving to HEAD^ cdd50f5 HEAD@{2}: checkout: moving from cdd50f5c73367c96008521e17bf3b54830b2e188 to master cdd50f5 HEAD@{3}: reset: moving to cdd50f5 ac4d8f1 HEAD@{4}: checkout: moving from master to ac4d8f10 cdd50f5 HEAD@{5}: commit: 3 ac4d8f1 HEAD@{6}: commit: 2 91d5974 HEAD@{7}: commit (initial): Hello
注意: <refname>@{n} 也是一種引用.表示引用 refname 的前第 n 次修改,因此 refname@{n} 與 refname 指向相同類型的 git object.
git log [options] 用來顯示提交日誌,options 可取值:
--stat 顯示文件變動記錄
--pretty=FORMAT 用來控制顯示的格式.FORMAT 可取值:
oneline,對於每一次提交只顯示一行信息.
--abbrev-commit 只顯示提交 SHA1 值的前n位,n 由 --abbrev=n 指定
--oneline 等同於 --pretty=oneline --abbrev-commit
--decorate 在提交 ID 旁邊顯示該提交關於的引用(里程碑,分支)
-n 只顯示前 n 條提交日誌.
$ git log --stat -2 --pretty=oneline --abbrev-commit --abbrev=9 48549924c 新增 protect 子命令 # --abbrev-commit --abbrev 指定了 SHA1 值只顯示了 9 位. # --pretty=oneline 對於每一次提交只顯示一行. get_value_from_args.c | 27 +++++++++++++++++++++++++++ main.c | 34 ++++++++++++++++++++++++---------- main.h | 3 +++ prot2str.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 10 deletions(-) # --stat 將每一次提交至關於父提交的變動狀況打印出來. 11176be04 添加了 unmap 子命令 get_value_from_args.c | 4 +++- main.c | 20 ++++++++++++++++++-- main.h | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) # -2 控制着僅顯示 2 條提交日誌.
git status [options] 顯示工做區目錄樹,暫存區目錄樹,HEAD 指向的 tree object 三者之間的改動,options 可取值:
-s 精簡輸出.輸出格式:[暫存區的改動][工做區的改動] 文件名,其中:
暫存區的改動,即暫存區目錄樹相對於 HEAD 指向的 tree object 的變更,可取值有: A(新增),M(修改),D(刪除),
工做區的改動,即工做區目錄樹相對於暫存區目錄樹的改動,可取值: A,M,D.如:
$ git status -s --ignored M get_value_from_args.c M main.c M main.h A prot2str.c ?? ReadMe # 代表 ReadMe 還未被版本庫追蹤 !! .cproject # .cproject 被忽略. !! .project !! Debug/
--ignored 顯示被忽略的文件.用'!'標識
如下,若指定了 paths,則只比較指定的文件.不然比較全部的文件,固然,不包括未被追蹤的文件.
git diff [commit] [--] [paths]
顯示 commit 指向的 tree object 與當前工做區目錄樹之間的變更.
git diff --cached [commit] [--] [paths]
顯示 commit 指向的 tree object 與當前暫存區目錄樹之間的變更.
git diff commit1 commit2 [--] [paths]
顯示 commit1 指向的 tree object 與 commit2 指向的 tree object 之間的變更.
git ls-tree [options] <tree object> 顯示 tree object 的內容,options 可取值:
-l 顯示文件的尺寸.
$ git ls-tree master # master->commit object->tree object 100644 blob 662779aace1a6d18f0712081e69b4b31b3ad3484 get_value_from_args.c 100644 blob 95accbfbd3d3789e84fff6d9e0cefb8a344dc1e8 macros.h 100644 blob 968211f49ddb97fb8c77e614825462472013b81b main.c 100644 blob 00f4ace76fe5c2d2987c7a7d966f8d761495930a main.h 100644 blob 54ccbba32ab3eae380fbd20e72c68bebb3234137 parse_cmdline.c 100644 blob 2cdf08140d625ea18a3214877f364b6976aeea91 str2int.c $ git tag -m"註釋" V1.0 $ git ls-tree V1.0 # V1.0->tag object->commit object->tree object 100644 blob 662779aace1a6d18f0712081e69b4b31b3ad3484 get_value_from_args.c 100644 blob 95accbfbd3d3789e84fff6d9e0cefb8a344dc1e8 macros.h 100644 blob 968211f49ddb97fb8c77e614825462472013b81b main.c 100644 blob 00f4ace76fe5c2d2987c7a7d966f8d761495930a main.h 100644 blob 54ccbba32ab3eae380fbd20e72c68bebb3234137 parse_cmdline.c 100644 blob 2cdf08140d625ea18a3214877f364b6976aeea91 str2int.c
git write-tree 將暫存區(即 .git/index)的內容到寫入到一個 tree object 中.
root@wangxiaowei-Lenovo-G470:~/CCProject/Mmap# git write-tree b9335367560fcbb14669227c427d3020cb10362c # tree object 的 SHA1 值. root@wangxiaowei-Lenovo-G470:~/CCProject/Mmap# git cat-file -t b9335367 tree root@wangxiaowei-Lenovo-G470:~/CCProject/Mmap# git cat-file -p b9335367 100644 blob 9174261e67b9373089e44c904cb54828f6879d39 get_value_from_args.c 100644 blob 95accbfbd3d3789e84fff6d9e0cefb8a344dc1e8 macros.h 100644 blob 42ee3de5ac8d993562fa46390fda86ec3671fdf6 main.c 100644 blob 41fbee4d6cd4b37c7ecb7432cb7c5f2a086b91de main.h 100644 blob 54ccbba32ab3eae380fbd20e72c68bebb3234137 parse_cmdline.c 100644 blob b3ecbf4242e89091c8412d53e0999d41e68d0f6c prot2str.c 100644 blob 2cdf08140d625ea18a3214877f364b6976aeea91 str2int.c
git clean [options] 移除未被版本庫追蹤的文件或目錄,options 可取值:
-n 顯示將要執行的操做,但不實際執行.
-f 當 clean.requireForce==true 時,須要指定 -f 纔會執行刪除操做.
-d 移除未被追蹤的目錄,默認狀況下只會移除未被追蹤的文件.
$ git clean -n 將刪除 ReadMe # 僅移除未被追蹤的文件 $ git clean -nd 將刪除 ReadMe 將刪除 Test/
git stash save [options] [message] 保存當前工做進度,默認操做是建立2個 tree object,分別保存暫存區,工做區的目錄樹信息,而後基於這 2 個 tree object 建立 2 個 commit object,再調用 git reset --hard HEAD 使得工做區,暫存區保持一種乾淨的狀態.options 可取值:
--keep-index 僅替換工做區,保存暫存區的狀態,即在保存暫存區,工做區的目錄樹信息後,不是調用 git reset,而是調用 git checkout --. .
--no-keep-index 默認選項,在保存進度後,替換工做區,暫存區,即調用 git reset --hard HEAD.
-u | --include-untracked 將工做區中未被版本庫追蹤的文件/目錄也保存下來,即建立一個 tree object 保存未被追蹤的文件/目錄,再基於該 tree object 建立一個 commit object,而後調用 git clean -fd 清除未被追蹤的文件/目錄,從而使工做區保存在一種乾淨的狀態.
# 工做區中當前狀態 # log 在 HEAD 中的內容爲 # Hello. # log 在暫存區中的內容爲: # Hello # Hello-2 # log 在工做區中的內容爲: # Hello # Hello-2 # Hello-3 $ git status -s # 工做區中當前狀態. MM log ?? Hello # Hello,Worl/World 未被追蹤 ?? Worl/ $ git stash -u # 保存當前工做進度 Saved working directory and index state WIP on master: 649c8fe 2 HEAD 如今位於 649c8fe 2 $ git status -s # 在保存進度後,工做區處於'乾淨'狀態. $ ls # 未被追蹤的文件/目錄被移除,即調用了 git clean -fd checksum.cc Debug log mmap test.cc test.h write.cc $ cat log # log 的內容也被重置. Hello $ git cat-file -p stash@{0} tree 2c9fb9f3097dde3bd1d46e7c266da90922e0aa29 # 保存了工做區的目錄樹信息 parent 649c8fe0f0c2e44bfc21bcb615a6f6351470bcb4 parent 41b5870dcd1eea6d02229cdb229d137d16ec6a67 parent 5f82a4da694d4adaf823ed1dbfcb4cbf54e57703 author WangXiaoWei <1258941862@qq.com> 1401622464 +0800 committer WangXiaoWei <1258941862@qq.com> 1401622464 +0800 WIP on master: 649c8fe 2 $ git cat-file -p stash@{0}^2 tree 76fa8fe4ff27e67611d26e918d14f0d5945d1bb8 # 保存了暫存區的目錄樹信息 parent 649c8fe0f0c2e44bfc21bcb615a6f6351470bcb4 author WangXiaoWei <1258941862@qq.com> 1401622464 +0800 committer WangXiaoWei <1258941862@qq.com> 1401622464 +0800 index on master: 649c8fe 2 $ git cat-file -p stash@{0}^3 tree 276225d25e24c3951d92da1d59ee82c61da0a139 # 保存了未被追蹤的文件/目錄 author WangXiaoWei <1258941862@qq.com> 1401622464 +0800 committer WangXiaoWei <1258941862@qq.com> 1401622464 +0800 untracked files on master: 649c8fe 2 $ git cat-file -p stash@{0}^3^{tree} # 未被追蹤的文件/目錄 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 Hello 040000 tree a354901902a5160a578ef106e8c5501de5c3efd1 Worl $ git stash pop --index # 應用保存的工做進度. $ git status -s # 此時工做區中當前狀態. MM log ?? Hello # Hello,Worl/World 未被追蹤 ?? Worl/
git stash list 顯示當前擁有的工做進度.
$ git stash list stash@{0}: WIP on master: 649c8fe 2 stash@{1}: WIP on master: 649c8fe 2 stash@{2}: WIP on master: 649c8fe 2
注意,通常都是經過 stash@{n} 來訪問工做進度.
git stash pop [--index] [stash] 恢復工做進度 stash,而後從工做進度列表中移除工做進度 stash.stash 的默認值爲 stash@{0}
--index 恢復暫存區,默認狀況下不會恢復暫存區的內容.
# 演示 git stash pop 默認不會恢復暫存區. # 工做區中當前狀態 # log 在 HEAD 中的內容爲 # Hello. # log 在暫存區中的內容爲: # Hello # Hello-2 # log 在工做區中的內容爲: # Hello # Hello-2 # Hello-3 $ git status -s # 工做區中當前狀態. MM log $ git stash $ git status -s # 工做區處於'乾淨'狀態. $ git stash pop # 應用工做進度 # 能夠發現 log 在暫存區中的內容與在 HEAD 中的內容一致. $ git status -s M log $ git cat-file -p $(git write-tree):log Hello # 當前 log 在暫存區中的內容 # 工做區被恢復了. $ cat log Hello Hello-2 Hello-3
git stash apply [--index][stash] 等同於 git stash pop,只不過不會移除被恢復的工做進度 stash.
git stash drop [stash] 刪除工做進度 stash,stash 的默認值爲 stash@{0}
git stash clear 移除全部的工做進度.
git stash branch <branch_name> <stash> 基於工做進度 stash 建立分支 branch_name.
git checkout [commit] [--] [paths] 替換工做區.
commit 若爲空,則使用暫存區下的文件 paths 來替換工做區中的同名文件.若不爲空,則使用指定提交下的文件 paths 來替換工做區與暫存區中的同名文件.
若 paths 指定的文件在工做區,或者暫存區中已經不存在,則新建該文件.
若 paths=='.',則表示是全部的文件,如 git checkout -- .,即用暫存區下全部的文件來替換工做區下同名文件.
若工做區或者暫存區中存在新增文件,則不會刪除新增文件.
git checkout <commit> 修改 .git/HEAD 文件,而後使用 commit 下的全部文件替換工做區與暫存區中的同名文件.
修改 .git/HEAD 文件: 若 commit 是一個分支名,則更改 .git/HEAD,使其指向新的分支;不然將 commit 的 SHA1 值記錄在 .git/HEAD 中,此時進入分離頭指針狀態.如:
$ git branch Branch * master $ cat .git/HEAD ref: refs/heads/master $ git checkout Branch 切換到分支 'Branch' $ cat .git/HEAD # HEAD 指向着當前分支. ref: refs/heads/Branch $ git checkout $(cat .git/refs/heads/master) $ cat .git/HEAD # 進入分離頭指針狀態 53bcdd3bd8a9cee0b1041d84ba425dc8d4daf44e
git checkout -b <new_branch_name> [<commit>] [--track] 建立分支 new_branch_name 並切換到該分支.
<commit> 指定了分支 new_branch_name 引用的提交
--track 若 <commit> 經過一個分支名指定,則會在新建分支 new_branch_name 與該分支創建追蹤
git describe [--dirty] 爲當前最後一次提交顯示一個易記的名稱,格式爲: 基礎版本號-距離數字-當前最後一次提交ID,其中:
基礎版本號,距離當前提交最近的 tag 名稱
距離數字,當前提交距離基礎版本的提交次數.
--dirty 若工做區/暫存區對文件有改動,則添加後綴 -dirty.不然不顯示.如:
$ git log --decorate --oneline 53bcdd3 (HEAD, master, Branch) 2 c7149e8 初始化 649c8fe 2 91d5974 (tag: Zhong, tag: Qing) Hello $ git describe --dirty Zhong-3-g53bcdd3-dirty $ git describe Zhong-3-g53bcdd3
git rm [options] paths 從暫存區,與工做區中移除 paths 指定的文件,至關於將文件從工做區中移除,而後更新暫存區,paths 必須已經被版本庫追蹤.options 可取值:
--cached 僅從暫存區中移除 paths 指定的文件,默認狀況下,暫存區,工做區中 paths 指定的文件都會被移除.
git mv [options] source destination 在工做區重命名/移動 source 指定的文件,目錄,符號連接,source 必須已經被版本庫追蹤.而且會自動更新暫存區.options 可取值:
-v 詳細輸出
-n 顯示將要執行的操做,但不實際執行.
-k 當移動/重命名一個文件發生錯誤時((如: 文件不存在,文件未被版本控制追蹤,目錄文件已經存在且未指定 -f 選項)),跳過該移動,重命名操做.繼續移動/重命名後續文件.
-f 強制執行移動操做.即當 destination 已經存在時,仍用 source 覆蓋 destination