# highlight: a11y-dark theme: scrolls-light
本文正在参加「金石计划 . 瓜分6万现金大奖」 (opens new window)
最近有被git整“破防”了,所以有了下文。。。
# 一、了解Git
要想熟练使用Git,必须知己知彼,方能百战不殆。Git是什么?Git是一个开源的分布式版本控制系统,与CVS、Subversion等不同,不需要服务器端软件的支持。在执Git命令的时候,记得住命令不算是本事,知道命令的来龙去脉才是真。
Git安装可戳这里-->https://git-scm.com/downloads (opens new window)
首先,我们要想了解Git的一些专业术语,这点很重要,对一些操作的撤销等操作也很有帮助。如下:
//工作区(Workspace)
指当前工作空间,能在本地文件夹里看到的文件结构,一般就是你编辑代码的地方,如VScode,HBuildx等编译器。通
过git init初始化工作空间或者clean工作空间时,文件内容和暂存区是一样的;但是如果文件内容修改(比如新增了
一行,删除了一行,更改了某些字符,删了一些又加了一些,创建一个新文件等操作),工作区和暂存区的文件内容就不同了。
//暂存区/索引(Index/Stage)
有的时候也叫Cache区,即文件暂时存放的区域,有点缓存的意思。一般执行git add之后文件去到的区域,也用于与
本地仓库之间做一个缓存。所有暂时存放在暂存区中的文件将会通过git commit -m 'xxxx'提交到本地仓库,后面提
交的内容会覆盖之前提交的内容。
//仓库区/本地仓库/存储库(Local Repository)
Git是分布式版本控制系统,和其他版本控制系统不同之处在于它可以完全去中心化,即不需要和中央服务器进行通
信,在本地可进行全部离线操作,例如git log,history,commit,diff等。一般执行git commit -m 'xxxx'命令后
文件就来到了这个区域。
//Remote:远程仓库,
中心化仓库,所有人共享,本地仓库和远程仓库进行交互,同时能把所有内容更新到本地仓库,再把内容上传到远程仓
库,可设置开源共享。一般在执行git push后去到的区域,即在Gitee、Github等里面的仓库中。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
如图所示:
接下来,就唠一唠这些区域和命令的那些事~。
# 二、Git创建仓库
###1、创建一个仓库
(1)使用已存在的目录(不是空目录)创建一个仓库
git init //会在当前目录下生成一个.git的文件
或者
git init <文件夹名> //在当前文件夹里面创建一个新的带有.git文件的文件夹
那么接下来提交到远程仓库的时候注意,如下:
git add <文件名>或者git add . //前者提交单个文件,后者提交所有文件到暂存区
git commit -m 'xxxx' //提交到本地仓库
git remote add <远程仓库名字> <远程仓库地址> //第一次提交的时候需要添加远程仓库地址
git push <远程仓库名字>
2
3
4
(2)使用空目录创建一个仓库
git clone <远程仓库地址> //将存储库克隆到目标目录
git clone命令的作用是将存储库克隆到新目录中,为克隆的存储库中的每个分支创建远程跟踪分支(使用git branch -r可见),并从克隆检出的存储库作为当前活动分支的初始分支。
通过这种方式创建的仓库,只需简简单单三件套即可,即:
git add .
git commit -m 'xxxx'
git push
2
3
# 三、Git查看更改
当我们会了Git的创建以及提交若干更新之后,想会看提交历史,其实这个也比较重要,有的时候你会忘记或者想退回到某次更改的版本,这个查看操作就让人跟欣慰。
git log //查看所有历史提交
如上图所示,git log查看历史记录比较详细。还有简介版本的查看方式:
git log --oneline //查看历史的简介版本
从上面看出,最新的提交时间永远显示在查看历史记录后的第一条。
# 四、Git撤销
有了版本号,我们就可以为所欲为了,感受一下Git强大的撤销、版本回退的暖心。
###1、撤销对工作区的操作
什么情况下会让我们想撤销对工作区的代码的操作?比如敲着敲着发现需求理解错了,想回到一开始的状态,这大家肯定能想到,直接ctrl+z嘛,轻轻松松。是的,确实可以,不过这种方法如果代码太多就不适用了。比如新建一个test.md文件,里面内容就是‘我想撤销对工作区代码的操作~’,然后一顿操作猛如虎,又添加了几百句诗,最后你还是不打算写这几百句诗,那么你就可以执行:
//git status //查看文件,文件夹在工作区,暂存区的状态
//cat -- <文件名> //可查看文件内容
//修改文件后
//git status //查看文件,文件夹在工作区,暂存区的状态
//cat -- <文件名> 可查看文件内容
//现在你想撤回修改
git checkout -- <文件名>
2
3
4
5
6
7
8
这时你可以发现,git checkout -- file可以丢弃工作区的修改,它的意思就是把某某文件在工作区的修改全部撤销。撤销也有两种情况:
(1)某某文件从修改以后并没有执行git add命令,即不在暂存区,那么撤销修改之后就回到和版本库一样的内容;
(2)某某文件已经添加到了暂存区,再做修改,那么撤销修改之后就回到添加到暂存区后的状态了。
总而言之,撤销修改之后总是回到最近一次git commit 或者git add时的版本。
###2、撤销对暂存区的操作
那如果是写了一些乱七八糟的话,然后又提交到了暂存区,即执行了git add的操作,但是你没有执行git commit命令,又该如何是好呢?Git告诉你,你该这样操作:
//git status
git reset HEAD <文件名> //把暂存区的修改回退到工作区,HEAD表示最新版本
//git status
2
3
使用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
###3、撤销对本地仓库的操作
感觉,前两个都是小场面,很好应对嘛~。首先如果已经提交到远程仓库,那肯定是没救了。但是,如果你提交到了本地仓库,即执行了git commit,这又该如何是好?
(1)通过次数回退
如果你记得你上一次、上上次、上上上次等的代码状态,那么我们可以直接:
git reset --hard HEAD^ //把当前版本回退到上一次的版本
或
git reset --hard HEAD^^ //把当前版本回退到上上次的版本
//^的个数也可以代表上几次版本
或
git reset --hard HEAD~100 ////把当前版本回退到前100次的版本
2
3
4
5
6
(2)通过版本号回退
你已经知道,git log可以查看所有提交的历史记录,并且很详细,其中就有版本号的存在,或者我们也可以使用git reflog查看所有提交的历史记录,显示对应的版本号。我们可以通过:
//git log||git reflog
git reset --hard <版本号> //版本回退,回退到指定版本号的状态
2
好吧,让人头疼的,还在后头,作者还在努力学习中...