1. 简介
Git是一个免费的,开源的分布式版本管理系统。不同于SVN等集中等版本管理系统,版本管理中心在中心服务器,客户端无法单独完成版本的管理(提交,回退,提交历史查看)...。Git作为分布式管理系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,所以的版本管理都可以在本地完成。同时也可以和远端的代码仓库交互,实现团队协作开发。
2. 初始化设置
- git --version 查看git版本号
- git config --global user.name "user name" 设置邮箱地址用户名
- git config --global user.email "email addr" 设置
- git init 初始化本地仓库(在需要版本管理的文件夹内,会创建.git 文件夹)
3. 应用场景
3.1 本地版本管理
Git 每个节点本地会分为三个区域 工作区->暂存区->本地库
3.1.1 提交命令
- git add filename 将文件提交到暂存区
- git commit -m "提交说明" filename 将文件从暂存区提交到本地库 说明:
- 不放在本地仓区的文件,git是不管理的(既文件所在的文件夹没有 git init 初始化,git是不管理的)
- 放在本地仓库的文件,如果没有add 和 commit 操作,git 也是不会管理的。
3.1.2 状态和日志查看
- git status 查看工作区和暂存区状态(是否有变更-添加,删除,修改)
- git log 查看提交记录,显示从近到远的提交日志(当历史记录过多的时候,查看日志的时候,有分页效果,分屏效果,一页展示不下,翻页操作:下一页-空格,上一页-b,到尾页了-显示END),每条记录的第一行为版本的索引,回退是需要
- git log --pretty=oneline 查看提交记录,在一行展示,展示的更为美观(第一列为索引值,回退的时候需要)
- git --oneline 查看提交记录,在一行展示,显示的更为简洁(第一列为索引值,回退的时候需要)
- git reflog 展示提交记录,多了信息:HEAD@{数字}这个数字的含义:指针回到当前这个历史版本需要走多少步。(第一列为索引值,回退的时候需要)
3.1.3 版本管理
- git reset --hard 期望回退版本的索引值。 参数说明:
"hard 参数":本地库指针移动的时候,重置暂存区和工作区
"mixed 参数": 本地库指针移动的时候,重置暂存区,但是工作区不动
"soft 参数": 本地库指针制动的时候,暂存区和工作区不动
3.1.4 文件比较
git diff 命令可以比较文件不同版本的差异,详情如下:
- git diff [文件名] ---> 将工作区中的文件和暂存区中文件进行比较 (下面的图片为将Test3文件中 aaaa 修改为 aaaabbb)
- git diff --> 比较工作区中和暂存区中 所有文件的差异
- git diff [历史版本][文件名] ---》比较暂存区和本地库中内容
3.1.5 分支管理
- 创建分支: git branch branch01 --> 创建 branch01 分支
- 查看分支: git branch -v
- 切换分支: git chechout branch01 --> 切换到 branch01 分支
3.1.6 分支合并和冲突解决
说明: 在 3.1.5 的基础上分别在两个分支修改同一个文件,造成分支合并时文件冲突:
- Branch01分支上修改 Test4.txt,添加一行数据:增加内容by branch01
- master分支上修改 Test4.txt, 添加一行数据:增加内容by master
分支合并(将 branch01 合并到 master 分支)步骤:
- 切换为 master 分支:git chechout master
- 将branch01中的内容和主分支内容进行合并(会出现冲突):git merge branch01
- 查看冲突: cat Test04.txt
- 解决冲突:公司内部商议解决,或者自己决定 人为决定,留下想要的即可:
- 将工作区中内容添加到暂存区(此时仍然处于合并状态中):git add Test4.txt
- 将暂存区内容提交到本地库(commit 后就不是合并状态): git commit -m "提交说明"
3.2 团队协作
托管中心选择:
- 局域网环境下:可以搭建 GitLab服务器作为代码托管中心,GitLab可以自己去搭建
- 外网环境下:可以由GitHub或者Gitee作为代码托管中心,GitHub或者Gitee是现成的托管中心,不用自己去搭建
说明:下面的流程以 GitHub 为例
3.2.1 前置准备
- 注册 GitHub
- 初始化本地仓库
mkdir GitResp2
cd GitResp2
git init
- (为方便观察)在本地仓库创建文件并提交到本地库()
# 先创建 Demo.txt, 并添加内容
git add Demo.txt
git commit -m "增加了Demo.txt" Demo.txt
- 创建远程库
3.2.2 别名操作
远程库的地址比较长。 如:github.com/zhaoshansha… ,在操作时比较麻烦,通过创建别名可以简化操作。注意别名操作需要在git 仓库内执行,否则会报错, 每个仓库内都可独立设置别名。 别名相关命令:
- 创建别名: git remote add [别名] [远程库地址]
- 查看别名: git remote -v
3.2.3 推送操作
- git push [远程库别名] [分支]
推送成功后,可以在远程库查看自己的提交信息
3.2.4 克隆操作
- git clone [远程库地址]
克隆操作会完成如下工作:
- 初始化本地库
- 将远程库内容完整的克隆到本地
- 替我们创建远程库别名
3.2.5 团队协作-其他人push
3.2.4 节用户clone操作,因为是读操作,不会对远程库修改,所有不需要校验账号和权限, 可以直接 clone到本地。但是如果修改后想要push 代码,此时就会报错。
说明:3.2.3 节是以管理员账号示例, 本节是为了说明一个全新的用户如何加入。
直接执行 push 命令会报错:
此时需要联系管理员将账号加入远程库团队内,然后接受邀请后即可。具体如何邀请可自行百度,此处不详述
3.2.6 拉取远程库更新
- git pull origin master -> 远程库的拉取可以直接利用pull命令来完成:
- 也可以使用 git fetch + git merge 两个命令完成(pull = fetch+merge)
3.2.7 冲突解决
示例前置状态说明:
- 创建 Test.txt, 并提交远程库
- 用户A 修改 Test.txt, 并提交远程库。(添加:aaaa by zhaoshanshan222)
- 用户B 修改 Test.txt, 提交远程库。(添加:oooo by zhaoshanshan666)
- 此时用户B提交远程库时,会发现 push 失败,提示冲突
问题解决:
- 在发现冲突后,应该先讲远程库内容拉取下来
- 查看冲突
- 解决冲突
- 解决完冲突后,提交远程库
3.3 跨团队协作
托管中心选择:
- 局域网环境下:可以搭建 GitLab服务器作为代码托管中心,GitLab可以自己去搭建
- 外网环境下:可以由GitHub或者Gitee作为代码托管中心,GitHub或者Gitee是现成的托管中心,不用自己去搭建
说明: 跨团队协作与团多协作基本一样,主要差别就是
- fork: 在仓库执行复制操作,形成新的远程库供其他团队开发
- merge: (其他团队)在新的远程库开发完成后,需要合并入愿仓库。
说明:本操作不在详细说明,不同的远程库操作大同小异,需要时可以百度查看具体操作。基本上在页面点击操作即可。
4. SSH 免密
前面的示例 Git 远程库地址使用的都是 https 地址,每次提交时需要输入远程库的用户名和密码,使用 SSH 可以免除每次输入密码。 具体流程图下:
- 切换到用户家目录: cd ~
- 生成密钥: ssh-keygen -t rsa -C 邮箱地址(注意:-C 要大些, 邮箱需要输入注册GitHub的邮箱地址, 执行后三次回车默认值即可)
- 第二步执行完后,会生成 .ssh 文件夹
- 打开id_rad.pub文件,将里面的内容进行复制
- 将第四步复制的密钥添加到 GitHub
6. 验证
6.1 给远程库 ssh地址创建别名
6.2 查看别名
6.3 向远程库提交
说明: ssh 方式可以讲密钥添加到远程库,省去每次输账号密码。但是一台电脑只能有一个密钥(账号)。
5. IDEA 支持Git
5.1 IDEA 设置 Git安装地址
5.2 IDEA 直接导入 Git 远程库项目
5.3 其他
其他 IDEA 对 Git的操作,基本上是对命令的封装后展示,了解上面 Git的原理后很好掌握,就不再赘述。