Git初始化 暂存区

基本操作

git --version
git config --global user.name "guoxi.zhang"
git config --global user.email "[email protected]"
删除Git配置文件中某项值
git config --unset --global user.name

如果拥有系统管理员的权限,你希望注册的别名能被其他用户使用,可以执行如下命令:
sudo git config --system alias.ci commit
也可以只执行如下命令,只在本用户的全局配置中添加Git别名
git config --global alias.ci commit
在git命令输出中开启颜色显示
git config --global color.ui true
git init   命令再当前目录完成版本库的初始化
git init

该命令会自动创建dir目录并在当前目录的dir目录下初始化版本库,所以
mkdir demo   cd demo   git init
相等于 git init demo
运行该命令之后会在demo目录创建一个.git的隐藏文件,隐藏的.git目录就是Git版本库(又叫仓库,repository)
.git版本库所在的目录为工作区
在工作区创建一个welcome.txt文件
echo "hello" > welcome.txt
然后将文件条件到版本库中
git add welcome.txt
git commit -m "initialized"
工作区文件内容搜索命令
git grep "工作区文件内容"
在Git工作区的某个子目录下执行操作的时候,会在工作区目录中依次向上递归查找.git目录,找到的.git目录就是工作区对应的版本库,.git所在目录就是工作区,在非.git工作区执行git命令时会因为找不到.git目录报错

显示版本库.git目录所在位置
git rev-parse --git-dir
显示工作区根目录
git rev-parse --show-toplevel
相对于工作区根目录的相对目录
git rev-parse --show-prefix
显示从当前目录回退到工作区的根的深度
git rev-parse --show-cdup

打开本项目的配置文件
git config -e
打开当前用户的配置文件
git config -e --global
打开系统的配置文件
git config -e --system
优先级是本项目>当前用户>系统

读取INI文件中某项的值
git config

.
设置INI文件中某项的值
git config
. value
如果对工作区的文件没有做任何修改,Git默认不会执行提交,使用--allow-empty参数允许执行空白提交

git diff     工作区与提交任务(暂存区)中相比的差异
git diff HEAD    工作区和HEAD(当前分支)相比
git diff --cached 或者 git diff --staged    暂存区和版本库文件的差异
git checkout -- welcome.txt     撤销工作区中welcome.txt尚未提交的更改

git status  git diff  命令扫描工作区变动的原理:先依据.git/index文件中记录的(用于跟踪工作区文件的)时间戳,长度等信息判断工作区文件是否改变,如果工作区的时间戳改变了,就说明工作区的文件内容可能被改变了,需要打开文件,读取文件内容,与更改前的原始文件做比较,判断文件内容是否改变。如果判断文件内容没有改变,就将该文件新的时间戳记录到.git/index文件中
文件.git/index实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区,在这个虚拟工作区的目录树中,记录了文件名和文件的状态信息(时间戳和文件长度),文件的内容并没有存储在其中,而是保持在Git对象库.git/objects目录中,文件索引建立了文件和对象库中对象实体之间的对应关系。下图展示了工作区,版本库的暂存区和版本库之间的关系

摘自Git权威指南
  • 图中左侧为工作区,右侧为版本库。在版本库中标记为index的区域是暂存区,标记为master的为master分支所代表的的目录树
  • 图中HEAD实际上是指向master分支的一个"游标",所以图示命令中出现master的地方可以用HEAD来代替
  • 图中objects标识的区域为Git的对象库,实际wei位于.git/objects目录下
  • 当对工作区修改或者新增的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改或者新增的文件内容会被写入到对象库的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中
  • 当执行提交操作(git commit)时,暂存区的目录树会写到版本库中,master分支会做相应的更新,即master最新指向的目录树就是提交时原暂存区的目录树
  • 当执行git reset HEAD命令时,暂存区的目录树会被重写,会被master分支指向的目录树所替换,但工作区不受影响。
  • 当执行git rm --cached 命令时,会直接从暂存区删除指定的文件,工作区则不做任何改变
  • 当执行 git checkout .或者git checkout -- 命令时,会用暂存区全部的文件或者指定的文件替换工作区的文件,这个操作很危险,会清楚掉工作区中未添加到暂存区的改动
  • 当执行git checkout HEAD或者git checkout HEAD 命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和工作区的文件,这个命令是很危险的,不仅会清除工作区中未提交的改动,而且也会清除暂存区中未提交的改动
git diff

git ls-tree -l HEAD 查看当前HEAD指向的目录树

git ls-tree -l HEAD

git clean -fd 清空当前工作区中没有加入到版本库的文件和目录
git checkout . 用暂存区内容刷新工作区
git ls-files -s 显示暂存区的目录树

git ls-files -s

这个输出和git ls-tree命令输出的不一样,其中第三个字段不是文件大小,而是暂存区编号,如果想针对暂存区的文件使用git ls-tree命令,需要先将暂存区的目录树写入到Git对象库(用git write-tree命令),然后针对该目录树执行git ls-tree命令,如下图
git write-tree

git ls-tree

如果想递归显示目录内容,则是用-r参数,使用-t参数可以把递归中遇到的每一颗数显示出来,而不是显示最终的文件,示例如下
git write-tree|xargs git ls-tree -r -t

下图展示了不同的git diff命令的作用范围:

不要使用git commit -a

-a 参数会对本地所有的变更的文件执行提交操作,包括对本地修改的文件和删除的文件,但不包括未被版本库跟踪的文件。使用这个命令将失去Git暂存区带来的巨大好处:对提交内容进行控制的能力

你可能感兴趣的:(Git初始化 暂存区)