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

相关文章
相关标签/搜索