- Git概述
(一)什么是Git
- Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
- 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
- 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
- 版本控制系统
1.什么是版本控制系统?
版本控制系统能追踪项目,从开始到结束的整个过程。对编程人员而言,版本控制技术是团队协作开发的桥梁,助力于多人协作同步进行大型项目开发。软件版本控制系统的核心任务:查阅项目历史操作记录、实现协同开发。
2.常见的版本控制系统
(1)集中式版本控制工具
概念:版本仓库是集中存放在中央服务器的,team里每个人工作时,从中央服务器下载代码。每个人个人修改后,提交到中央版本仓库。提交(commit)代码需要联网。如:svn
SVN的优缺点
- 优点:
- 管理方便,逻辑明确,操作简单,上手快。
- 易于管理,集中式服务器更能保证安全性。
- 代码一致性非常高。
- 有良好的目录级权限控制系统。
- 缺点:
- 对服务器性能要求高,数据库容量经常暴增,体量大。
- 必须联网。如果不能连接到服务器上,基本上不可以工作,如果服务器不能连接上,就不能提交,还原,对比等等。
- 不适合开源开发。
- 分支的管控方式不灵活
(2)分布式版本控制工具
概念:分布式版本控制系统可以没有 “中央服务器”,每个人的电脑上都是一个完整的版本仓库,这样工作的时候,不需要联网。因为版本仓库就在你自己的电脑上。多人协作只需要各自修改,开发完成即可,推送给对方【联网】,推送的时候是将整个版本仓库推过去。如:Git
Git的优缺点
- 优点:
1.适合分布式开发,每一个个体都可以作为服务器。每一次Clone就是从服务器上pull到了所有的内容,包括版本信息。
2.公共服务器压力和数据量都不会太大。
3.速度快、灵活,分支之间可以任意切换。
4.任意两个开发者之间可以很容易的解决冲突,并且单机上就可以进行分支合并。
5.离线工作,不影响本地代码编写,等有网络连接以后可以再上传代码,并且在本地可以根据不同的需要,本地新建自己的分支。
- 缺点:
- 学习周期相对而言比较长
- 不符合常规思维
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息
(三)Git工作流程
Clone:克隆,从远程仓库中克隆代码到本地仓库,第一次操作时。
Push:推送,代码完成后,需要和团队成员共享代码时,将代码推送到远程仓库。
Pull:拉取,从远程库拉代码到本地库,自动进行合并(merge),最后放到工作区。
checkout:将本地仓库的内容检出到工作区
add:在提交前先将代码提交到暂存区
commit:提交到本地仓库
- Git相关的基本概念
- 本地仓库:
在本地主机上的一个代码库,可以独立存在,也可以与远程仓库进行关联
- 工作区:
电脑中可以看见的目录。对任何文件的修订(增删改),都先放在工作区,工作区不与任何仓库分支进行关联
- 暂存区:
一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。把修订的文件,从工作区经过add(添加)后与某一个仓库分支进行关联,只有进入暂存区的文件才能 commit(提交)到本地仓库。
- 远程仓库 :
在局域网或互联网上的一个主机,存放代码库的主机或平台,比如GitHub、 Gitee.com(码云)
- 分支:
代码存放在仓库,默认是主分支(master),可以在主分支基础上创建很多子分支,比如 develop(开发)、bugfix(bug修复)等。
- Git的下载安装
- 下载
下载地址:Git - Downloads
根据电脑的操作系统类型选择不同的版本,我们以windows为例。
下载后的安装包:
- 安装
双击下载后的安装包,傻瓜式安装即可,可修改默认安装路径。安装成功后,在电脑的任何位置单击鼠标右键,即可看到如下图所示的两个右键菜单:其中Git Bash Here是命令行窗口操作Git,而Git GUI Here是图形化界面操作。我们重点学习命令行方式。
注意:如果彻底删除git,需要删除./ssh文件夹和.gitconfig文件。
路径:如,C:\Users\dell
- 基本配置用户和邮箱
在电脑桌面单击鼠标右键,选择Git Bash Here 打开命令行窗口:
配置用户名:
git config --global user.name “用户名”
配置邮箱:
git config --global user.email “邮箱”
配置好后可以在本地查看,也可以通过命令查看
本地用户路径下会生成一个配置文件:C:\Users\dell\.gitconfig
如果配置错误或想重新配置,可以将该配置文件删除,再次通过以上命令重新配置。
通过命令查询配置信息:
git config --list
- Git本地操作
- 构建本地仓库
构建本地仓库有两种方式:
- 在本地初始化一个
- 从远程仓库克隆一个(后面演示)
这里我们暂时没有远程仓库,所以先使用第一种方式在本地初始化一个。
构建仓库命令:git init
操作步骤:
- 首先在指导的磁盘路径下创建一个空文件夹gitdemo,在空文件夹下单击鼠标右键打开Git Bash Here命令窗口。
- 在窗口中输入git init命令,这时将隐藏文件夹项显示出来,我们会发现在这个空目录下生成一个隐藏文件.git,这个隐藏文件.git就是本地仓库的版本库。
- 查看文件状态:git status
- 操作本地仓库
- 创建并编辑文件
创建文件:touch 文件名
touch demo1.txt
编辑文件:vi 文件名
vi demo1.txt
注意:
- 在编辑文件时,通过vi命令打开文件后,需要按键盘上的insert键向文件是写入内容。
- 内容编写好后,先按键盘上的esc键退出编辑,然后通过:wq退出编辑界面。
- 将文件添加到暂存区
要将一个文件纳入到版本库,首先要将其添加到暂存区,然后才能提交到仓库中。
# 添加单个文件到暂存区
git add 指定文件名 例如:git add Readme.txt
#将当前目录下所有修改添加到暂存区
git add .
注意:如果添加的文件中有换行符的话会报错
解决办法:Git默认配置替换回车换行成统一的CRLF,我们只需要修改配置禁用该功能即可。 git config --global core.autocrlf false
- 将暂存区中的文件提交到本地仓库
将暂存区中的文件,提交到仓库中
# 如果暂存区有文件,则将其中的文件提交到仓库
git commit
# 带评论提交,用于说明提交内容、变更、作用等 (推荐)
git commit -m '评论信息'
注意:
如果使用第一种不带评论提交,它会让我们自动进入编辑评论文档界面,编辑好后再提交。比较麻烦。因此还是推荐使用第二种直接带评论提交。
- 查看提交历史记录
有的时候,是会需要查看自己做过哪些提交,来回顾自己完成的部分。或者需要寻找某个具体的提交来查看当时的代码。
# 显示所有提交的历史记录
git log
# 单行显示提交历史记录的内容格式化显示效果
git log --pretty=oneline
- 版本回退
有了 git log 来查看提交的历史记录,我们就能查看到之前提交过的所有版本的id号,我们就可以根据这个id号通过 git reset --hard 来回退到我们需要的特定版本。
# 回退到 commit_id 指定的提交版本
git reset --hard 'commit_id'
测试:
- 此时修改demo1文件两次,提交两次
- 目前提交文件中的内容为第三次提交的内容
- 现在我们需要回退到第二次提交的内容
查看所有提交历史: git log --pretty=oneline
回退到指定版本:git reset --hard 'commit_id'
- 此时查看提交日志列表没有第三次的提交记录,且头指针已指向第二次提交的版本。
- 查看文件内容不再是第三次提交的内容,而是第二次提交的内容。
6.回到未来的某个提交
当退回到某个提交的版本以后,再通过 git log 是无法显示在这之后的提交信息的。但是,通过 git reflog 可以获取到操作命令的历史。因此,想要回到未来的某个提交,先通过 git
reflog 从历史命令中找到想要回到的提交版本的 ID, 然后通过 git reset --hard 来切换。
测试:将demo1.txt切换到第三次提交
- 查看所有提交的历史记录:git reflog 找到第三次提交的id号
- 切换到目标版本:git reset --hard 'commit_id'
- 此时查看一下文件的内容,又回到了第三次提交时的内容。
7.删除已经提交的文件
要删除已提交到本地仓库的文件,可以使用 git rm 来删除。
git rm 文件名
注意: git rm 只能删除已经提交到版本库中的文件。其他状态无法删除
测试:
- 新创建一个demo2.txt文件,直接使用git rm 删除是无法删除成功的。
- 将其add到暂存区,再使用git rm 删除也是无法删除成功的。
- 将该文件提交到版本库中,再删除就可以删除成功了
- 分支管理
- 查看分支
# 查看本地分支信息
git branch
默认情况下只有一个分支,而且*所指表示当前所在分支。
# 查看相对详细的本地分支信息
git branch -v
- 创建分支
# 新建一个名称为 dev1 的分支
git branch dev1
- 切换分支
# 新建完 dev1 分支以后,通过该命令切换到 dev1 分支
git checkout dev1
注意:当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。
# 新建 dev2 分支,并同时切getgit
换到该分支上
git checkout -b dev2
# 切换回 master主分支
git checkout master
- 合并分支
当在子分支中创建或修改的文件,需要合并到主分支中,使用以下命令:
git merge 分支名
例如:先切换到dev1分支中,在当前分支下创建一个新的文件hello.txt,将该文件提交到子分支中,然后再将dev1子分支合并到主分支master,切记合并操作需要在主分支操作。
这时,在dev1子分支中是可以看到主分支包含新添加的hello.txt文件的。但是切换到主分支后,新添加到dev1中的hello.txt文件是没有的。下面需要将dev1合并到主分支中。
合并后在主分支中就可以看到hello.txt文件了。
- 删除分支
当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了, 就可以删除它。
# 删除分支
git branch -d 分支名
- 远程仓库
现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务平台来实现,其中比较常用的有GitHub、gitee(码云)等。
-- GitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本仓库格式进行托管,故名GitHub。
-- 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快。
接下来我们演示如何将本地仓库中的代码同步到gitee。
- 注册账号
- 登录使用
新创建一个远程仓库:
填写相关信息进行创建:
- 同步远程仓库
使用克隆的方式从远程仓库同步到本地来创建本地仓库。
Gitee支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。而且如果是公司配置的私有git服务器一般不提供 https方式访问,因此我们还需要来着重演示“ssh”方式。
https://gitee.com/xiangxiao-bobo/gitdemo01.git
第一种方式:https
命令:git clone https地址
单击刚刚创建好的仓库:
在要创建本地仓库的路径下鼠标右键打开Git Bach Here
这样,我们就通过克隆远程仓库的方式创建了一个本地仓库。
第二种方式:ssh
SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这 样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处 就是传输的数据是经过压缩的,所以可以加快传输的速度。 注:使用SSH同步方式需要先生成密钥并在GitHub(gitee)配置公钥
执行命令,生成公钥和私钥: ssh-keygen -t rsa
执行命令完成后,在window本地用户.ssh目录C:\Users\用户名.ssh下面生成如下名称的公钥和私钥
密钥生成后需要在gitee上配置密钥,本地才可以顺利访问。
在用户头像下面的设置里进行配置。
将生成的公钥信息复制粘贴到公钥文本框中:
确定保存时需要输入密码
这样就设置成功了!!!
测试配置是否成功:ssh -t git@gitee.com
此时,我们就可以使用SSH的方式远程同步本地仓库了。
- 远程仓库的操作
(一)查看远程仓库
如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到origin,这是 Git克隆的仓库服务器的默认名字。
# 命令形式:
git remote -v
# origin ——仓库服务器的默认名称
注:如果显示空,没有添加远程仓库。如果添加显示远程仓库地址
对于我们自己在本地使用git init命令构建的本地仓库,并没有与远程创建同步,因此在使用该命令查看时是空的:
但如果是通过远程仓库克隆的本地仓库,则在使用该命令查看时就会显示远程仓库的地址:
那么,对于没有与远程创建简历连接的本地仓库,我们该如何建立同步呢?下面学习添加远程仓库。
(二)添加远程仓库
如果已经有了一个本地仓库,然后打算将它发布到远程,供其他人协作。
# 为本地仓库添加远程仓库
git remote add origin 远程仓库地址 (https/ssh)
如:git remote add origin https://gitee.com/junguang00/git_demo01.git
注意:
提示出错信息:fatal: remote origin already exists. 表示该远程仓库已与本地仓库建立了连接,如果想重新创建,则需要作以下两步操作:
先输入
git remote rm origin
再输入:
git remote add origin 远程仓库地址
- 推送本地仓库内容到远程仓库
# 第一次推送时使用,可以简化后面的推送或者拉取命令使用
git push -u origin master
# 将本地 master 分支推送到 origin 远程分支
git push origin master
注意:
① git push -u origin master ,第一次使用时,带上 -u 参数,在将本地的master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的master 分支关联起来。
② 推送之前,需要先pull远端仓库,如果发现提交版本不一致,出现错误
- 从远程仓库获取
在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。使用如下命令
git pull origin master
下图表示已经是最新版本了。
如果出现
fatal: refusing to merge unrelated histories
则需要
$ git pull origin master --allow-unrelated-histories
一次之后就不需要了
如果本地仓库与远程仓库没有关联,则需要先关联再做拉取操作。
- 移除无效的远程仓库
# 命令形式: git remote rm <shortname>
将本地仓库与远程仓库的连接断开。不影响本地仓库和远程仓库。
注意:此命令只是从本地移除远程仓库的记录,也是将本地仓库与远程仓库的关联断开,并不会真正影响到远程仓库
(六)解决合并冲突问题
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
例如:
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户推送,故需要先拉取远程仓库代码,经过合并后才能推送代码。在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
解决办法 :
- 针对提交冲突的一方先拉取最新的代码
- 打开文件对冲突代码进行修改
修改文件
- 再次提交
(七)删除远程仓库
在仓库主页-管理
选择左侧的删除仓库:
删除需要再次确认:
密码确认:
删除成功:
- idea中使用Git
- 在idea中配置Git
命令行查看版本:
idea中自动识别后test查看版本:
配置忽略文件:也就是不需要git管理的文件,不需要同步到远程仓库,例如:.idea;*.iml
;target等。
- 在idea中使用Git
1.idea配置gitee插件
1、安装gitee插件
2、设置idea中连接gitee,使用码云账号密码连接即可
3、测试连接gitee
- 将项目上传到gitee远程仓库
6、设置远程仓库对应的名称,提交即可
2.idea中Git的常见操作
- 新增文件:新文件状态红色,未进入暂存区,如果想直接添加到暂存区可直接在弹出的对话框中单击yes
- 加入git之后,红色变绿色,表示已经进入暂存区
- 编辑文件:修改文件 变成蓝色。正常编辑的文件默认放在暂存区,不需要再添加到暂存区。
- 重置文件到修改前 比如修订了某一文件,需要重置到修改文件之前的状态,选择文件,右键菜单:选择Git--->Revert 重置后,文件颜色自动消失,说明已重置到修改之前的状态。
5.添加到暂存区:项目上右键单击,相当于git add
6.提交:git commit
7.推送到远程仓库:
确定推送:
- 通过idea从远程仓库克隆项目
打开idea,选择check out from version control,并选择里面的Git
输入远程仓库项目下载地址和本地路径:这里需要注意本地文件夹必须是空的
后面就一路下一步即可。克隆下来的项目结构与远程仓库上是一样的。
- 分支操作
场景分析:当我们从远程仓库拉取到本地的项目进行了一些改变之后,如果直接push至远程仓库,为了防止修改后的代码同步到远程仓库后出现问题,我们需要把修改前的代码在本地保存一个备份,这样操作相对比较麻烦。
解决办法:
在本地创建一个子分支来修改代码,在子分支中测试修改代码通过后,再合并到主分支,然后再push到远程仓库。
操作步骤:
- 创建分支
此时,可以对代码进行修改操作并提交
- 切换分支执行操作,在向远程仓库提交之前,先切换到master主分支进行合并操作
- 执行合并操作,master合并dev
- 同步远程仓库
- 查看提交历史
回退到指定版本:
在某一个操作的历史记录上鼠标右键复制版本号:
7d845a3d588b63077ff652ae1980f3de5b52a2ee
在项目的鼠标右键找到分支:
将复制的版本号粘贴到文本框中:
单击OK即可回退到指定的版本。
如果还想再回到最新的版本选择log选项卡,鼠标右键copy版本号同样操作即可:
- 解决提交冲突问题
本地冲突:两个分支操作了同一个文件,合并时就会产生冲突
例如:我们在master分支中对代码进行修改,修改后提交到本地仓库;再在dev1分支中修改同一段代码,修改后提交到本地仓库,这时,我们将子分支dev1合并到master主分支中,合并过程中就是出现冲突问题。
解决办法 :
远程冲突:当多个用户同时从远程仓库拉取同一个项目对同一段代码进行了修改操作后又push至远程仓库时发生冲突。
例如:我们从远程仓库再重新克隆一份项目到不同的路径下,相当于两个用户同时在操作同一个项目代码。
当我们在第一个用户修改提交并同步到远程仓库时是没有问题的,当第二个用户再次推送修改代码时就会出现下面的问题:
这时我们选择合并并解决冲突:操作同解决本地冲突。
合并后再重新推送push到远程仓库即可。