四. 通过实际操作学习Git
1. 基本操作
1)git init ——初始化仓库
必须先创建一个目录并初始化为git仓库,如果初始化成功,该目录下就会生成 .git目录,里面存储着管理当前目录内容所需的仓库数据;
2)git status ——查看仓库状态
只要对Git的工作树或仓库进行操作,git status命令的显示结果就会发生变化;所以操作中会不停的查看仓库状态;
3)git add ——向暂存区中添加文件
要是想让一个文件成为Git仓库的管理对象,就需要用git add命令将其加入暂存区中。暂存区是提交之前的一个临时区域。
4)git commit ——保存仓库的历史记录
git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件。
5)git log ——查看提交日志
git log命令可以查看以往仓库中提交的日志。包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别。
2. 分支的操作
在进行多个并行作业时,我们会用到分支。在这类并行开发的过程中,往往同时存在多个最新代码状态。如下图所示,从master分支创建feature-A分支和fix-B分支后,每个分支中都拥有自己的最新代码。master分支是Git默认创建的分支,因此基本上所有开发都是以这个分支为中心进行的。
不同分支中,可以同时进行完全不同的作业。等该分支的作业完成之后再与master分支合并。比如feature-A分支的作业结束后与master合并,如下图所示。
通过灵活运用分支,可以让多人同时高效地进行并行开发。下面说一说关于分支的Git操作;
-
git branch ——显示分支一览表
git branch命令可以将分支名以列表显示,同时可以确认当前所在分支(前面有*的就是)。 -
git checkout -b ——创建/切换分支
如果想以当前的master分支为基础创建新的分支,我们需要用到git checkout -b命令。如下:git checkout -b feature-A
这时再来查看分支列表,会显示我们处于feature-A分支下。
在这个分支下提交代码,就会提交至feature-A分支。像这样不断对一个分支(例如feature-A)进行提交的操作,我们称为培育分支。而这个过程并不会影响主干分支,各枝干可以进行并行开发。他们只做特定的功能,就算发现bug也不做改动,所以称为特性分支。 -
git merge ——合并分支
假设feature-A已经实现完毕,想要将它合并到主干分支master中。首先切换到master分支,再合并feature-A分支。为了在提交日志中明确记录下本次合并,我们需要创建合并提交。因此,在合并时加上–no-ff参数。git merge --no-ff feature-A
随后编辑器会启动,用于录入合并提交的信息,默认信息中已经包含了是从feature-A分支合并过来的相关内容,所以可不必做任何更改。将编辑器中显示的内容保存,关闭编辑器。
这样一来,feature-A分支的内容就合并到master分支中了。 -
git log --graph ——以图表形式查看提交日志
用git log --graph命令进行查看的话,能很清楚地看到特性分支(feature-A)提交的内容已被合并。
3. 更改提交的操作
-
git reset ——回溯历史版本
Git的另一特征便是可以灵活操作历史版本。借助分散仓库的优势,可以在不影响其他仓库的前提下对历史版本进行操作。
要让仓库的HEAD、暂存区、当前工作树回溯到指定状态,需要用到git reset --hard命令。只要提供目标时间点的哈希值(可以通过git log查看),就可以完全恢复至该时间点的状态:git reset --hard 目标时间点的哈希值
git log命令只能查看以当前状态为终点的提交日志。而git reflog命令,可查看当前仓库的所有操作日志。
-
git commit --amend ——修改提交信息
git commit --amend
执行上面的命令后,编辑器就会启动。
其中包含之前的提交信息。找到他修改为新的,然后保存文件,关闭编辑器。
4. 推送至远程仓库
远程仓库顾名思义,是与我们本地仓库相对独立的另一个仓库。让我们先在GitHub上创建一个仓库,并将其设置为本地仓库的远程仓库。
1)创建远程仓库
创建时请不要勾选Initialize this repository with a README选项。因为一旦勾选该选项,GitHub一侧的仓库就会自动生成README文件,从创建之初便与本地仓库失去了整合性。
2)git remote add——添加远程仓库
git remote add origin git@github.com:yangjinniu/hello-world.git
执行上述命令,Git会自动将git@github.com:yangjinniu/hello-world.git远程仓库的名称设置为origin(标识符)。
3)git push——推送至远程仓库
-
推送至master分支
如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到git push命令。现在假定我们在master分支下进行操作。git push -u origin master
像这样执行git push命令,当前分支的内容就会被推送给远程仓库origin的master分支。-u参数可以在推送的同时,将origin仓库的master分支设置为本地仓库当前分支的upstream(上游)。添加了这个参数,将来运行git pull命令从远程仓库获取内容时,本地仓库的这个分支就可以直接从origin的master分支获取内容,省去了另外添加参数的麻烦。
-
推送至master以外的分支
除了master分支之外,远程仓库也可以创建其他分支。举个例子,我们在本地仓库中创建feature-D分支,并将它以同名形式push至远程仓库。git checkout -b feature-D git push -u origin feature-D
现在,在远程仓库的GitHub页面就可以查看到feature-D分支了。
5.从远程仓库获取
1)git clone——获取远程仓库
git clone git@github.com:yangjinniu/hello-world.git
2)从远程仓库获取feature-D分支
git checkout -b feature-D origin/feature-D
第一个feature-D为本地仓库中新建分支的名称,新建分支名称后面是获取来源的分支名称。
3)git pull——获取最新的远程仓库分支
如果本地仓库分支不是目前最新的版本,可以使用如下命令进行更新:
git pull origin feature-D
GitHub端远程仓库中的feature-D分支是最新状态,所以本地仓库中的feature-D分支就得到了更新。今后只需要像平常一样在本地进行提交再push给远程仓库,就可以与其他开发者同时在同一个分支中进行作业,不断给feature-D增加新功能。
如果两人同时修改了同一部分的源代码,push时就很容易发生冲突。所以多名开发者在同一个分支中进行作业时,为减少冲突情况的发生,建议更频繁地进行push和pull操作。
只要掌握了本章的知识,就足以应付日常开发中的大部分操作了,但是在实际的开发现场,往往要用到更加高级的Git操作。可以查看一下资料:
- Pro Git
Pro Git是一部零基础的Git学习资料。可以免费阅读到包括简体中文在内的各国语言版本。 - LearnGitBranching
LearnGitBranching是学习Git基本操作的网站。注重树形结构的学习方式非常适合初学者使用,点击右下角的地球标志还可切换各种语言进行学习。
6.说明
本文为《GitHub入门与实践》读书笔记,如有错误,还请兄弟们指正,大家一起进步。