Git-基础3

配置的三个级别

local 针对当前仓库,优先级最高
global 针对当前用户,优先级其次
system 针对系统,优先级最低

四种对象

git 使用40个16进制字符的 SHA-1 Hash 来唯一标识对象,git 有4种对象:

  • blob 文本文件,二进制文件,链接文件,是在代码提交到 Stage 区时根据内容生成的二进制文件
  • tree 目录结构,包括 tree 和 blob,在进行提交时把 Stage 区中的 blob 对象封装在 tree 中
  • commit 存储一次提交的信息,指向一个 tree
  • tag 指向固定的历史提交,可以当做是 commit 的别名

git 只关心文件的内容,如果2个文件有同样的内容,它们会指向同一个 blob 对象,文件名等其它信息会存储在 tree 对象中。

git hash-object [file-name] 查看文件的 hash 码
git cat-file -p [id] 显示仓库中对象的类型、大小和内容信息

工作流程

working directory 工作区,日常编辑代码的地方,维护着一个树形结构
git repository 本地仓库,commit 指向的一个树形结构
staging area 暂存区,.git/index 文件,工作区与本地仓库中间的缓存,维护的是虚拟的树形结构,代表的是需要提交的工作的状态

工作区是我们能看到的区域,我们在工作区修改增加代码,完成编辑后,用 git add 将工作区文件添加到暂存区,然后利用 git commit 提交文件到本地仓库。分支就是 commit 的引用,在这些分支上工作会产生各自的历史,分支切换就是 HEAD 引用的移动以及暂存区和工作区的还原,tag 指向一个固定的 commit。

命令

git add 工作区到暂存区
git commit 暂存区到和本地仓库
git rm [file-name] 删除暂存区和工作区的文件
git rm --cached [file-name] 删除暂存区的文件
git mv [old-name] [new-name] 重命名或移动暂存区和工作区的文件
git status 查看工作区和暂存区的区别
git stash save "name" 将工作区放入 stash 栈中
git stash save -a "name" 将工作区和暂存区放入 stash 栈中
git stash pop --index stash@{0} 还原工作区和暂存区
git stash apply --index stash@{0} 还原工作区和暂存区,不删除 stash 中的索引
git stash drop stash@{0} 删除 stash 栈中的索引
git stash clear 清除 stash 栈中的全部索引
git merge --abort 放弃当前合并操作

查看与对比历史记录

git show 显示 git 对象
git log [--oneline] [--decorate] [--graph] [--all] 查看历史记录
git diff [--color-worlds] [--word-diff] 查看工作区与暂存区的区别
git diff [file-name] 查看工作区与暂存区指定文件的区别
git diff --cached 查看暂存区与本地仓库的区别
git diff [提交hash码或者HEAD] 查看工作区与本地仓库的区别
git diff 提交区hash码A 提交区hash码B 查看两个不同提交的区别
git diff 分支A的某个hash码 分支B的某个hash码 两个不同分支间比较

撤销修改

git checkout [file-name] 从暂存区或本地仓库恢复文件,回到最近一次 git commit 或 git add 的状态
git checkout . 从暂存区或本地仓库恢复所有文件,撤销工作区修改,不改变暂存区
git checkout [commit 引用] [file-name] 还原工作区和暂存区
git reset [file-name] 撤销暂存区文件
git reset . 撤销所有暂存区文件,清空暂存区文件,不改变工作区
git reset [commit 引用] [file-name] 还原暂存区
git clean -n [-X|x] 查看执行 git clean 会清除的文件
git clean -f 清除未跟踪的文件,不包括 gitignore 中指定的文件
git clean -x -f 清除所有未跟踪文件,包括 gitignore 中指定的文件
git clean -X -f 保留 gitignore 之外的文件,清除 gitignore 中指定的文件
git revert [commit 引用] 产生一个新的提交来撤销以前的提交

commit 引用可能是 commitID、branch、HEAD、tag。

重写历史记录

git commit 和 git rebase 参考Git-基础2
git reflog 查看 HEAD 引用的历史
git reset --hard HEAD@{n} 回到指定的历史提交,还原暂存区和工作区
git reset --mixed HEAD@{n} 回到指定的历史提交,只还原暂存区,为默认参数
git reset --soft HEAD@{n} 回到指定的历史提交,不原暂存区和工作区

gitignore 文件

  • 以’#’开始的行,被视为注释
  • 以斜杠“/”开头表示目录
  • 以星号“*”通配多个字符
  • 以问号“?”通配单个字符
  • 以方括号“[]”包含单个字符的匹配列表
  • 以叹号“!”表示不忽略(也就是跟踪)匹配到的文件或目录
  • git check-ignore -v [file|folder] 查找 gitignore 文件中匹配该文件的规则