目录
一、前言
版本控制是一种记录文传内容变化,以便将来查阅特定版本修订情况的系统。版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本之间的切换。版本控制的可以方便团队间协调开发,可以对我们开发的代码做备份。Git就是一个版本控制工具。
1.集中式版本控制
集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。但这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
2.分布式版本控制
Git是一种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
3.Git的工作机制
Git分为四层:工作区、暂存区、本地库、远程库。其中工作区、暂存区和本地库都是在客户端本地,远程库存在于远程服务器。
上图远程服务器比如GitHub、码云平台等代码托管中心。我们可以将自己本地库中的项目推送到远程库保存,也可以将远程库中的项目拉取到本地库中进行开发。代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
- 局域网:GitLab(一般是自己公司搭建的服务器)
- 互联网:GitHub(国外网站)、Gitee码云(国内网站)
二、Git
1.Git安装
直接取官网下载安装包进行安装https://git-scm.com/,我是按照这篇博文操作的,非常详细https://blog.csdn.net/mukes/article/details/115693833?utm_source=app&app_version=4.8.0&code=app_1562916241&uLinkId=usr1mkqgl919blen。
2.基本操作
2.1.设置用户签名
安装完成之后需要设置用户签名,签名的作用是区分不同操作者身份。签名设置好之后用户的签名信息在每一个版本的提交信息中都可以看到,以此确认本次提交是谁做的,Git首次安装必须设置一下用户签名,否则无法提交代码。注意:这里设置用户签名和将来登录的代码托管中心的账号没有任何关系。通过如下两个命令设置用户签名:
git config --global user.name [name]
git config --global user.email [email]
2.2.初始化本地库
git init
在正式操作之前需要先创建一个目录表示本地库(比如目录名为git-demo),从该目录下打开Git Bash终端,执行git init初始化本地库。
完成之后可以看到该目录下生成了一个.git的目录。git-demo目录下就是工作区,而暂存区和本地库都是在.git目录下,他两用于存储数据。Git所存储的都是一系列文件快照,发现哪个文件快照有变化就会提示你需要添加到暂存区或者提交到本地仓库,保证工作区是干净的。
可以通过git status命令来查看本地库的状态。
可以看到上面显示三条信息:
- On branch master:表示当前本地库是在master分支。
- No commits master:表示我们还从来没有在该本地库中提交过东西。
- nothing to commit:工作区非常干净,没有可提交的内容。
2.3.查看本地库状态
git status
假如此时在工作区中创建一个hello.txt文件,然后进行下面的操作
- 此时可以看出,在工作区中存在hello.txt文件,他现在处于未被跟踪的状态;
- 执行git add <file> 命令将其添加至暂存区;
- 再次查看状态,可以看到它现在处于等待被提交Changes to be committed,此时状态表示文件处于暂存区;
- 使用vim编辑器修改文件内容;
- 内容修该之后再次查看状态,可以看到又多个一些信息,modified: hello.txt,表示文件已经修改但是此时修改后的文件还不是“暂存区状态”,正如提示的那样,使用git add <file>将其更新至暂存区。只有暂存区的文件可以提交至本地库。如果不更新其至暂存区,那么执行提交命令,提交到本地库的就是修改之前的那个文件。
2.4.提交至本地库
git commit -m "自定义提交附带信息" [file] 将暂存区的内容提交至本地库
git log 查看本地库的日志信息
git reflog 查看最近几次的操作记录
执行提交本地库的命令之后可以看到生成[master ac6e719]。此时就算成功将其提交至本地库了,此时该文件才会被Git管理,其中ac6e719是版本号的精简版,下面git log的输出包含版本号的完整版。
使用git reflog命令查看日志信息,可以看到有一个HEAD指针指向master分支中的这个yhj commit。此时还是可以修改hello.txt的,不过修改之后还是需要先添加至缓存区,再提交至本地库,本地库会生成一个新的版本,并且用HEAD指针指向该新的版本。注意:工作区永远只有一个hello.txt,Git控制版本是利用HEAD指针完成的。
2.5.版本穿梭
通过git reflog或者git log我们可以查看提交的历史版本记录。假如此时对hello.txt进行修改再提交至本地库(第二次提交),那么本地库中就维护了两个版本(一个第一次提交的版本,一个第二次提交的版本)。头指针HEAD指向的是最新版本,如果回到修改之前的版本可以利用git reset --hard [版本号](使用精简版的版本号即可)命令完成。那么HEAD指针将指向指定的版本。对应工作区中的hello.txt的内容也就变回到第一个版本时对应的内容。假如此时又想回到修改之后的那么版本,则再次执行该命令,将指针指向修改之后的版本即可。
版本穿梭是利用HEAD指针完成的。
2.6.分支操作
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。为了方便理解,可以将其简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)。再初始化本地库时就会创建默认的分支master。
分支的好处是同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。
如上图,假设master分支是主线分支,这个分支上的代码是用户正在使用的,假设到C3这个版本时候需要额外增加一些功能,那么在不影响用户使用的基础上可以创建一个fearture分支,将C3这个版本的代码拷贝一份,然后添加新功能后的版本并合并分支形成C4版本。
与分支有关的常用命令如下:
git branch [branchName] 创建分支
git branch -v 查看分支
git checkout [branchName] 切换到指定的分支
git merge [branchName] 把指定的分支合并到当前分支上
- 创建名为hot-fix的分支
- 查看本地所有分支
- 切换分支从master切换到hot-fix中操作,最后红框可以看到已经成功切换到hot-fix
- 再hot-fix分支下修改HelloGit.txt代码
- 查看HelloGit.txt状态已经变为已修改的状态
- 将其添加至暂存区
- 提交至本地库
注意各个分支是相互不影响的,此时master分支中的HelloGit.txt并没有因为hot-fix分支修改而变化,如果master分支需要更新hot-fix修改的内容,那么就需要合并分支。需要注意的是必须先将分支切换到master分支上,然后根据相应的命令合并即可。在没有合并冲突的情况下,Git会自动合并分支,那么什么时候会产生合并冲突?假设此时master和hot-fix都对HelloGit.txt中相同位置的代码做了改变,那么此时合并分支时Git就无法决定该如何合并。
面对上面情况,需要手动合并,如下
2.7. Git团队协作机制
团队内协作
不过开发者2(令狐冲)能够进行团队协作的前提(能够往岳不群的远程库中推送代码)是令狐冲是团队成员,所以岳不群必须先添加令狐冲为团队成员,它需要在GitHub中进行如下操作:
跨团队协作
假设此时有华山团队和东方不败团队共同开发一个项目。
- 由于“东方不败”团队不是“华山”团队的人,没有直接拉取的权限,所以不能直接拉取代码到自己的本地库,所以先将其拷贝到自己的远程库中。
- 东方不败团队从自己的远程库中拉取代码进行修改
- 修改完毕之后将新版本上传到自己的远程库中
- 给“华山团队”的远程库发送拉取请求,即通知他们可以进行拉取了。
- “华山”团队可以对代码进行审核
- 审核完毕之后即可合并到自己的远程库
- “华山”团队内的人就可以从他们团队的远程库中拉取被修改后的代码。
三、代码托管中心
1.GitHub
访问GitHub官网注册账号并登录,然后会要求你验证邮箱。验证完毕之后就可以创建远程库了,创建时注意尽量与本地库名称保持一致。创建好之后会生成远程库的连接,https的连接和SSH的连接。Git Bash终端操作远程库的相关命令:
git remote -v:查看当前所有的远程库
git remote add [name] [url] 添加一个新的远程库,name为该远程库的别名
git push [remote] [branch]:推送本地指定的分支到远程库
git pull [remote] [branch]:拉取远程库指定分支的内容
git clone [remote] [dir]: 克隆远程库,这个操作git会自动创建一个目录用于存放拷贝的内容。[dir]是可选的,如果指定,那么git创建的目录名就是它,否则就是远程库的名字。执行该命令前,首先初始化一个空的仓库用于接收
//如果你已经添加了一个远程库,给它起了别名,那么在push和pull或clone操作中的[remote]就可以是那个别名,否则就必须是连接URL
首先可以添加一个远程库,在没有配置SSH密钥时可以使用https的url。
如下将master分支推送至远程库
https方式每次push时都需要输入账号密码(因为你的有写的权限)。为了方便可以使用SSH免密登录,操作如下
2.克隆单个目录或文件
git clone会将远程库整个项目克隆下来,如果只想克隆远程库中某个目录或者文件,操作如下:
- 初始化一个空仓库(git init)
- 开启sparse clone(git config core.sparsecheckout true)
- 设置过滤(如 echo "resources/idea-theme/FadeComments.jar" >> .git/info.sparse-checkout 这里的"resources/idea-theme/FadeComments.jar"是你想要从该远程库中得到的文件路径)
- 拉取(git pull [remote] [branch])
3.操作GitHub时的网络问题
由于GitHub是国外网站,访问时可能会出现很多网络问题。下面是我在操作中遇到的问题以及查阅资料得到的解决方法:
1、OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443:SSL握手没有通过
设置:git config --global http.sslVerify false。(有时候设置完这一项还会存在问题,多试几次就好了)
2.访问GitHub慢,浏览器访问或者通过Git Bash终端访问都非常慢,网络问题,可以配置代理服务器解决。
具体查看:https://blog.csdn.net/qq_40942372/article/details/100933989
代理服务器配置好之后在git中进行设置,如下:
配置代理: git config --global http.proxy "http://127.0.0.1:3124"(这里是我配置的)
git config --global https.proxy "http://127.0.0.1:3124"
取消配置: git config --global --unset http.proxy
git config --global --unset https.proxy
4.码云Gitee
码云是相当于是国内版的GitHub,访问速度更加快,而且中文也比较易懂,它与GitHub的操作几乎一致。同样的去官网注册并登录,然后创建远程库。
四、IDE集成Git
1.配置Git忽略文件
无论是eclipse还是InteillJ IDEA都会有自己的一些特定文件,比如InteillJ IDEA中的.iml,.idea这类文件等。这些文件对项目本身的功能是没用的,在提交项目时我们可能只需要推送和项目本身相关的代码,但IDEA默认会把所有只要本地与远程不同的文件都会列出来,所以需要配置Git忽略文件。网上说需要安装.ignore插件,但也可以不安装直接在项目中新建一个.gitignore文件,然后再该文件中进行配置。如下:
2.让IDEA定位Git程序
3.使用IDEA初始化本地库
4.添加暂存区
5.提交本地库
6.查看历史版本&版本切换
7.创建分支
这里我创建了一个hot-fix分支
8.合并分支
9.合并冲突
hot-fix分支和master分支都修该同一个文件中同一处代码会造成冲突,如下:
点击上图中的合并按钮进行手动合并
五、IDE集成GitHub
IDEA中可以使用GitHub的账号密码登录GitHub也可以使用个人口令登录,由于账号密码登录网络影响比较严重,所以使用口令登录,那就需要在GitHub上生成个人口令,如下:
生成之后再利用口令登录:
1.向GitHub分享项目
这里其实是做了两个操作,GitHub中创建了一个远程库,且进行了一次推送。
2.推送和拉取项目
当GitHub中有这个项目之后,我们可能会对代码再进行一些修改,完毕之后直接推送即可。
3.克隆项目