最近写代码的过程中,因为感觉有的写法不符合项目工程规范,想要给代码瘦瘦身减减肥。但是怕大改动会伤及筋骨,就怕改后跳出什么不知道怎么改出来的BUG。又不能一直回退回退,所以想要给代码来个存档功能,随时随刻能读档。
这时候,Git的版本控制的优势就显而易见
上一次仅仅是将本地仓库和远程仓库联系了起来,没有用到版本控制
Git就是一个分布式版本控制软件,GitHub就是一个Git的托管服务
版本控制的引入
比如你要写代码,在这个项目的基础上(已经有了一个功能A)想要实现一个功能B,你就在原本的文件上增改,突然发现B功能有了,但是A崩了。就很难受,想要时光倒流,拿现在和过去的文件相比做比较。
采取版本控制后,你可以将文件还原到之前的状态,比较各状态之间的细节从而查出是修改了哪个地方,找出哪里出了问题。甚至你可以随意删改项目中的文件,照样可以恢复到之前的样子,因而增加了容错率,提供了更多可能性。
Git在你每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失
Git工作流程
①我们一般在工作区修改增删文件
②暂存文件,将文件的快照放入暂存区域。对“文件改动”的一种存档
③提交更新,找到暂存区里的文件,将快照永久性存入Git本地仓库
实践演示
1.改动前
这是一开始我的本地文件夹(请不要吐槽,仅做示范用)
其中那个叫做.git
的隐藏文件夹,这个就是git仓库,以后所有的git操作历史提交记录信息就全部记录在此了,只要这个文件夹在就可以记住我们的全部git操作,很贴心呢。
在Github对应的版本号也正是如此,我们叫版本二吧
改动中
现在我有新的操作,着手进行版本三的开发——增加一个1.txt和删除test.html
所以我进行了以下操作
git status
查看修改的内容,红字部分说明了我们做了什么改动——删除了test.html,增加了1.txt
新建的1.txt文件出现在Untracked files下,没有被记录,实际上不属于版本三的部分
删除test.html的改动也没有被保存
git add [文件名]
跟踪文件,添加至暂存区
也可以用 git add .
全部将改动的文件添加至暂存区。此命令会把工作区的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
此时再运行git status
,会看到1.txt文件已被跟踪,处于暂存状态(staged),显示Changes to be committed。
接下来提交更新至本地仓库:先用git status
命令确定暂存区域准备妥当,
再运行
git commit -m ”提交信息”(提交信息指本次提交的说明,类似于注释)
接下来查看提交历史
git log
在你执行完初始推送后把代码放到GitHub上。
git push
从Github可以看见版本三的提交
你可能会疑惑,为什么test.html还在github上面?这不是我要的版本三
这个问题问得好!
因为我们没有对其进行add,将这个文件的改动提交到暂存状态(staged)区域。
我们再次回到命令行
首先我们查看了状态,发现删除test的改动没有被跟踪提交,一般有红字就要注意啦
之后的操作大家应该看得懂,于是乎变成了版本四?这时候github上面的test.html已经失踪了
3.改动后,版本回退
重点来了,这个版本四不能要了,我想要回来我的版本二!
test.html没了,这是一个很重要的文件,怎么办?
这时候就需要时光倒流(版本回退)
在git log
命令中我们可以看到一大串黄色像乱码一样的字符,那就是版本号(commit id)我们可以用 git reset
命令回退到之前任何一个版本:
借用此篇博客提及的知识点:https://blog.csdn.net/yxlshk/article/details/79944535
重点解释一下这个命令:
git reset
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:
git reset
的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本二,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
使用命令回退到版本二:
git reset --hard [版本号,可以不用写全部,会自动寻找]
版本回退成功了,此时你会惊讶的发现你的本地文件夹恢复到了版本二当初的样子
1.txt消失了,test.html复活了
但是github那边还没有改变,如果你想的话,接下来把这个老版本二推过去
于是你使用git push
报错,因为我们本地库HEAD指向的版本比远程库的要旧
所以我们要用git push -f
强制推上去,就可以了
然后Github回到了当初的模样
某种意义上讲,时光倒流了。