Git初始化 暂存区

基本操作

git --version
git config --global user.name "guoxi.zhang"
git config --global user.email "guoxi.zhang@qq.com"
删除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目录并在当前目录的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 <section>.<key>
设置INI文件中某项的值
git config <section>.<key> 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 <file>命令时,会直接从暂存区删除指定的文件,工作区则不做任何改变
  • 当执行 git checkout .或者git checkout -- <file>命令时,会用暂存区全部的文件或者指定的文件替换工作区的文件,这个操作很危险,会清楚掉工作区中未添加到暂存区的改动
  • 当执行git checkout HEAD或者git checkout HEAD <file>命令时,会用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暂存区带来的巨大好处:对提交内容进行控制的能力

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,865评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,910评论 0 11
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,502评论 0 13
  • 传说狐狸的眼泪可以起死回生,但代价是失去自己的双眼。小狐狸不知道自己是否有这样的能力,但她愿意为了生命中...
    陈小胖啊阅读 339评论 0 0
  • 外婆是一个很美的女人,而且也非常爱美,从我记事起,外婆在我的印象中头发总是梳得光溜溜的,然后在脑后别个髻,再戴上那...
    水亦诗992阅读 296评论 12 3