Git是目前主流的分布式版本控制系统,它与GitHub的搭配使用已经成为许多程序员工作的基础,同时也是一项必备的能力。因此带着对未知的疑问,本文将从以下几个Part进行阐述:
1.什么是版本控制,它的作用是什么?
2.目前有哪些版本控制系统,用的比较多是哪个?为什么?
重点掌握:3.怎么使用版本控制系统(即Git的命令行操作)?
4.Git和GitHub怎么搭配使用?用途是什么?
1.版本控制
版本控制的功能主要有以下几点:
①数据备份——不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态
②协同修改——多人并行不悖的修改服务器的同一个文件
③历史记录——查看修改人、修改时间、修改内容、日志信息,将本地文件恢复到某一个历史状态
④版本管理——SVN增量式管理,Git文件系统快照
⑤权限控制——对团队中参与开发的人员进行权限控制,对团队外开发者贡献的代码进行审核(Git独有)
⑥分支管理——允许团队多条生产线同时推进任务
版本控制系统Git:它是由三个区域组成:工作区(平时写代码)-> 暂存区(临时存储,打算提交的代码)-> 本地库(存放历史版本,一次提交生成一次历史版本)。
主要用途:
1.数据备份和版本回退。通过提交代码到本地库实现数据备份,通过版本号的切换实现改变某一时刻的文件状态(即版本回退,类似于WPS的撤回功能)。
2.并行开发。在公司内部,一个项目通常是由多个人协同开发,这时候就可以通过将他人提交的代码拉取下来,实现单个项目多人开发的目的。
2.版本控制系统的种类和区别
种类:分布式版本控制系统(Git为代表) && 集中式版本控制系统(SVN为代表)
①集中式版本控制系统,版本库是集中存放在中央服务器的。每次编写代码时都要先从中央服务器拉取最新的版本,然后再开始干活。代码编写完成后,再将自己的代码(即更新后的)递交到中央服务器,此时版本数就对应地增加。它的最大毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟。而且如果中央服务器出现问题,历史记录全部消失。
②分式版本控制系统可以没有“中央服务器“,每个人的电脑都是一个完整的版本库。但是在实际的开发中,通常都需要这台“中央服务器”,可以是GitHub(代码托管平台)。但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。它的最大的优点是自己电脑中就有一个完整的版本库,因此支持离线工作。而且能够非常简单的建立分支,实现项目多条线路并行开发。Git 还具有团队内部权限管理,团队外代码审核的功能。
3.如何使用版本控制系统Git
3.1 安装Git
首先需要先下载Git,由于官网是外国网站,所以下载极可能出现失败。这里给出镜像地址,点击下载git ,选择适合自己电脑的版本进行下载。然后一路 next 安装即可。
测试安装成功的方法有两个,选其中一个即可
①右键出现 Git GUI Here 和 Git Bash Here
②通过win+R 调出控制台,输入cmd。在控制台中输入 git --version 查看版本号,若出现下载时的版本号即表示成功
3.2 配置Git
配置Git的目的是为了告诉其他人这个仓库是谁管理的,谁创建的。以后出了问题就可以找到是谁做的修改,在什么时间点等。
下面给出配置可能用到的一些命令:
git config --global user.name wangtinghao
git config --global user.email wangtinghao@email.com
git config -l 查看配置信息
git config --global -l 查看全局配置信息
git config --global user.name [具体用户名] 配置用户名
git config --global user.email [具体邮箱] 配置邮箱
git help [具体命令] 查看某个具体命令
注:
①这里的email邮箱地址可以无效,仅仅用来标识而已。但是GitHub上的邮箱地址必须式有效的。
②这里的–global是全局的意思,可以理解为同一个电脑用户以后的每次提交都是一样的用户名和邮箱,该参数最常用。当然它可以不添加或者替换为其他参数。详情可以通过 git help config 查看。
操作细则:右键进入Git Bash Here ,设置全局信息。这里的配置在哪个路径下都可以。
3.3 Git命令行操作
配置完成后,即可开始使用Git。首先应该明确以后要在哪个工作空间编写代码,该工作空间将作为本地库存在。然后切换到该盘符路径下,例如这里在F盘下新建一个文件夹当作以后的WorkSpace,这时只需要在该文件夹下右键点击 git Bash Here 即可进入到该目录下。当然也可以通过命令行操作( cd F://MyTestFolder )。具体步骤如下:
创建本地库 -> 在本地库目录下编写要提交的代码 -> 提交到暂存区 -> 提交到本地库(也可以省略提交暂存区直接提交到本地库,但是不建议)。
这里给出可能使用到的Git命令:
git init 初始化本地仓库,此操作会生成一个隐藏的.git文件,该文件不能删除。一旦删除,本地库就会消失
git add . 添加所有文件到暂存区
git add [文件名] 添加某个文件到暂存区
git add . 或者 git add -A 添加所有文件到暂存区
git rm --cached [文件名] 将某个文件从暂存区移除
git commit -m “测试第一个文件提交” 将文件从暂存区提交到本地库
git commit -m “注释信息” 将文件从暂存区提交到本地库
git commit -m “注释信息” [文件名] 将指定文件从暂存区提交到本地库
git status 查看当前文件状态(红色表示在工作区,绿色表示在暂存区)
git log 查看历史版本信息
git log --oneline 查看历史版本信息(更加简洁)
git reflog 查看历史版本信息(包含回滚信息,即之前做过版本回退操作的信息都会展示)
git reset --hard cc9228f 回退到某个历史版本
git reset --hard HEAD^ 本地库文件后退一个版本
git reset --hard HEAD^^^ 本地库文件后退三个版本,等效于 git reset --hard HEAD~3
git reset --hard [版本号] 本地库文件回退到对应版本号,可以前进也可以后退。版本号查询可以通过 git reflog 。
注:
①git reset --hard 中的 --hard 的意思:这个参数也可以改为–softed 和 --mixed 。一般都使用 --hard。
–softed:仅在本地库移动HEAD指针
–mixed:不仅本地库移动HEAD指针,还重置了暂存区
–hard:本地库移动HEAD指针,重置暂存区,重置工作区
②HEAD指针:当进行版本回退的时候,只需要移动HEAD指针到对应版本号即可。这也是Git强大的地方,通过一个指针的前进后退就能实现版本回退。可以简单理解为面向对象中的地址引用,C语言中的指针。
③删除文件并找回,使用 git reset --hard [指针位置] 的前提是:
删除前,文件存在的状态已经提交到了本地库,这里分两种情况:
(1)删除操作尚未提交到本地库:指针位置使用HEAD,即回到上次未删除的状态
(2)删除操作已经提交到本地库,指针位置指向历史记录
至此,本地库的提交工作已经全部完成。下面将学习如何与远程库进行交互。
4 Git和GitHub搭配使用
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。!!!首先需要有一个GitHub账号,在GitHub上创建一个仓库(Repository)。!!!Git 和 GitHub分别代表本地库和远程库,通过将本地库的文件推送到远程库,团队成员从远程库拉取的方式实现团队协同开发。
4.1 本地库与远程库的Git操作
①建立本地库与远程库的连接:git remote add origin https://github.com/wangtinghao1998/MyTestRepository.git
git remote -v 查看本地库于远程库的连接
git remote add origin [GitHub仓库地址] 让本地库与远程库建立连接( 注:origin 是给该地址起的别名,可以更改,但是不建议。)
git remote rm origin 删除本地库与远程库的连接
②将远程库克隆到本地: git clone https://github.com/wangtinghao1998/MyTestRepository.git
git clone [GitHub仓库地址] 将远程库文件克隆到本地库
注:该步骤实际包含三个步骤,即本地库初始化,建立本地库与远程库的连接,将远程库的数据拉取下来。即 git clone [GitHub仓库地址] = git init + git remote add origin [GitHub仓库地址](注意这里已经用 origin 代替了GitHub地址,所以之后的操作才可以用origin) + git pull origin [分支名]
③从远程库拉取最新代码到本地: git pull origin master
git pull [GitHub仓库地址] [分支名] 从远程库的某分支拉取最新数据
git fetch [GitHub仓库地址] [分支名] 将远程库数据抓取到本地库,但是本地库内容不变
git merge [GitHub仓库地址] [分支名] 将抓取到的数据合并到本地库
注:git pull 相当于是 git fetch 和 git merge 的结合。( git pull origin master = git fetch origin master + git merge origin master )
④向远程库推送最新数据: git push origin master
git push [GitHub仓库地址] [分支名] 向该地址的某分支提交最新数据
输入GitHub的账号和密码,下面是提交成功时的效果图。
git clone 什么时候使用?
正常开发流程一般都已经有一个远程库,不需要自己创建,而且很可能仓库内部已经有内容了。所以只需要通过 git clone [GitHub仓库地址] 将远程库克隆到本地。前面已经提到,该克隆操作包含三个步骤。因此实际上这时候的本地库已经初始完毕,且本地库里面已经存在远程库内容,并且与远程库取得连接。这时只需要在本地库修改好代码后再提交到本地库,然后 git push origin [分支名] 到远程库即可。提交之前最好 git pull origin [分支名] 拉取一下。
注意:由于使用到了 origin ,这个代号是在本地库与远程库连接的时候起的。因此如果要使用它必须先 git remote add origin [GitHub地址] 。当然也可以不使用该代号,直接把使用 origin 的地方替换为GitHub仓库地址。
4.2 本地库与远程库的交互方式:团队内协作和团队外协作
团队内协作:
团队外协作:
总结:项目组长通过GitHub创建远程库,团队成员通过 git clone [GitHub远程库地址] 克隆到本地进行代码编写。编写完成后最好先通过 git add . 将代码提交到暂存区,再通过 git commit -m “注释信息” 将代码提交到本地库。提交之前最好先拉取最新代码到本地,通过 git pull origin [分支名] ,如果拉取下来的代码没有问题,就通过 git push origin [分支名] 提交到远程库即可。当然这其中还可能出现合并冲突等情况,后面再给出具体分析。
4.3 分支操作
在版本控制过程中,使用多条生产线同时推进多个任务,可以提高效率。各个分支在开发过程中,如果某一个分支开发失败,也不会对其他分支有任何影响。
git branch -v 查看分支
git branch [分支名] 创建某个分支
git branch -D [分支名] 删除某个分支
git checkout [分支名] 切换到某个分支
合并分支思想:
1.切换到要合并的分支 -> git checkout [要合并的分支]
2.合并分支 git merge [被合并的分支]
正确推送本地库到 version1.0 分支的示意图如下,蓝色的分支名也给出了提示:
在项目开发过程中,经常会出现合并分支产生冲突的情况,原因和解决方案阐述如下:
常见原因:不同开发者对同一文件的同一行代码进行修改,因为不同行代码Git一般都能够非常智能的进行合并。举例:在 version1.0 分支上,开发者A对 test4.txt 第一行进行修改。在 master 分支上,开发者并不知道 test4.txt 第一行已经被修改,仍然对其进行修改。如果开发者A先将代码提交到远程库,此时并不会出现问题。而如果开发者B将代码提交到远程库,就会出现合并冲突的现象。因为Git无法帮你决定是采用开发者A的还是开发者B的。下面演示冲突的产生并给出解决方案。
解决方案如下: