工作中我是怎么使用git的--git教程 上
本篇为上篇,介绍基本概念和一个人的基本git操作流程
上篇
起步
在教程之前,我们先来做一个git的"Hello, World!"。没有安装git的同学可以进入点击进入官网下载。以下内容以Windows系统举例。
- 创建一个新目录
leney
。 - 进入该目录,右键选择 Git Bash Here。
- 在命令框中输入命令
git init
。好了一个git仓库就搭建完成了,接着我们往里面添加内容。 - 新建一个README.md文件,输入
Hello, World!
,保存。 - 回到命令框,输入命令
git add .
,再输入命令git commit -m "Hello, World!"
。 - 至此,一次git操作就算完成了,你可以再输入命令
git log
查看刚刚提交的内容。
git的五块区域
首先,我们花几分钟的时间来了解一下git的基本概念。在git中有五块主要区域:工作区,缓存区,贮藏区,本地仓库,远程仓库。
- 工作区,也就是我们平时对文件进行的增删改,都是在工作区中。
- 缓存区,工作区中的文件在确定准备
commit
时,需要通过add
命令添加到缓存区,之后才能通过commit
生成提交记录。 - 贮藏区,在缓存区中的文件通过
stash
命令可以进入贮藏区,也可以随时提取出来。 - 本地仓库,就是本地的git仓库了,我们在起步就成功创建了一个本地仓库。
- 远程仓库,就是远程的git仓库了,可能是来自于github, gitee或者公司自己搭建的gitlab, gitea等等平台。
我们对文件的增删改首先会反映在工作区,然后通过add
进入缓存区,再通过commit
形成一次提交记录,每一次提交均会生成一串唯一编码。一个个提交记录就组成了我们需要的版本。
这里给不熟悉git的各位提两点建议。
- 可以将工作区和缓存区合并成一个区域来看待,但是要记住在git操作过程中需要先
add
才能commit
。以下我将合并的区域称为开发区
。 - 可以忽略贮藏区,并且建议尽量不要去使用
stash
命令,不建议使用的原因我会在分支一节给出。
分支
分支创建和切换
然后我们要着重了解一下什么是分支。在刚才的起步中,命令框中会展示出我们当前所在的目录和括号中的master,这个master便是我们当前所在的分支。分支和分支之间是互相独立的,这保证了当我们在某个分支进行操作时不会影响到其他分支。现在让我们来实际操作看看吧。
- 回到git仓库目录中,唤出命令框,输入
git checkout -b develop
,来创建并切换到develop分支。 - 这里我们使用
git branch
来展示一下当前所有的分支,便可以得到master和develop。 - 新建文件leney.txt,输入文字"这来自于develop",保存。
- 打开README.md,新增一行,输入"分支切换 OK",保存。
- 使用
add
和commit
命令来生成一次提交记录。 - 现在我们通过
git checkout master
回到我们master分支,可以发现刚刚我们新建的leney.txt文件消失了,同时我们在README.md中的更改也不见了。
切换分支的注意点
通过以上的操作,我们便了解到分支的基本作用了。要注意,在切换分支时最好保证你当前开发区的内容均已进行add
和commit
,否则你开发区的内容会进入到你切换到的分支甚至与你要切换的分支内容冲突而切换失败。这里我们实际操作看看。
- 刚刚我们在develop分支创建了leney.txt。
- 现在我们在master分支也创建一个leney.txt并输入文字"这来自于master",保存。
- 现在我们使用
git status
,查看一下我们当前开发区都有什么内容,可以看到leney.txt出现在开发区中。 - 这次我们不进行
add
和commit
,直接使用git checkout develop
切换到develop分支。 - 可以看到出现一个报错,这便是因为我们当前开发区的内容与要切换的分支内容冲突。
error: The following untracked working tree files would be overwritten by checkout:
leney.txt
Please move or remove them before you switch branches.
Aborting
那么为了解决这个问题,我们可以通过三种方式
- 就是
add
和commit
形成一次提交,从而清空我们的开发区(我推荐这个做法)。 - 通过
stash
命令将缓存区的内容保存到贮藏区(注意,这里只能保存缓存区的内容,工作区需要通过add
进入缓存区)。
但是stash
命令会存在一个问题,无法生成提交记录,也就无法体现在版本控制流程中。一旦由于忘记取出贮藏区的内容并进行过提交,下次取出时很可能带来文件冲突而增加工作量。所以推荐大家使用add
和commit
形成提交记录进行清空。 - 清除报错信息中的文件的修改,也就是把之前修改的内容还原。
现在让我们选择方式3,放弃修改,把leney.txt文件删除。
分支合并
刚才我们创建了leney.txt后想要切换到develop分支失败,我们选择把leney.txt文件删除。现在让我们把存在于develop分支上的leney.txt文件拿到master分支下,这里就需要使用到Git的分支合并merge
功能。
- 确保当前在master分支,如果不是,请切换到master。
- 输入命令
git merge develop
。
可以看到leney.txt出现在我们的目录中,这样我们就合并成功了。
分支删除
当我们不再需要某个分支时需要进行删除,我们可以使用branch
命令来进行,下面让我们实践一下。
- 确保当前在master分支,如果不是,请切换到master。
- 通过
git branch delete-me
创建新分支delete-me。 - 通过
git branch
可以看到我们刚刚创建的新分支。 - 使用命令
git branch -d delete-me
来删除分支。
这样,我们就完成了分支的删除。对于分支的删除有几个注意点。
- 删除的分支不能是当前所在分支
- 删除的分支若是有未被合并到主分支(通常是master)的内容,则需要使用
git branch -D
。
本地仓库和远程仓库的同步
push
学会了本地仓库的提交和分支操作,让我们来试试看如何与远程仓库同步。这里我选择的是Gitee。
- 来到Gitee,参考帮助中心创建一个仓库。(第一次使用的朋友记得在个人中心的SSH公钥中添加自己电脑的公钥,详见Gitee帮助中心)。
- 到仓库页面招到我们的远程仓库的ssh地址并复制
git@gitee.com:leney/test.git。
- 来到本地,通过
git clone git@gitee.com:leney/test.git
将远程仓库拉取到本地。 - 进入test目录添加README.md,输入文字"远程仓库 push OK",保存。
- 通过
add
和commit
进行提交。 - 到这我们对本地仓库的操作已经完成了,接着输入命令
git push
便可以将我们当前对master分支的操作推送到远程仓库中。 - 来到Gitee仓库便可以看到我们刚才的提交了。
pull
我们通过push
可以将本地同步到远程,那么远程同步到本地就需要用到pull
命令了。现在我们试一下。
- 回到目录上一层再来做一次
clone
,这次我们输入命令git clone git@gitee.com:leney/test.git test2
,指定目录名,避免目录名相同报错。 - 进入test2目录我们可以看到这次拉去的内容有了README.me。没错,
clone
会默认拉取最新的内容。 - 现在我们打开README.md,输入文字"远程仓库 pull OK",保存。
- 进行
add, commit, push
操作,这样我们就又推送了新的提交到远程仓库。 - 来到原先的test目录,使用
git pull
命令就可以拉取到我们刚刚在test2目录中新增的内容了。
标签
通常我们会经历项目发布之后的更新迭代,和书本一样有第一版第二版,也有比如《尼尔:机械纪元 ver.1.22474487139...》。在Git中的体现就是标签了,当我们的项目开发到一定阶段需要发布的时候,我们可以通过tag
命令来打上标签,那么来实践下。
- 打开
git bash
,输入命令git tag v1.0
。 - 输入
git tag
来查看当前项目的所有标签。 - 输入
git show v1.0
来查看刚才我们创建的标签的信息和对应的提交记录。
好了,通过刚才的命令我们就成功标记了v1.0
这个版本。当我们的项目达到下一次可以发布的时候,再次进行标记,就可以通过git checkout tag名
来实现版本和版本之间的切换了。
同时,标签也是可以推送到远程的,通过git push origin --tags
可以推送多有的标签,而要推送某一个标签则使用git push origin tag名
,比如git push origin v1.0
。
最后,可以通过git tag -d tag名
来删除标签。
最简单的工作流程
在之前的章节中,我们通过add, commit
成功进行了一次提交,通过checkout
创建了分支并进行分支切换,使用push, pull
让本地仓库和远程仓库进行同步,那么来到工作中又是怎么操作的呢?
- 首先我们需要通过
clone
到远程仓库获取项目,生成一个和远程仓库关联的本地仓库。 - 然后切换到我们需要操作的分支,或是新建一个分支,再进行开发任务。
- 开发完毕后,使用
add
和commit
生成提交记录。 - 使用
push
同步到远程,然后切换到其他分支继续开发其他任务。
那这就是最简单的做工作流程了,不过通常我们工作中会进行多人协同开发,操作和管理会复杂许多,下一期我将介绍一下git在多人协同开发的使用。
总结
总结一下本文涉及到的命令。
init
创建一个本地仓库。clone
将远程仓库拉取到本地仓库。add
将文件从工作区添加到缓存区,本文使用了git add .
来进行添加,也可以git add xxx
来指定文件名。commit
将文件从缓存区提交到本地仓库。push
将本地仓库同步到远程仓库。pull
从远程仓库同步到本地仓库。checkout
切换分支,git checkout -b xxx
则可以创建并切换到xxx分支,没有-b
便是切换。merge
合并分支。status
查看当前工作区和缓存区的内容。log
查看提交记录。branch
查看和操作仓库所有分支。stash
将缓存区内容提交到贮藏区,Leney我不推荐使用。tag
可以在当前提交记录生成一个标签。