基础知识:
- Vim 编辑器知识
一、Git 安装教程:
二、Git 详解笔记
Git 的架构
Git 本地仓库分三部分,其正常工作顺序也是从左到右。
工作区 >>> 暂存区 (stage / index ) >>> 仓库
工作区:指的是在当前 Git Bash 命令行终端的显示项目文件夹;
暂存区(stage
/ index
) :指的是执行了 git add
命令后,文件的提交存放区域;
仓库:指的是在执行 git commit 命令后,文件从暂存区转交到仓库,这个最终的本地仓库存放区域。
特别特别注意:HEAD
指针,是仓库才有的,工作区和暂存区是没有的。
前面提到了,为什么说是本地仓库,在这里,还要提一下,版本控制系统是要有着联网的要求的,这是为了链接到远程的仓库,还有有些版本控制系统的联网很慢,很让人火大,所以联网其实有时候不是那么的让人感觉舒服,当然 Git 现在被用来当做常规化的版本控制系统,是不能和其他的版本控制系统相提并论的,它更优秀好用,Git 支持本地的版本控制,也就是说它能将东西放在远程的仓库,也能放在本地的仓库。
modified的文件add到暂存区的是修改而非整个文件,而commit是把暂存区存储的修改提交到分支上而已。应该是这样的,这一句话及其重要。
关于分布式的理解,在每个本地的仓库都存储完整的项目版本控制数据,就算其他的计算机内的项目版本崩溃了,也没事,从其他完好的计算机中复制过来就行了。
Git 基本命令详解
git status 状态命令
git status
查看当前分支情况,如暂存区情况,和文件修改情况;
git add 添加暂存区命令
git add
添加项目文件(工作区),到暂存区,稳住,不要直接 git commit
git commit -m “message” 提交仓库命令
git commit -m "message"
这是必须要的加上 -m
参数,后面是对提交文件的描述,否则你也别提交到仓库了,丢不起人。
比较差异命令
git diff 工作区 diff 暂存区
git diff filename
查看工作区和暂存区的差异
git diff HEAD – 文件名 工作区与仓库文件版本比较命令
git diff HEAD -- 文件名
查看工作区修改后的文件和仓库区提交后的文件版本差异,
git diff --cached 暂存区 diff 仓库
git diff --cached
查看暂存区和仓库差异
暂存区回退命令
git add的反向命令git checkout
git add
的反向命令git checkout
,撤销工作区修改,即把暂存区最新版本转移到工作区,其实就是撤销,回退 rollback
,暂存区的版本替换掉工作区的版本。
仓库回退命令
git log
查看提交的 id 号,每次提交都会有一个独一无二的 id 号,对于同一个项目版本控制来说。
git reset --hard HEAD
git reset --hard HEAD^
回退上一个版本,即从仓库里拿回上次提交的项目旧版本,然后替换掉工作区内的项目版本,还有暂存区内之前 git add 过的项目更改文件,也会被 reset ,也就是消失了,除非通过
add过的可以找回来,add的时候会把文件内容保存为blob对象存入到.git/objects目录下。
git cat-file --batch-check --batch-all-objects | grep blob可以列出所有blob,譬如"ce013625030ba8dba906f756967f9e9ca394464a blob 6"。通过git show ce013625030ba8dba906f756967f9e9ca394464a可以打印其内容。可以通过遍历这些blob找到被reset掉的版本。如果没有git gc过,可以先用ls -l .git/objects根据时间筛选下最可能的blob,以缩小检查范围。
这里先埋个坑,没试过。
git reset --hard HEAD^^
是回退上上一个版本,所以上上上一个版本,同理可得。
不过为了应对这一情况,一般采用 git reset --hard HEAD~100
,波浪号~100代表100个过去版本。
git reset --hard 提交id
git reset --hard 1004a
这个是指按提交id 来锁定回退版本,从仓库里拿回过去的版本替换掉工作区的版本。
reset
到之前commit
.工作区就会与分支合并,相同文件被分支覆盖,删掉的被新增进来,至于你新增的文件当然还在
git reflog 找回提交 id 命令
同 git log 差不多,不过是找回过去的提交id,每次终端关闭了,就需要用到这个命令。