Git-命令

git reset

  • 如下 commit 若省略,則默認爲 HEAD.即 commit 的默認取值爲 HEAD.git

git reset [commit]  [--]  paths 使用指定提交 commit 下的文件 paths 替換掉暫存區中的同名文件.shell

  • -- 可選,爲了不 paths 與引用同名而發生衝突,可使用 -- 做爲分隔.app

git reset [mode] [commit]
ui

  • 根據 mode 的取值可能執行下列操做,mode 可取值: --soft,--mixed,--hardspa

    1. 更改引用的指向: 若當前處於分離頭指針的狀態,則將 HEAD 引用文件的內容更改成 commit 的 SHA1 值;不然,將 HEAD 指向引用文件(即當前分支對應的引用文件)的內容更改成 commit 的 SHA1 值.3d

    2. 替換暫存區: 將 commit 對應的 tree object 的內容寫至 .git/index 中,即替換後,暫存區的內容與 commit 對應的 tree object 一致.版本控制

    3. 替換工做區: 替換後,工做區的內容變得與暫存區的內容一致(注意工做區中未被追蹤的文件不會被移除).指針

  • --soft 則僅執行第 1 步操做.日誌

  • --mixed mode 的默認取值,執行前 2 步操做.code

  • --hard 上述 3 步操做所有執行.

git reflog

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

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

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 顯示被忽略的文件.用'!'標識

git diff

  • 如下,若指定了 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

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 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

git clean [options] 移除未被版本庫追蹤的文件或目錄,options 可取值:

  • -n 顯示將要執行的操做,但不實際執行.

  • -f 當 clean.requireForce==true 時,須要指定 -f 纔會執行刪除操做.

  • -d 移除未被追蹤的目錄,默認狀況下只會移除未被追蹤的文件.

$ git clean -n
將刪除 ReadMe     # 僅移除未被追蹤的文件
$ git clean -nd
將刪除 ReadMe
將刪除 Test/

git stash

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 

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

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

git rm [options] paths 從暫存區,與工做區中移除 paths 指定的文件,至關於將文件從工做區中移除,而後更新暫存區,paths 必須已經被版本庫追蹤.options 可取值:

  • --cached 僅從暫存區中移除 paths 指定的文件,默認狀況下,暫存區,工做區中 paths 指定的文件都會被移除.

git mv

git mv [options] source destination 在工做區重命名/移動 source 指定的文件,目錄,符號連接,source 必須已經被版本庫追蹤.而且會自動更新暫存區.options 可取值:

  • -v 詳細輸出

  • -n 顯示將要執行的操做,但不實際執行.

  • -k 當移動/重命名一個文件發生錯誤時((如: 文件不存在,文件未被版本控制追蹤,目錄文件已經存在且未指定 -f 選項)),跳過該移動,重命名操做.繼續移動/重命名後續文件.

  • -f 強制執行移動操做.即當 destination 已經存在時,仍用 source 覆蓋 destination

相關文章
相關標籤/搜索