文章目录
1.GIt的四个区域
- Workspace:工作区,就是你平时存放项目代码的地方
- Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
2.Git中文件的四种状态
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
- Unmodifid: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modifid: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
- Stated: 暂存状态. 使用git add 可以将文件加入暂存区,时刻记住,我们commit 的文件,是当前存在暂存区里面的文件,如果文件被修改了,但是没有更新到缓存区,commit的时候还是提交了未修改的文件!
四种状态如图
3.Utracked和Tracked状态转换理解和转换
我们新建一个项目时,在项目中新建一个新文件,这时候,这个文件就是untracked的,意思就是,git在你上一次commit以后的目录中没有发现这个文件,所以不会追踪这个文件。
我们需要使用 git add <filename>
或者git add .
(add所有文件)将文件加入暂存区,此时你会发现,文件变为Stated和tracked
然后我们修改hpf.md文件,再次查看状态
有同学就会好奇,为什么会出现一个红色的hpf.md(modifid),和一个绿色的hpf.md。因为我们在修改了hpf.md文件以后,并没有将文件add到暂存区域里面,所以我们如果这时候commit,我们会将没有修改的文件提交到本地仓库
以上我们可以得出结论:****git add <文件名>
命令,可以将文件加入暂存区,同时如果文件处于Untracked状态,则git会追踪此文件,文件状态变为Tracked
4.明确判断modified和unmodified的参照物
其次首先明确,modified和unmodified,的参照物是什么?也就是说,我modified和unmodified是以那个区域的状态为参照物的。
我们先使用git status
命令查看(之前已经commit过一次,三个区域的内容一致)
此时,所有文件都是modified,hpf.md中内容是:我在你家
我们修改hpf.md文件内容为我在海大修电脑,查看stauts
此时文件已经变为modified,我们将hpf.md放入暂存区,再次查看status
还是modified,但是hpf.md的状态变成了tracked。
我们将暂存区代码提交
再次查看状态
发现hpf.md已经变成modified了。
从上述的状态我们发现,在没有commit之前,不论我们add文件以前,和add了文件以后,工作区的文件被提交到暂存区,他们都是modified,所以我们可以认为,判断是否modified的参照物是本地仓库中的对应文件的内容。
5.Modified和Unmodified之间相互转换(修改的恢复)
讨论这个问题的时候,我们首先要明确一个点: 上面的例子也说到,无论是修改了没有add到暂存区,还是add到了暂存区,其状态都是modified。所以我们讨论Modified和Unmodified之间相互转换,需要从两个维度来。
- 工作区(add前):使用
git resore <filename>
恢复到原来(和暂存区或者本地仓库一致)的状态**(以暂存区或者本地仓库为参照(因为还没有add,他们两个内容一致))**
或者使用git checkout -- <filename>
将被修改的文件恢复**(以暂存区为参照单位)!!!注意与git resore <filename>
参照的区别** - 暂存区(add后):
git restore --staged <filename>
或者git reset -- filename
将暂存区文件恢复到修改以前(以本次仓库内容为参照,不改变工作区)然后再重复第一步即可。
将暂存区恢复到指定的commit节点的仓库内容:git reset HEAD -filename
HEAD可以是提交的一个号码,用git log
可以查看**(只改变暂存区,其他区域不受影响)**
6.git diff 基本用法
git diff
什么参数都不加,默认比较工作区暂存区的差异git diff --cached [<path>...]
比较暂存区与最新本地版本库(本地库中最近一次commit的内容)git diff HEAD [<path>...]
比较工作区与最新本地版本库。如果HEAD指向的是master分支,那么HEAD还可以换成mastergit diff commit-id [<path>...]
比较工作区与指定commit-id的差异git diff --cached [<commit-id>] [<path>...]
比较暂存区与指定commit-id的差异git diff [<commit-id>] [<commit-id>]
比较两个commit-id之间的差异git diff commit-id1 commit-id2 --stat
查看两个提交版本id修改了那些文件.git diff 版本号码1 版本号码2 src
比较两个版本的src 文件夹的差异