Git环境应用
课程主要内容
- 版本控制系统概述
- Git的下载与安装
- Git基本配置(本地仓库操作)
- 分支管理
- Git远程仓库
- 远程仓库的操作
- 在idea中使用Git
一、版本控制系统概述
1.1 开发中的实际场景
场景一:代码备份
小明负责的模块就要完成了,就在即将发布之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流
场景二:代码还原【版本控制】
这个项目中需要一个很复杂的功能,老王摸索了一个星期!终于有了眉目,可是这被改得面目全非的代码,已经回不到从前了。
场景三:协同开发
小刚和小强先后从文件服务器上下载了同一个文件:UserDao.java。小刚在UserDao.java文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在UserDao.java文件中的第30行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了
场景四:追溯问题代码(编写人和编写时间)!
老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是赵四、能能、老七 都不承认是自己干的!
1.2 版本控制系统
版本控制系统能追踪项目,从开始到结束的整个过程。对编程人员而言,版本控制技术是团队协作开发的桥梁,助力于多人协作同步进行大型项目开发。
软件版本控制系统的核心任务:查阅项目历史操作记录、实现协同开发。
常见的两种版本控制类型:
- 集中式版本控制工具
- 集中式版本控制工具,版本仓库是集中存放在中央服务器的,team里每个人工作时,从中央服务器下载代码。每个人个人修改后,提交到中央版本仓库。提交(commit)代码需要联网
- 如:SVN
- 分布式版本控制工具
- 分布式版本控制系统可以没有 “中央服务器”,每个人的电脑上都是一个完整的版本仓库,这样工作的时候,不需要联网。因为版本仓库就在你自己的电脑上。多人协作只需要各自修改,开发完成即可,推送给对方【联网】,推送的时候是将整个版本仓库推过去。
- 如:Git
1.3 Git 简介
Git --- The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样介绍 Git 的。
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目的版本管理。 Git 是 Linus Torvalds。他是为了帮助管理 Linux 内核开发而开发的一个的版本控制软件。最后开源了。
- 速度、简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
1.3.1 Git工作流程图
操作:
- Clone:克隆,从远程仓库中克隆代码到本地仓库,第一次操作
- Push:推送,代码完成后,需要和团队成员共享代码时,将代码推送到远程仓库。
- Pull:拉取,从远程库拉代码到本地库,自动进行合并(merge),最后放到工作区。
操作:
- checkout:将本地仓库的内容检出到工作区
- add:在提交前先将代码提交到暂存区
- commit:提交到本地仓库
1.3.2 基本概念
- 本地仓库: 在本地主机上的一个代码库,可以独立存在,也可以与远程仓库进行关联
- 工作区:对任何文件的修订(增删改),都先放在工作区,工作区不与任何仓库分支进行关联
- 暂存区:把修订的文件,从工作区经过add(添加)后与某一个仓库分支进行关联,只要进入缓存区的文件才能commit(提交)到本地仓库。
- 远程仓库 : 在局域网或互联网上的一个主机,存放代码库的主机或平台,比如GitHub、Gitee.com(码云)
- 分支:代码存放在仓库,默认是主分支(master),可以在主分支基础上创建很多子分支,比如develop(开发)、bugfix(bug修复)等。
一个文件夹包含.git隐藏目录(Git工作目录),说明此文件目录使用Git版本管理。
.git隐藏目录中存储了很多配置信息、日志信息和文件版本信息、暂存区信息等。.Git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方。
小结
Git分布式的版本控制系统
1、Git解决那些问题:
代码备份、还原;协同开发;多版本同时开发、追溯问题代码
2、Git中的基本概念:
- 本地仓库:存储所有版本代码
- 工作区:编辑代码区
- 暂存区:准备提交的代码都放这里
- 远程仓库:用于团队之间共享代码【枢纽】
- 分支:多个版本同时开发,master主分支,develop开发分支,test测试分支
3、Git工作流程:
-
远程仓库操作:
1.clone(克隆):第一次从远程仓库下载代码
2.pull(拉取):获取团队其他成员代码提交变动
3.push(推送):完成后的代码上传到远程仓库
-
本地仓库操作:
1.checkout(检出):将本地仓库的内容检出到工作区
2.add(添加):向暂存区添加代码,准备提交
3.commit(提交):把暂存区的代码提交到本地仓库
二、Git的下载与安装
2.1 下载与安装
下载地址: https://git-scm.com/download
2.2 软件安装
下载完成后可以得到如下安装文件:
一路“下一步”使用默认选项即可。
双击下载的安装文件来安装Git。安装完成后在电脑桌面(也可以是其他目录)点击右键,如果能够看到如下两个菜单则说明Git安装成功。
备注:
- Git GUI:Git提供的图形界面工具
- Git Bash:Git提供的命令行工具
三、Git基本配置
3.1 基本配置
1.全局配置
安装完成 Git 后,正式使用git前,是需要进行一些全局设置的,如用户名、邮箱。
设置的主要命令是 git config:
# 设置全局用户名
git config --global user.name "your name"
# 设置邮箱
git config --global user.email "your email"
其中, --global 指定为全局配置,不使用该参数,则为当前所在仓库配置。
通过上面的命令设置的信息会保存在.gitconfig文件中
以上配置信息默认存储在用户目录下,如果设置错误,可以删除以下如图文件,重新操作以上命令即可。
2.查看配置信息
# 查看配置信息
git config --list
3.2 构建本地仓库
要使用Git对我们的代码进行版本控制,首先需要构建本地仓库
通常有两种方式:
1.在本地初始化一个Git仓库
2.从远程仓库克隆一个仓库 (远程仓库演示)
3.2.1 初始化本地Git仓库
1)在电脑的任意位置创建一个空目录(例如local_repo1)作为我们的本地Git仓库
2)进入这个目录中,点击右键打开Git bash窗口
3)执行命令Git init如果在当前目录中看到.git文件夹(此文件夹为隐藏文件夹)则说明Git仓库创建成功
3.3 本地仓库的操作【重点】
3.3.1 创建 Git 版本库
在本地创建 Git 版本库,需要使用 git init 命令。
首先,你需要新建一个存放版本库的目录,然后进入到该目录所在路径,然后执行:
git init
然后查看目录结构中,就可以看到包含有 .git 子目录,这就说明创建版本库成功了
3.3.2 查看当前文件状态
#命令形式:git status [-s]
#更简洁的信息命令形式:git status -s
3.3.3 将文件添加(修改)到版本库
要将一个文件纳入到版本库管理,首先要将其添加到暂存区,然后才能提交到仓库中。
将文件添加到暂存区,使用的是 git add:
# 添加单个文件到暂存区
git add Readme.txt
# 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外
git add .
注意:这边空文件夹是不会被添加到暂存区中的。
- 将暂存区中的文件,提交到仓库中。需要使用 git commit:
# 如果暂存区有文件,则将其中的文件提交到仓库
git commit
# 带评论提交,用于说明提交内容、变更、作用等
git commit -m 'your comments'
注意:这边直接用 git commit 提交,会先弹出添加评论的页面。
3.3.4 查看提交历史记录
有的时候,是会需要查看自己做过哪些提交,来回顾自己完成的部分。或者需要寻找某个具体的提交来查看当时的代码。这里需要用到:
git log # 显示所有提交的历史记录
git log --pretty=oneline # 单行显示提交历史记录的内容
在 git log 的输出内容中,可以看到每次提交的 ID,是一个 40 位的字符串。
3.3.5 版本回退
有了 git log 来查看提交的历史记录,我们就可以通过 git reset --hard 来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。
# 会退到 commit_id 指定的提交版本
git reset --hard 'commit_id'
回到未来的某个提交
当退回到某个提交的版本以后,再通过 git log 是无法显示在这之后的提交信息的。但是,通过 git reflog 可以获取到操作命令的历史。
因此,想要回到未来的某个提交,先通过 git reflog 从历史命令中找到想要回到的提交版本的 ID,然后通过 git reset --hard 来切换。
git reflog
git reset --hard 'commit_id'
3.3.6 删除文件
在文件未添加到暂存区之前,对想删除文件可以直接物理删除。如果文件已经被提交,则需要 git rm 来删除:
git rm Readme.md # 删除已经被提交过的 Readme.md
注意: git rm 只能删除已经提交到版本库中的文件。其他状态的文件直接用这个命令操作是出错的。
3.3.7 添加文件至忽略列表
一般在工作区中,并不是所有文件都需要纳入版本控制的
这种不需要进行版本控制的通常都是些自动生成的文件。比如:idea工程文件(springmvc.iml)、编译后文件target、系统上传的图片img。
在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件。
四、分支管理
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
-
master (生产) 分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
-
test(测试)分支
从master创建的分支,一般作为测试部门的测试分支,进行预发测试。
测试完成后,需要合并到master分支,进行上线,中小规模项目可省略此分支;
-
develop(开发)分支
从test创建分支,如果开发没有test分支,是从master创建的分支,一般作为开发部门的主要开发分支
如果没有其他并行开发不同期上线要求,都可以在此版本进行开发
阶段开发完成后,需要是合并到test分支继续测试,如果没有test分支,可直接合并到master分
支。 -
hotfix(bugfix)分支,
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。
查看分支
查看分支使用 git branch:
# 查看本地分支信息
git branch
# 查看相对详细的本地分支信息
git branch -v
# 查看包括远程仓库在内的分支信息
git branch -av
注意:在 git branch 的输出内容中,有一个分支,前面带有 * 号,这标识我们当前所在的分支
创建分支
当我们要修复一个 Bug,或者开发一个新特性,甚至是在初学的时候怕打乱原来的代码,都可以新建一
个分支来避免对原来代码的影响。
# 新建一个名称为 dev 的分支
git branch dev
切换分支
当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。
# 新建完 dev 分支以后,通过该命令切换到 dev 分支
git checkout dev
创建并切换分支
# 新建 dev 分支,并切换到该分支上
git checkout -b dev
这个命令合并了前两个独立的命令,平常使用中一般这样使用。
合并分支
当我们修复完成一个 Bug,或者开发完成一个新特性,我们就会把相关的 Bug 或者 特性的上修改合并回原来的主分支上,这时候就需要 git merge 来做分支的合并。
首先需要切换回最终要合并到的分支,如 master:
# 切换回 master 分支
git checkout master
# 将 dev 分钟中的修改合并回 master 分支
git merge dev
合并回主分支的时候,后面可能会面临到冲突的问题 git add ./
删除分支
当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。
# 删除 dev 分支
git branch -d dev
五、Git远程仓库
5.1 添加远程库
现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份。
那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务平台来实现,其中比较常用的有GitHub、码云等。
- GitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本仓库格式进行托管,故名GitHub。
- 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于
GitHub,码云速度会更快。
接下来我们演示如何将本地仓库中的代码同步到github。和码云的操作一模一样
5.2 注册GitHub
第一步:登录网址,点击sign up注册账号
第二步:填写信息,注意邮箱要真实有效
第三步:直接点击join a free plan
第四步:直接划到最下面点击complete setup
第五步:邮箱需要验证,验证完成后登陆进github
第六步:登录
5.3 创建远程仓库
点击“create repository”按钮仓库就创建成功了。
5.4 同步远程仓库
Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。而且如果是公司配置的私有git服务器一般不提供https方式访问,所以我们要来着重演示“ssh”方式。
5.4.1 ssh协议
5.4.1.1 什么是ssh?
SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
5.4.1.2 ssh密钥生成
在windows下我们可以使用 Git Bash.exe来生成密钥,右键菜单打开Git Bash
git bash 执行命令,生成公钥和私钥
命令:
ssh-keygen -t rsa
执行命令完成后,在window本地用户.ssh目录C:\Users\用户名.ssh下面生成如下名称的公钥和私钥:
5.4.2 ssh密钥配置
密钥生成后需要在github上配置密钥,本地才可以顺利访问。
在key部分将id_rsa.pub文件内容添加进去,然后点击“Add SSH key”按钮完成配置。
六、远程仓库的操作
6.1查看远程仓库
如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字
# 命令形式:git remote -v
# origin ——仓库服务器的默认名称
6.2 添加远程仓库
如果已经有了一个本地仓库,,然后打算将它发布到远程,供其他人协作。那么使用:
# 为本地仓库添加远程仓库
# origin 远程仓库的名称
# your_remote_git_repo 远程仓库的地址
git remote add origin your_remote_git_repo
# 示例
git remote add origin git@github.com:CNsoldier/repo.git
6.3 推送本地的内容到远程仓库
当本地仓库中,代码完成提交,就需要将代码等推送到远程仓库,这样其他协作人员可以从远程仓库同步内容。
# 第一次推送时使用,可以简化后面的推送或者拉取命令使用
git push -u origin master
# 将本地 master 分支推送到 origin 远程分支
git push origin master
注意: git push -u origin master,第一次使用时,带上 -u 参数,在将本地的 master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。
注意
推送之前,需要先pull远端仓库,如果发现提交版本不一致,出现错误
6.4 从远程仓库获取最新内容
在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。
可以通过 git fetch 和 git pull 来获取远程仓库的内容。
git fetch origin master
git pull origin master
git fetch 和 git pull 之间的区别:
- git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。
- git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge。
6.5 移除无效的远程仓库
如果因为一些原因想要移除一个远程仓库(断开连接)
# 命令形式: git remote rm <shortname>
6.6 从远程仓库克隆
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
如果你本地没有仓库,希望从已有的远程仓库上复制一份代码,那么你需要 git clone。
# 通过 https 协议,克隆 Github 上 git 仓库的源码
git clone https://github.com/lagou-zimu/repo1.git
# 通过 ssh 协议,克隆 Github 上 git 仓库的源码
git clone git@github.com:lagou-zimu/repo1.git
6.6 从远程仓库中拉取
拉取 pull
# 拉取 命令形式:git pull【远程仓库名称】【分支名称】
6.7 解决合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户推送,故需要先拉取远程仓库代码,经过合并后才能推送代码。在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
A用户:修改a.java代码推送到远程仓库
B用户:修改a.java同一行代码,提交之后,合并码出现冲突
解决方法:
1.先拉取代码
2.然后打开代码解决冲突
3.再提交
小结:
远程仓库操作常用命令:
git remote #查看所有远程仓库名称
git remote -v #查看远程仓库缩略信息
git push origin master # 将本地仓库代码推送到远程仓库
git clone https://github.com/lagou-zimu/repo1.git # 克隆远程仓库代码到本地
git pull origin master # 拉取远程仓库代码到本地:(fetch+merge)
七、在Idea中使用Git
4.1 在Idea中配置Git
安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到Git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到Version Control下的Git选项:
点击Test按钮,现在执行成功,配置完成
4.2 开发中idea的Git常见操作
4.2.1 初始化并提交项目到远程仓库 【项目leader操作】
执行步骤:
- 在GitHub/码云中创建远程仓库
- 将maven工程交给Git管理
- 配置忽略文件
- 提交到本地仓库
- 推送到远程仓库
执行过程:
- 在码云中创建远程仓库
- 将maven工程交给Git管理
- 配置忽略文件
- 提交到本地仓库
- 推送到远程仓库
4.2.2 克隆远程仓库到本地【开发人员】
操作步骤:
- 从远程仓库克隆
4.2.3 本地仓库常规操作【开发人员、重点】
1、新增文件
在ssm_dao模块中,新增一个GitMapper接口,新文件状态红色,未进入暂存区
加入git之后,红色变绿色,已经进入暂存区:
2、编辑文件
在ssm_dao模块中,修改GitMapper接口,文件变蓝色正常编辑的文件默认放在暂存区,不需要再添加到暂存区
3、重置文件到修改前
比如修订了某一文件,需要重置到修改文件之前的状态,选择文件,右键菜单:选择Git--->Rollback
4、提交到本地仓库
- 提交当前文件
4.2.4 本地仓库推送Push至远程仓库
操作步骤:
- 推送前一定要先拉取远程仓库对应分支
- 如果有冲突,先解决冲突,并提交到本地仓库
- 推送当前分支到远程仓库
操作过程:
1.推送前一定要先拉取远程仓库对应分支
2. 如果有冲突,先解决冲突,并提交到本地仓库
3.推送当前分支到远程仓库
4.2.5 分支操作
操作步骤:
- 创建分支
- 切换分支执行操作
- 执行合并操作,master合并dev
操作过程:
1.创建分支
2. 切换分支执行操作
3.完成合并推送到远程仓库
4.2.6 傻瓜追踪器:版本比较
对代码修改后,可以点击对比按钮,对比差异
本文来自博客园,作者:寒露凝珠,转载请注明原文链接:https://www.cnblogs.com/china-soldier/p/15677269.html