Git基本用法
配置用户信息
git config --global user.name Jack
设置用户名;
git config --global user.email xx@xxx.com
设置邮箱;
上述配置信息都存放在~/.gitconfig
里面,上面的设置也可以直接通过修改这个文件来实现。
创建本地仓库
先创建一个普通的本地目录,进入该目录,使用git init
命令来初始化仓库。
由下图可以看到原本新建的目录下面多出一个名为.git
的隐藏目录,这个目录就是用来管理版本信息的。
进行第一次提交
在目录下新建一个文件README.md
,这里说明一下这个文件是干嘛的。这个文件通常是用来介绍这个仓库/项目的内容的;同时由于新建的git仓库是没有分支的,所以开发人员在刚建立仓库之后就新建一个README.md
文件并进行提交,以此来达到初始化主分支的目的。下面我们来进行一下这个操作。
-
新建
README.md
上面使用了一个
git status
命令来检测当前git仓库的状态,可以看到git
已经检测到我们在这个仓库进行的更改(新建了一个文件)了。 -
将对仓库所做的更改添加到暂存区
这里要介绍几个git的基本概念:
- 工作区:仓库的目录。
- 暂存区:数据暂时存放的区域,相当于工作区写入版本库之前的一个缓存区。
- 版本库:用于存放所有已经提交到本地仓库的代码版本。
这里我们使用
git add README.md
命令,将刚刚新建的文件添加到暂存区中。由上图可以看到新文件已经添加到暂存区中了。
-
提交到版本库
接下来我们将暂存区中的更改保存到版本库中。需要注意的是,每次提交更改之前都需要对本次的更改写注释,这就要用到
git commit -m "XXX"
命令。进行完
commit
之后,上文所做的更改就顺利的被保存到本地仓库中了。
到这里我们就在本地添加了一个分支和一个版本。
我们用上面的图例进行表示,则现在仓库的状态为
即上述的操作为本地仓库添加了一个master分支(主分支默认的名字,这个也可以自己改),并在这个分支上添加了一个版本。
使用版本库来保存更改
现在我们要开始真正地领略git的魅力了哈哈哈。
现在我们先尝试对README.md
进行修改,并将修改提交到版本库中。
-
修改
README.md
现在我使用
vim
向README.md
中写入了一行111。 -
将更改提交到暂存区
再次使用
git status
命令,我们可以看到git又检测到了我们对本地仓库进行的修改。像上面一样我们使用
git add README.md
命令,将我们刚刚对README.md
进行的修改提交到暂存区。 -
提交到版本库
同样和第一次一样,使用
git commit -m "XX"
命令,对我们刚刚作出的更改添加注释,然后提交这个版本到本地版本库中。
经过上面的操作,恭喜你,你的本地版本库又多了一个新成员。
当然,git不仅仅能跟踪文件内容的变化,也能跟踪仓库中文件的增删。下面我们就来实际操作一下。
-
在仓库中新增文件
我在仓库中新建了两个文件分别名为
a.txt
和b.txt
,并使用git status
命令查看了一下当前仓库的状态。 -
将对仓库的更改提交到暂存区
照旧,使用
git add
命令,根据上图你可以发现git add
命令可以给出多个参数。实际上,上图中的
git add a.txt b.txt
可以用git add .
命令来替代,后者是将当前本地仓库中所有的更改提交到暂存区。 -
将更改提交到版本库
照旧,使用
git commit
命令。
现在版本库的结构变成了这样
接下来我们再练习一下上面的操作,尝试将文件a.txt
和 b.txt
从本地仓库中删除,并将这个更改提交到本地版本库中。
-
删除
a.txt
和b.txt
经常用
git status
命令可以使你清楚你正在干什么哦。 -
提交更改到暂存区
这里你可能好奇了,明明
a.txt
和b.txt
都不存在了,为什么指定的参数里还是他俩。哈哈哈,这里的
git add
命令的参数实际上指定的是你本次操作的对象,不管是增还是删还是改,参数就写你操作的对象就行了。 -
将更改提交到本地版本库
现在我们的本地版本库变成这个样子了
查看你的版本库
不知道你是否好奇,如果没有上面那个图片的辅助,你是否能搞清楚自己的版本库里面到底有几个版本,分别都是啥。
这里就要介绍另外两个命令了 git log
和 git reflog
下面这张图解释了上面图中的信息。
上面这两张图就是git log
的执行结果。
下面这张图就是git reflog
的执行结果。
这两个结果记录的信息实际有些许差异,马上我们就会介绍到。
回滚操作
所谓回滚,就是将当前仓库的状态更改到本地版本库中的某个版本。
这里我们要引入一个新的概念:HEAD
指针,HEAD
指向当前操作的仓库版本。上面的版本库的图就需要改成这个样子了
那么我们改怎么进行回滚操作呢。聪明的你一定想到了,只需要更改HEAD
指针的位置就可以了。这里使用 git reset
命令。
假如我们现在要回滚到移除 a.txt
和 b.txt
之前的一个版本。我们先查一下对应的那个版本的版本号是什么,这个版本号就是 git log
中每条commit记录的哈希值的前7位,这个数字也和 git reflog
中每条记录的第一个字段完全相同。我们先找到这个版本号,你们的可能和我的不一样哦
然后我们使用 git reset --hard 版本号
这个命令来完成回滚操作
神奇的事情发生了,死去的 a.txt
和 b.txt
又回来了。
我们现在就来到了这个地方
我们再尝试一下去到仓库刚建立的时候,先找到版本号
再使用git reset --hard XXXXXXX
命令
可以看到我们又完成回滚了。
最后我们来填一下上面留下的一个坑:git log
和 git reflog
记录信息内容的区别是什么
我们现在执行一下git log
哇,我们现在只剩下一个版本啦! 实际上git log
只会记录从根版本到HEAD
指针指向的所有版本的信息。
我们再执行一下git reflog
可以看到,HEAD
指针每次经过的位置都会被展示出来。
这就是这两个命令本质上的区别啦。
撤销本地文件更改以及撤销缓冲区提交
假设你对本地文件进行了一些修改,但是因为某种原因需要舍弃这个修改。这时我们可以使用 git restore XXX
命令将某个文件回退到缓冲区的版本。
下面来测试一下
先对README.md
文件进行修改
尝试回退
可以看 README.md
成功回退到了之前的版本。
假如我们对执行的更改已经提交到缓冲区了,那么上面的方法就无法回退了,这时我们需要先把缓冲区里面文件的版本回退到修改之前,然后将本地的文件回退到和缓冲区相等。下面再测试一下。
上图可以看到当更改提交到缓冲区,刚刚介绍的方法就不管用了。
这时我们先执行缓冲区回退操作
再对文件进行回退
可以看到回退成功执行了。
分支操作
如果你在某个节点想尝试一些新东西,而又不想动主分支里面的内容,这时我们可以创建一个新的分支,在这个新分支进行的任何操作都不会影响到主分支。
创建分支
下面我们来尝试一下,使用git checkout
命令来创建新的分支
这样就创建并切切换到了新的,名为dev
的分支
现在我们的结构就变成这样啦。
我们可以通过git branch
命令来查看所有分支和当前分支,当前分支前面会有一个*将其标记出来。
我们还可以用git checkout XXX
命令来切换分支,就像下面这样
创建的分支会继承当前版本所有的历史版本。
使用完的分支可以使用下面这个命令删除
git branch -d XXXX
分支的合并
假设我们在某个分支上做的东西很不错,我们想要把它添加到主分支里面,这时我们就需要git merge XXX
命令来合并分支了。
刚刚发现我的分支没学明白,等我看明白了再更😭。
再更啦
假设我们现在的仓库内容是这样的
我们创建并切换到一个新的分支
修改并提交了对 README.md
文件的修改
切换回master分支
尝试合并dev分支
可以看到dev做出的修改已经成功合并到master分支里啦。上面是没有冲突的情况。
如果在某个版本我们创建了一个分支,但在这个分支创建之后master分支上的文件叶做出了变动,这样的话在合并时,相当于有两个分支同时对一个文件作出了修改,这样就会产生冲突,下面我们来复现一下这个过程
上图我们创建了一个分支并对README.md
文件做出了修改。
上图我们在master分支又向前推进了一个版本。
下面我们尝试合并master和dev分支
可以看到发生了冲突,这个时候我们就要去解决冲突。那么就有同学要问了,该怎么解决冲突呢?方法也是简单粗暴,直接修改发生冲突的文件,我们先打开README.md
文件看一下
可以看到git非常贴心地把冲突的地方标出来了,这时我们只需要按照自己的想法修改一下这个文件即可,我就把它修改成了下面这样
分支正确合并了!
云端操作
云端的代码托管平台非常多,国际最大的github
,国内的gitee
,还有各种机构搭建的gitlab
。这里我选择拿github
做演示。
进入世界上最大的同性交友平台,注册账号,这些基本操作我就不多说了
点击这里我们新建一个云端仓库
这里配置你的仓库的基本信息,注意由于git仓库是我们在本地初始化的,因此我们不需要勾选ADD a README file
来初始化仓库
这里我把它这样配置,仓库的名称要和本地的一样
对,我就是只填了一个仓库名hhhh
点下面那个图标来创建仓库
现在我们就进入到了下面这个界面
要把本地的仓库提交到云端,先添加远程仓库
git remote add origin https://github.com/XXXX/XXX.git
再将远程的分支和本地分支关联起来
git push --set-upstream origin master
我们提交时使用git push -u
命令,-u
只在第一次需要使用。这个命令是将当前分支提交到云端。
同样的,我们也可以将dev分支推送到云端
可以进行的操作还有很多,和本地的都大同小异,像git这样的工具还是熟能生巧。
在云端创建的分支也可以和本地的分支对应起来
git branch --set-upstream-to=origin/branch_name1 branch_name2
可以将远程仓库的当前分支和本地仓库的当前分支合并
git pull
可以将远程仓库的指定分支和本地仓库的当前分支合并
git pull origin branch_name
可以将远程的分支拉取到本地
git checkout -t origin/branch_name