一、新增文件
1、设置用户签名
签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁。首次安装好git之后必须设置一下签名,否则无法提交代码。
另外,这里设置的签名跟你登录到远程仓的账号没有关系。
git config --global user.name 用户名
git config --global user.email 邮箱
2、初始化本地库
想通过git管理文件目录,首先要让git获取到管理权,所以要初始化。
git init
初始化成功,提示初始化了一个空的git仓库.git
,这里的文件就别改动了,可以打开看看。
3、查看本地库状态
初始化本地库之后,就可以查看本地库的状态了。
git status
看下返回的3行分别说了啥:
- 本地库在master分支,master是默认生成的。
- 目前还没有提交过任何东西。
- 除了没有提交过,而且现在还没有什么东西需要你提交。
这时候新增一个文件的hello.txt
,再用git status
看这里就不一样了。
出现一个新行:Untracked files
,未被追踪的文件,红色标记。说明这个文件只在工作区,但是没有被git追踪。
最后一行的描述也变了,说目前还没有提交文件,但是存在未被追踪的文件。
4、添加暂存区
git的提示做的还是很友好的,基本上都会给你操作提示。接着上面来,现在如何让文件被追踪,提示说了,用git add
。
git add
出现一个warning
,说的是换行符自动替换处理,因为那个文件我直接在git-bash窗口用linux命令新建的,所以自动转化了win用的CRLF,不用管它。
现在重新查看下git status
。
绿了,绿了,只不过不是古天乐(这是一个传奇页游广告的梗),而是刚才的hello.txt
文件。
5、删除暂存区
现在这个文件也只是在暂存区里,暂存区里的文件是可以删掉的。如果现在我不想让这个文件产生一个历史版本,那么要在提交到本地仓库之前删掉它,就在暂存区删吧。
同样git也给了提示。
git rm --cached <file>
成功删除,但是记住这里删的是暂存区的,你本地工作区的文件没动,用ll
查看一下。
6、提交本地库
把文件重新提交到暂存区,接下来就可以提交到本地库,形成一个历史版本了。
git commit -m "日志信息" 文件名
提交成功,看提示信息:
- [master (root-commit) a70616d],这里的
a70616d
就是版本号了,这个是简短版的。 - 1 file changed, 19 insertions(+),1个文件被改变,插入了19行信息(文本里有19行内容)。
7、查看版本信息
刚才提交本地库产生一个版本信息,可以用这个命令查看。
git reflog
显示了刚才提交的版本信息。
a70616d
是版本号。(HEAD -> master
代表指针指向这个第一个版本。
还可以用这个命令查看更相信的版本信息:
git log
可以看到这里的版本号很长a70616d3fc1c69f948a7b0d4ed2b640bedb1e747
,这个就是完整版的版本号了。
二、文件被修改后
上面是新增一个文件,但是最多的场景还是同一个文件被反复修改,现在我去修改hello.txt
文件,增加写内容,然后git status
。
提示有一个文件被修改了,红色表示还没有被追踪,那么重复上面的动作,提交到暂存区即可,用git add
。提交成功了再次查看。
最后再提交本地库。
这里看到最后的提示,有一行新增,一行删除,可是我只是在第一行后面继续增加了内容。
因为git里面是按照行来维护文件的,我修改了第一行内容,实际上对于git来说,要先删除掉之前的第一行内容,然后再增加修改后的第一行内容。
现在查看版本信息git reflog
。
可以看到:
- 有2个版本信息。
- 此时的指针是指向第二个版本。
三、版本穿梭
比如现在我想回退到之前某一个历史版本。
先查看历史版本,git reflog
,目前我有3个版本。
我现在要回到第二次提交的版本,复制出版本号,使用如下命令:
git reset --hard 94ca3de
此时我再查看版本,发现指针已经移到了第二次提交的版本上了。
至于,第一行是告诉你做了一个reset的操作,目标版本号是什么。
git切换版本的原理
底层其实是移动HEAD指针。
可以先打开本地的.git
下的HEAD,可以看到里面指针指向master,说明当前是在master分支上。
接着,可以打开.git/refs/heads/
下面的master,可以看到里面的内容就是当前所在版本的版本号。
当继续切换版本到a70616d
的时候,master文件里的版本号也会变更为对应的。
用示意图来描述的话,其实在我们刚提交完第三个版本的时候,应该是这样的:
当我们切换版本的时候,其实就是指针变了,比如现在切换到第二版本:
接下来,到了分支相关了。