🌈 个人主页:十二月的猫-优快云博客
🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-优快云博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
2. 获取本地仓库
要使用Git对我们的代码进行版本控制/协作管理,我们首先要有自己的本地仓库。获取本地仓库的步骤如下:
- 创建一个目录,作为本地的Git仓库。
- 进入目录中,右键打开Git bash窗口。
- 执行命令 git init。
- 如果创建成功可以在文件夹下面看到隐藏的.git目录。
3.Git的基本指令
动态理解:了解状态变化。
静态理解:了解状态所属区域,以及各个区域在git status指令中的描述
指令理解:了解指令和状态变化的关系。
状态转变描述:
- 新创建一个文件——》文件状态:未跟踪。
- 修改已有文件——》文件状态:未暂存。
- 对发生变化文件(创建或修改)git add——》文件状态:已暂存。
- 对已暂存文件git commit——》文件状态:进入仓库。
状态所属区域:
- 未跟踪和未暂存都处于工作区,说明文件正在被修改。
- 已暂存处于暂存区。
- commit后进入仓库。
相关命令:
- git add:从工作区转向暂存区。
- git commit:从暂存区转向仓库。
- git status:看文件目前所属的状态。
- git log:看文件提交的各种信息(提交人、提交时间、提交文件名、提交位置)
- 命令后面跟 文件名 或 通配符.
不同区域在git status中的描述:
- 工作区:untarcked file、changes not staged for commit
- 暂存区:changes to be commited
- 仓库:界面比较干净(可能为:nothing to commit,以及 on branch master等)
3.1 git log查看提交日志
git log 指令中的不同命令:
- --all 显示所有分支
- --pretty=online 将提交信息显示为一行
- --abbrev-commit 输出的commitid更简短
- --graph 以图的形式显示
- 上面所有的命令有不同的功能,从不同方面简化git log的输出。一般是一起使用。
如果之前有看过我的安装与配置Git的文章。你会看到我有下面的设置:
这个设置就是将git log一连串的命令简化为缩写:git -log
一句话:普通输出用git log;优化输出用git -log
3.2 git reset 版本回退
git reset 指令中的不同命令:
- --hard commitID:切换到特定版本(commitID是版本号,可以用git log来查看)
git bash中的复制粘贴:
1. 复制:选中即可自动复制2. 粘贴:点击滚轮即可粘贴
如何查看已经删除的记录呢(回退后最新的处理记录会被删除)?
- git --reflog
3.3 添加文件至忽略列表
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
3.4 必记的Git指令
4. Git中的分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
- 分支:每个人开发互不影响。
- 合并:不同人开发的内容共同协作。
4.1 分支的基本指令
- git branch:查看目前分支。
- git branch 分支名:创建本地分支
- git branch -d 分支名:删除分支,并作各种检查
- git branch -D 分支名:强制删除分支
- git branch -vv:看本地仓库分支和远程仓库分支的对应关系
- git checkout 分支名:切换分支
- git checkout -b 分支名:创建并切换分支
- git merge 分支名称:把分支名称所在分支合并到目前的分支中(一般会把其他分支合并到master上面)
补充1:强制删除
补充2:快速提交
一个问题:为什么此时对dev的修改并没有让上面两个分支master和dev独立成两个分支(和下面一样),而是dev直接在master上面两者并列??
快进模式:当原本相同的两个分支中的一个出现改动时,并不代表两者一定要分裂出两个分支,因为改动的分支本质上可以取代并为改动的分支。因此在merge时会快进模式合并。
4.2 如何解决分支冲突
两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行这时就需要手动解决冲突,解决冲突步骤如下:
- 手动处理文件中的冲突
- 将解决完冲突的文件加入暂存区
- 提交到仓库中
4.3 不同分支的作用和使用原则
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
不同分支的作用和使用原则:
- master分支:主分支,对于中小型规模项目作为线上运行应用的唯一分支。
- develop分支:开发分支,是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
- feature分支:特征分支,从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支。
- hotfix分支:热修复分支,从master派生的分支般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。
5. Git的远程仓库
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。gitHub(地址:https://github.com/)是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名gitHub码云(也叫gitee)是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快。GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。
这里我们选用gitee作为我们的讲解对象
5.1 进入Gitee并新建仓库
1. 搜索Gitee官网:工作台 - Gitee.com
2. 点击+号,选择新建仓库
5.2 填入仓库基本信息
注意:下面的三个单选框一个都不要选,因为我们有仓库了,只要上传而不是在这里初始化
5.3 配置SSH公钥
5.3.1 生成SSH公钥
ssh-keygen -t rsa
然后不断回车,如果公钥已经存在则需要覆盖
5.3.2 查看SSH公钥
cat ~/.ssh/id_rsa.pub
5.3.2 在Gitee中配置SSH公钥
1. 头像-账号设置:
2. 左边栏-SSH公钥-复制进去:
5.3.3 验证与Gitee的SSH连接是否成功
ssh -T git@gitee.com
出现下面的图片则代表连接成功:
5.3.4 在Github中配置SSH公钥
1. 进入Settings设置:
2. 添加ssh key,把刚才复制的内容粘贴上去保存即可:
5.3.5 验证与Github的SSH连接是否成功
ssh -T git@github.com
显示如下信息表明设置成功
5.4 本地仓库连接远程仓库
1. 克隆下载-SSH-复制远程仓库的SSH连接地址:
2. 绑定本地仓库和远程仓库:
git remote add 远端名称 仓库路径
- 远程仓库名称业内一般叫:origin。
- 仓库地址就是上面复制的地址。
如上图,没有报错就是添加成功了~~
3. 查看远程仓库:
git remote
5.5 本地仓库推送到远程仓库
git push [-f] [--set-upstream] 远端名称 本地分支名
- []:中间为可选写入。
- -f:本地和远程仓库修改了同样的文件,则表示强制覆盖。
- --set-upstream:推送到远端仓库的同时建立和远端分支和本地分支的关联关系。
然后猫猫看到了下面的问题:
原因:本地仓库中是空的。因此,猫猫先后运行了git add. \ git commit -m "Init commit" 将文件夹中的文件转到本地仓库中
然后再运行:
git push origin master
到Gitee中看看情况:
确实是从本地仓库中git push到远程仓库中了
5.6 本地分支与远程分支的关联关系
git push --set-upstream origin master
将本地分支master和远程仓库的master分支建立关联,如下图:
然后查看关联关系:
绑定后即可直接用下面指令完成推送:
git push
5.7 远程仓库clone到本地仓库
如果已经有一个远端仓库,我们可以直接clone到本地,指令如下:
git clone 仓库路径 本地目录
注意:clone仅仅第一次使用项目时会用一次,不会每次都clone取获得最新的项目进度。
5.8 远程仓库抓取和拉取到本地仓库
抓取命令如下:
git fetch remote name branch name
- 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并
- 如果不指定远端名称和分支名,则抓取所有分支。
拉取命令如下:
git pull remote name branch name
- 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
- 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
5.9 远程仓库下解决合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。 A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要 推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支, 如下图所示:
简单来说:假设B修改代码的时候,A提交了远程仓库上的修改。他们又修改了同一个位置的代码,此时当B去pull的时候就会发生错误,因为冲突了无法更新。此时B就需要手动去确定冲突位置到底要以自己B的修改还是A的修改为准,最后B在决定后push推送给远程仓库。
6. 总结
SSH验证原理:
SSH登录安全性由非对称加密保证,产生密钥时,一次产生两个密钥,一个公钥,一个私钥,在git中一般命名为id_rsa.pub, id_rsa。那么如何使用生成的一个私钥一个公钥进行验证呢?
- 本地生成一个密钥对,其中公钥放到远程主机,私钥保存在本地
- 当本地主机需要登录远程主机时,本地主机向远程主机发送一个登录请求,远程收到消息后,随机生成一个字符串并用公钥加密,发回给本地。本地拿到该字符串,用存放在本地的私钥进行解密,再次发送到远程,远程比对该解密后的字符串与源字符串是否等同,如果等同则认证成功。
到这里猫猫来说一个实用的东西:
- 我们一台电脑中的一个用户一般使用一个SSH即可
- 那这个SSH的公钥给你的Github和Gitee,然后你这个用户就可以访问你的这两个账户
- 如果我们有其他的电脑,或其他的账户,此时他们也要生成自己的SSH。同时把这个SSH的公钥输入到你的Github和Gitee中,然后你的另外一台电脑也就可以连接上你的Github和Gitee账户啦
本文主要参考:黑马程序员的零基础入门Git同时加上了猫猫自己的理解和实践中出现的问题
推荐专栏💘:
各种软件安装与配置_十二月的猫的博客-优快云博客推荐文章💘:【一篇搞定配置】CLion安装配置与使用(含编译乱码、Build失败等问题的解决)(附破解方法)-优快云博客 【一篇搞定配置】MySQL安装与配置_mysql配置-优快云博客
【一篇搞定配置】小白安装labelimg常见问题及其原因(带知识点理解)_python labelimg 不好用-优快云博客