《大道至简Git》

一、Git 安装与配置

1. git 安装

 

2. Git 结构

  • ###  严格意义上讲: 本地库包含暂存区,为了方便理解拆分开来  ###

3.  Git 和代码托管中心

  • 代码托管中心的任务: 维护远程库
  • 局域网环境下:GitLab 服务器
  • 外网环境下: GitHub ( https://github.com/github ),码云 (https://gitee.com/

4. 本地库和远程库

团队内部协作:

  • 团队内部人员一般没有什么限制,主要是合并自己的代码提交就行,一般都是共用的同一个远程库

跨团队协作:

  • 一般来说团队外人员如果要开发其他功能,并不能直接去修改提交,安全性考虑,一般先克隆一份代码去修改,然后去请求提交审核代码,一般有审核人员,觉得没问题那就合并代码

 

5. 本地仓库初始化

①. 初次使用配置

  • 要对此目录进行git管理,第一步:git init 初始化

②. 设置签名

  • 区分不同开发人员的身份
  • 这里设置的签名和登录远程库(代码托管中心)的账号、 密码没有任何关系
     
  • 项目级别/仓库级别: 仅在当前本地库范围内有效
  • git config user.name yexiang588
  • git config user.email yexiang588@163.com
  • 信息保存位置: ./.git/config 文件

  • 系统用户级别: 登录当前操作系统的用户范围
  • git config --global user.name yexiang588
  • git config --global user.email yexiang588@163.com
  • 信息保存位置: ~/.gitconfig 文件

级别优先级:

  • 就近原则: 项目级别优先于系统用户级别, 二者都有时采用项目级别的签名
  • 如果只有系统用户级别的签名, 就以系统用户级别的签名为准
  • 二者都没有不允许
     

二、 基本操作

1. 状态查看

  • git status
  • 查看工作区、 暂存区状态

 

2. 添加

  • git add [file name]
  • 将工作区的“新建/修改” 添加到暂存区

 

3. 提交

  • git commit -m "commit message" [file name]
  • 将暂存区的内容提交到本地库

第一种方式: git commit

提交完后:

第二种方式: git commit -m  

  • 此方式就不进入第一种方式的页面中,比较方便

 

4. 查看历史记录

  • git log (完整的历史记录信息)

  • 历史记录很多情况下的多屏显示控制方式:
  • 空格向下翻页
  • b 向上翻页
  • q 退出

  • git log --pretty=oneline, 简化的显示记录

  • git log --oneline , 更加的简化显示 (一般来说,一长串的字符前几个就基本能够表示各个版本的记录)
  • 我这边偷偷的提交了一次,看到head 指向了 最新的版本

  • git reflog , 更更加简化显示
  • HEAD@{移动到当前版本需要多少步}

 

5. 版本的前进后退 (本地库)

  • 方便演示,我这边偷偷提交了很多次

①. 基于索引值操作[推荐]

  • git reset --hard [局部索引值]
  • git reset --hard e59a059

②. 使用^符号: 只能后退

  • git reset --hard HEAD^
  • 注: 一个^表示后退一步, n 个表示后退 n 步

③. 使用~符号: 只能后退

  • git reset --hard HEAD~n
  • 注: 表示后退 n 步

④. reset 命令的三个参数对比:

  • --hard 参数
  • 在本地库移动 HEAD 指针
  • 重置暂存区
  • 重置工作区
  • (本地库、暂存区、工作区一致)

 

  • --mixed 参数
  • 在本地库移动 HEAD 指针
  • 重置暂存区
  • (本地库和暂存区一致)

  • 演示流程和上面 --hard 一样,最后一步用 --mixed 看结果

 

  • --soft 参数
  • 仅仅在本地库移动 HEAD 指针
  • (暂存区、工作区一致)

 

6. 删除文件并找回

  • 前提: 删除前, 文件存在时的状态提交到了本地库
  • 操作: git reset --hard [指针位置]
  • 删除操作已经提交到本地库: 指针位置指向历史记录
  • 删除操作尚未提交到本地库: 指针位置使用 HEAD

### 没有提交到本地库情况下:

  • 如果你删除了文件,暂存区也不想要了,前面说过: git  rm --cached test.txt

  • 如果文件你不小心删除了工作区没有了,并且没有提交到本地库就没有备份,好在暂存区中有,恭喜你!暂存区可以看做一个临时备份方便恢复出来
  • git checkout -- file

### 提交到本地库情况下:

7. 比较文件差异

  • git diff [文件名]
  • 将工作区中的文件和暂存区进行比较

  • git diff [本地库中历史版本] [文件名]
  • 将工作区中的文件和本地库历史记录比较

  • git diff 
  • 不带文件名比较多个文件 (工作区和暂存区

 

8. 分支管理

  • 在版本控制过程中, 使用多条线同时推进多个任务

分支的好处?

  • 同时并行推进多个功能开发, 提高开发效率
  • 各个分支在开发过程中, 如果某一个分支开发失败, 不会对其他分支有任何影响。 失败的分支删除重新开始即可

①.查看分支

  • git branch -v

②. 创建分支

  • git branch [分支名]

③. 切换分支

  • git checkout [分支名]

④. 合并分支

  • 第一步: 切换到接受修改的分支(被合并, 增加新内容) 上,git checkout [被合并分支名]
  • 第二步: 执行 merge 命令,git merge [有新内容分支名]

⑤. 解决冲突

  • 大部分时间其实是有冲突的存在,不同人员修改同一个文件,大概率发生冲突,因为git毕竟也只是管理工具,也不是智能去分析该怎么合并
  • 上面的合并演示能成功那是因为git能简单分析单纯的增量或者减少,这类简单的基本还是能成功

冲突例如:

解决冲突:

  • 第一步: 编辑文件, 删除特殊符号
  • 第二步: 把文件修改到满意的程度, 保存退出
  • 第三步: git add [文件名]
  • 第四步: git commit -m "日志信息"
  • ### 注意: 此时 commit 一定不能带具体文件名 ###

 

三、 Git 基本原理

1. 哈希:

  • 哈希是一个系列的加密算法, 各个不同的哈希算法虽然加密强度不同, 但是有以下几个共同点:
  • ① 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
  • ② 哈希算法确定, 输入数据确定, 输出数据能够保证不变
  • ③ 哈希算法确定, 输入数据有变化, 输出数据一定有变化, 而且通常变化很大
  • ④ 哈希算法不可逆Git 底层采用的是 SHA-1 算法
  • 哈希算法可以被用来验证文件。 原理如下图所示:

  • Git 就是靠这种机制来从根本上保证数据完整性的

 

2. Git 保存版本的机制

  • Git 把数据看作是小型文件系统的一组快照。 每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。 为了高效, 如果文件没有修改,Git 不再重新存储该文件, 而是只保留一个链接指向之前存储的文件。 所以 Git 的工作方式可以称之为快照流

  • 对比集中式管理工具如SVN
  • 以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异,(随着时间会非常的大,也没有分布管理,缺点太大)

 

3. Git 文件管理机制细节

Git 的“提交对象”:

  • 可以看出,每个版本中的文件其实是各个文件的指针记录,并不是各个版本都有一份数据,这样节省了空间,并且链表形式也方便查询,高效的节省了时间

提交对象及其父对象形成的链条:

4. Git 分支管理机制

  • HEAD 永远指向当前分支版本
  • 假设当前分支在master分支,HEAD 指向 master, git branch testing 创建了一个 testing分支,但是没有切换,此时的HEAD还是指向master分支上

  • 现在进行了分支的切换,git checkout testing, 此时的HEAD 指向 testing

  • 假设在testing 分支上做了修改,并且提交到本地库中

  • 切换回 master分支

  • 假设master分支上也做了修改,提交到了本地库中

 

四、 GitHub 操作

  • GitHub 首页就是注册页面: https://github.com/
     

1. 创建远程库

 

2. 本地创建项目

 

3. 创建远程库地址别名

  • git remote -v 查看当前所有远程地址别名
  • git remote add [别名] [远程地址]

 

4. 推送

  • git push [别名] [分支名]

  • ### 到此为止,岳不群创建了一个本地项目和仓库,把本地项目上传到仓库中去了 ###

 

5. 克隆

  • git clone [远程地址] 
  • 完整的把远程库下载到本地

### 令狐冲想要学华山剑法,准备克隆一份岳不群的代码 ###

 

6. 团队成员邀请方式

 

  • 准备验证是否能用:

 


7. 拉取

  • pull = fetch+merge
  • git fetch [远程库地址别名] [远程分支名]
  • git merge [远程库地址别名/远程分支名]
  • git pull [远程库地址别名] [远程分支名] 

  • 如果出现 下列错误,说明你当前的本地仓库和远程仓库实际上是独立的两个仓库,不匹配导致的

  • 上面步骤是验证 fetch + merge, 下面验证 pull

 

8. 解决冲突

  • 如果不是基于 GitHub 远程库的最新版所做的修改, 不能推送, 必须先拉取
  • 拉取下来后如果进入冲突状态, 则按照“分支冲突解决” 操作解决即可

 

9. 跨团队协作

  • 假设现在岳不群武功遇到了瓶颈,请求东方不败指点迷津

第一步 :Fork

  • 东方不败先fork 一份 岳不群 仓库

 

第二步:东方不败clone 代码到本地,然后本地修改代码, 再推送到自己的远程huashan仓库

 

第三步: 东方不败修改后,告诉岳不群说,我帮你指点好了,进行 Pull Request

 

第四步: 岳不群审核代码,没问题就 进行合并

 

第五步:岳不群将合并后的远程库拉取到本地

 

10. SSH 登录

  • 进入当前用户的家目录

  • 删除.ssh 目录

  • 运行命令生成.ssh 密钥目录

  • 进入.ssh 目录查看文件列表

  • 查看 id_rsa.pub 文件内容

  • 复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys,New SSH Key,输入复制的密钥信息

  • 回到 Git bash 创建远程地址别名

  • 推送文件进行测试

 

五、Git 工作流

1. 集中式工作流

  • 像 SVN 一样, 集中式工作流以中央仓库作为项目所有修改的单点实体。 所有修改都提交到 Master 这个分支上
  • 这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到

2. GitFlow 工作流

  • Gitflow 工作流通过为功能开发、 发布准备和维护设立了独立的分支, 让发布迭代过程更流畅。 严格的分支模型也为大型项目提供了一些非常必要的结构

3. Forking 工作流

  • Forking 工作流是在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 更适合安全可靠地管理大团队的开发者, 而且能接受不信任贡献者的提交

4. GitFlow 工作流详解

主干分支 master

  • 主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致

开发分支 develop

  • 主要负责管理正在开发过程中的代码。 一般情况下应该是最新的代码

bug 修理分支 hotfix

  • 主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出, 修理完毕并测试上线后, 并回主干分支。 并回后, 视情况可以删除该分支

准生产分支(预发布分支) release

  • 较大的版本上线前, 会从开发分支中分出准生产分支, 进行最后阶段的集成测试。 该版本上线后, 会合并到主干分支。 生产环境运行一段阶段较稳定后可以视情况删除

功能分支 feature

  • 为了不影响较短周期的开发工作, 一般把中长期开发模块, 会从开发分支中独立出来。 开发完成后会合并到开发分支

GitFlow 工作流举例:

 

后续补充:

  • git update-git-for-windows 执行更新git命令,下载成功弹出安装程序界面

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值