2_Git
一. 引言
- 在单人开发过程中, 需要进行版本管理, 以利于开发进度的控制
- 在多人开发过程中, 不仅需要版本管理, 还需要进行多人协同控制
二. 介绍
- Git是一个开源的分布式版本控制系统, 用于敏捷高效地处理任何或小或大的项目
- Git是Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件
- 官网: https://git-scm.com/
三. Git安装
3.1 下载Git
3.2 安装
- 除了安装的位置外, 其他一直点下一步即可
3.3 基本配置
- 安装后, 打开cmd(或者在桌面鼠标右键 Git Bash Here ), 自报家门
- 如下信息会在提交代码时使用, 记录在你的每次提交中, 以后才知道哪次提交是谁做的
git config --global user.name "用户名" #用户名
git config --global user.email "邮箱" #邮箱
#查看信息
git config -l #如果出现: 或者end 输入q即可退出
3.4 测试
- 查看git版本
git version
四. 架构
- 版本库: 工作区中有一个隐藏目录 .git, 这个目录不属于工作区, 而是git的 版本库, 是git管理的所有内容
- 暂存区: 版本库中包含一个临时区域, 保存下一步要提交的文件
- 分支: 版本库中包含若干分支, 提交的文件存储在分支中
五. 仓库
- 对应的就是一个目录, 这个目录中的所有文件被git管理起来
- 以后会将一个项目的根目录, 作为仓库
- 仓库中的每个文件的改动, 都由git跟踪
5.1 新建仓库
- 选择一个目录, 例如D:/GitSpace 执行命令: git init
- 在此目录下, 会新建一个 .git 目录(默认是隐藏的), 即仓库对应目录
5.2 工作区
- 执行 git init 的目录即为工作区, 如 D:/GitSpace 目录即为工作区[不包含其内部的 .git 目录]
- 所有文件, 都首先在工作区新建, 然后可以存入仓库(版本库), 进行版本控制
5.3 暂存区
- 暂存区也在 .git 目录内, 工作区的文件进入仓库时, 要先进入暂存区
5.4 分支
- 版本控制, 简单说, 就是记录文件的诸多版本, 分支就是这些版本的最终记录位置
六. 基本操作
6.1 查看仓库状态
- 执行 git status 可以看到工作区中文件的状态
6.2 暂存文件
- 执行 git add . ,将工作区中的文件全部 存入暂存区
6.3 提交文件
- 执行 git commit -m "这里写提交的描述信息" 作用是将暂存区的文件存入版本库中的分支, 形成一个版本
七. 远程仓库
- 第五章的仓库, 其实是本地仓库
- 当多人协同开发时, 每人都在自己的本地仓库维护版本
- 但很重要的一点是, 多人之间需要共享代码, 合并代码, 此时就需要一个 远程仓库
7.1 远程仓库工作模式
- workspace(add)---->localCache(commit)---->localRepository(push)---->remoteRepository(clone)---->localRepository(checkout)---->branch workspace
- 从本地工作区添加到本地暂存区
- 从本地暂存区提交到本地仓库
- 从本地仓库上传到远程仓库(共享区域)
- 从远程仓库中复制到本地仓库
- 在本地仓库切换分支然后后续的 git commit便会在此分支上新建版本(提交点)
7.2 远程仓库选型
- 有很多远程仓库可以选择, 比如 github(https://github.com/), 码云(https://gitee.com/)
- 公司内部也可以有自己构建的远程仓库
7.3 基本操作
- 每个开发人员, 在面对远程仓库时, 会面临的一些基本操作
7.3.1 注册git服务器账号
- 在 码云 注册账号, 并登录
- 进入公司后, 很可能会使用公司自己搭建的git服务器, 向领导索要账号即可
7.3.2 新建远程仓库
- 通过网站右上角的「+」号,选择「新建仓库」,进入新建仓库页面
- 在新建仓库页面填写仓库信息。仓库相关概念说明如下:
- 仓库名称: 仓库的名称,用于仓库命名
- 归属:仓库归属账户,可以是个人账号/组织/企业中的一种,创建成功后该账户默认为仓库的拥有者(管理员)
- 路径:仓库的git访问路径,由
用户个性地址+仓库路径名称
组成。创建仓库后用户将通过该路径访问仓库。 - 仓库介绍:仓库的简单介绍
- 是否开源:设置仓库是否为公开仓库,公开仓库对所有人可见,私有仓库仅限仓库成员可见。
- 选择语言:仓库主要开发用的编程语言
- 添加
.gitignore
:系统默认提供的git忽略提交的文件模板,设置.gitignore
后将默认忽略指定目录/文件到仓库 - 添加开源许可证:如果仓库为公开仓库,可以添加设置仓库的开源协议,作为对当前项目仓库和衍生项目仓库许可约束,开源许可证决定了该开源项目是否对商业友好。
- Readme:项目仓库自述文档,通常包含有软件的描述或使用的注意事项。
- 使用
\*\*\*模板文件
初始化仓库:使用Issue
或Pull Request
文件模板初始化仓库
- 输入相关选项, 点击创建
- 生成了两种类型的地址 HTTPS 和 SSH
7.3.3 本地关联远程仓库
- 本文档选用仓库的https协议的地址, 将此地址关联到本地git中
git remote add origin https://gitee.com/MARSdoubleZ/git_repo.git
#如果提示已经存在origin则先执行 git remote rm origin 把原先的origin删除掉
git remote -v #查看远程仓库地址
7.3.4 上传文件到远程仓库
- 将本地仓库中已经commit的内容push到远程仓库, 以共享自己的代码
#将本地master分支, 上传到远程master分支
git push origin master
#上传时会有弹框, 需要输入码云的账号和密码
- 这里可能会出现连接不上远程仓库的情况, 解决方式如下
#方法一: 查一下代理, 如果有就清除
git config --global http.proxy
git config --global --unset http.proxy
git config --global https.proxy
git config --global --unset https.proxy
7.3.5 复制远程仓库
- 如果仓库已经由别人创建完毕, 我们需要其中的内容, 则可以通过 git clone 将其复制到本地
#复制
git clone 远程地址
#复制来的内容, 自动形成了本地仓库
7.3.6 代码共享
- 多人协同开发时, 写好代码的 git push 上传到远程仓库; 需要代码的 git pull 拉取代码即可
#上传新版本
git commit -m "new file hello.txt" #本地新增版本
git push origin master #将本地的master分支的内容同步到远程仓库的master分支
#获取新版本
git pull origin master #拉取远程仓库中的master分支内容
7.3.7 命令汇总
- git remote add origin 远程地址
- 本地关联远程仓库, origin是远程仓库的标识名
- git push origin master
- 将本地仓库内容上传到远程仓库的分支中
- git pull origin master
- 从远程仓库分支中下载内容到本地
- git clone 远程地址
- 将远程仓库复制到本地, 并自动形成一个本地仓库
7.8 生成/添加SSH公钥
- Gitee 提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。
- 你可以按如下命令来生成 sshkey:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
注意:这里的
xxxxx@xxxxx.com
只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
- 按照提示完成三次回车,即可生成 ssh key。通过查看
~/.ssh/id_rsa.pub
文件内容,获取到你的 public key
cat ~/.ssh/id_rsa.pub
- 复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
- 添加后,在终端(Terminal)中输入
ssh -T git@gitee.com
- 首次使用需要确认并添加主机到本机SSH可信列表。若返回
Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.
内容,则证明添加成功。 - 添加成功后,就可以使用SSH协议对仓库进行操作了。
八. 分支
8.1 分支简介
- 分支, 是一个个版本最终存储的位置
- 分支, 就是一条时间线, 每次 git commit 形成一个个版本, 一个个版本依次存储在分支的一个个提交点上
- 分支由多个提交点组成, 分支上会有一个指针, 默认总是指向最新的提交点
8.2 分支操作
8.2.1 查看分支
- 查看当前仓库的分支 git branch
- 仓库中默认的只有master分支
- 执行 git commit 时, 默认是在master分支上保存版本
8.2.2 创建分支
- 在商业项目开发过程中, 我们不会轻易的在 master 分支上做操作
- 我们会新建一个 开发用的分支 , 在此分支上做版本的记录, 当代码没有问题时, 才会将开发分支上成熟的代码版本添加到 master 分支上
- 保证开发过程中, 可以及时记录版本, 又保证 master 分支上每个提交点都是稳健版本
#创建分支
git branch dev
8.2.3 切换分支
- 默认情况下, 当前使用的分支是 master 分支
- 可以切换到 dev 分支, 则后续的 git commit 便会在 dev 分支上新建版本(提交点)
#切换到dev分支
git checkout dev
8.3 新建分支细节
- 新建分支时, 新分支, 默认有哪些内容? 分支中包含了哪些次提交?
8.3.1 新分支初始内容
- 每个分支都有一个 指针 , 新建一个分支, 首先是新建一个 指针
- 而且新分支的指针会和当前分支指向 同一个提交点
- 新分支包含的提交点就是从第一个提交点到分支指针指向的提交点
8.3.2 多分支走向
- 在master分支和新分支, 分别进行 git add 和 git commit
- 分支情况如下:
- master分支未动, 在dev分支增加一次commit
- master分支增加一个commit, dev再增加一个commit
8.3.3 分支提交日志
- 查看分支的提交日志, 进而看到分支中提交点的详细情况
#简易日志
git log --oneline
#完整日志
git log
8.4 分支合并
- 两个分支内容的合并
- git merge 分支a 合并分支a
- 合并的方式有两种: 快速合并 和 三方合并
8.4.1 快速合并
- 如果分支A当前的修改, 是完全基于分支B的修改而来, 则分支B合并分支A, 就是移动指针即可
8.4.2 三方合并
- 在不具备快速合并的条件下, 会采用三方合并
- 将2和3的更改都累加在1上, 形成新的提交点
8.4.3 合并冲突
- 两个分支进行合并, 但它们含有对同一个文件的修改, 则在合并时出现冲突, git无法判断该文件该保留哪个分支的修改
- 发生冲突时, 两个分支的内容用 <<< === >>> 做了分隔
8.4.4 冲突解决
- 出现冲突后, 要由两个开发人员当面协商, 该如何取舍, 为冲突文件定义最终内容
- 解决方案:
- 保留某一方的, 删除另一方的
- 保留双方的
- 但无论如何, 要记得删除 <<< === >>>
- 本质是两人协商, 为冲突的内容定制出合理的解决方案
九. IDEA关联Git
9.1 关联Git
- File > Settings > Version > Git > Path to Git executable
- 一般情况下关联过程是自动的
9.2 新建仓库
新建项目后, 将项目目录创建为git目录
注意: 要在建仓库前, 设置
忽略文件 ".gitignore"
(在根目录下新建)
- 作用: 被忽略的文件会被版本记录为忽略, 版本中不包含它们
- 范围: 不需要和其他开发共享的文件, 具体见下图
#所有以class,jar,war,iml为后缀的文件
*.class
*.jar
*.war
*.iml
#.iead文件夹
.idea
#out文件夹
out
#target文件夹
target
#数据库连接参数 文件
jdbc.properties
- 然后点击VCS > Import into Version Control > Create Git Repository
- 然后选择项目目录, 作为导入git的目录
9.3 提交-commit
- 创建好仓库后, 做第一次提交
- VCS > Commit...
- 之后在弹出框Local Changes > Default Changelist下勾选所要上传的文件
- 之后可能会有些友好提示, 可以点击忽略, 点击 "commit"即可
9.4 创建分支
- 新建开发分支
- IDEA右下角
9.5 上传到远程仓库(push)
- 请首先按照第七章, 创建一个远程仓库
- 要求是裸库, 且建议库名和项目名同名
- VCS > Git > Push
9.6 复制到本地仓库(clone)
- 如果有建好的远程仓库, 比如公司内已经在使用的仓库, 或者github, 码云上的一些公开仓库, 可以将远程仓库的项目复制到本地使用
- VCS > Git > Clone
9.7 更新本地项目
- 如果远程仓库有更新, 则你的本地项目也需要一起更新
- VCS > Git > pull
9.8 冲突解决
- 合并分支时, 如果出现冲突, 则需要解决冲突
- 需要发生冲突的双方一起商讨出最佳解决方案
十. 多人协同开发
- 多人协同开发, Git操作
10.1 项目管理员(项目经理)
- 由管理员负责创建一个远程仓库, 初始的库中什么也没有, 为裸库, 库的名称建议和项目同名
- 管理员会在IEDA中创建一个初始项目, 其中包含 .gitignore 文件, 并在项目根目录下建立本地库, 并建立 dev 分支
- 管理员将本地库上传到远程库
- 将其他开发人员拉入远程库的 开发成员列表中 , 使得其他开发人员可以访问该远程库
- master的分支设置为 protected分支, 只有管理员有权限将代码合并到其中, dev分支设置为 常规分支 所有开发人员都可以在其中合并代码
10.2 开发人员
- 初始化: 在IDEA中clone远程库, 获得项目, 会建立本地库
- 后续的开发中, 都要在 dev 分支上进行, 开发完一个功能并测试通过后就提交 (commit) 到本地的 dev 分支中, 然后上传 (push) 到远程dev分支中
- 需要更新项目内容时, 通过 pull 从远程仓库拉取内容
- 注意: 多人协同时, 每次在 push 到远程库前, 都先做一次 pull ,一来是把远程最新内容合并到本地, 二来是核实本次内容是否和远程内容有冲突
- 后续的开发中, 会接到一个个的功能任务, 往复操作2, 3, 4 步骤即可
十一. 经典问题
- 在使用https协议做push时, 如果曾经使用过码云, 但密码有过改动, 此时会报错 remote: You do not have permission to push to the repository via HTTPS
- 解决方案:
- 控制面板 > 用户账户和家庭安全 > 凭据管理器 > 管理Windows凭据
2_Git的更多相关文章
随机推荐
- ooday03 Java_引用类型数组_继承_super_向上造型
引用类型数组: 点击查看代码 1)Bomb[] bs = new Bomb[3]; bs[0] = new Bomb(100,200); bs[1] = new Bomb(200,300); bs[2 ...
- Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找
The link to problem:Problem - D - Codeforces D. Range and Partition time limit per test: 2 second ...
- Modbus转OPC
在这里给大家介绍一种低成本的将Modbus RTU协议的串口设备接入到OPC UA的服务器呢? OPC全称是OLE(Object Linking and Embedding) for Process ...
- js屏蔽浏览器默认事件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- bbs项目解读
1.注册功能 具体的效果图如下: 注册功能涉及到的逻辑步骤: 1.搭建前端html页面 2.向后端提交用户输入数据 3.对用户输入的数据格式进行校验 4.页面输入数据格式错误,及时向用户进行提示/正确 ...
- 【原创】JDK 9-17新功能30分钟详解-语法篇-var
JDK 9-17新功能30分钟详解-语法篇-var 介绍 JDK 10 JDK 10新增了新的关键字--var,官方文档说作用是: Enhance the Java Language to exten ...
- 基于vue的脚手架开发与发布到npm仓库
什么是脚手架 在项目比较多而且杂的环境下,有时候我们想统一一下各个项目技术栈或者一些插件/组件的封装习惯,但是每次从零开发一个新项目的时候,总是会重复做一些类似于复制粘贴的工作,这是一个很头疼的事情, ...
- NOI2022游记,Au
前言 8.19: 说实话,我在这里说几句话还不如水群, 新番把我心态搞炸了,我现在急需快乐 所以像游记这种吹水+回忆的文章让我现在非常痛苦. Day -1 (8.19) 上午是信心赛,太好辣,坐等D3 ...
- 【Manim】关于add_updater的基本使用方法
add_updater(update_function,index=None,call_update=False) 后面两个参数可以不写. update_function更新函数一般填入一个lambd ...
- pod资源的健康检查-liveness探针的httpGet使用
使用liveness探针httpget方式检测pod健康,httpGet方式使用的最多 [root@k8s-master1 tanzhen]# cat nginx_pod_httpGet.yaml a ...