git深入学习笔记

git是一个版本控制工具,目前常用的版本控制工具有集中式版本控制工具代表SVN和分布式版本控制工具git

版本控制工具出现的原因,项目需要进行迭代,团队需要进行协作开发

版本控制工具跟普通文件管理系统的差距就是他不仅可以管理文件还可以对文件内容进行监控管理

版本控制工具的优势:

  1. 协同开发:允许多人对同一个文件进行修改,并保留各自的修改内容
  2. 数据备份:使用版本控制工具对文件进行一次提交和保存都会有历史记录,每个历史记录保留着当时的文件状态,提交者,提交时间,修改了什么内容
  3. 版本管理:不会允许提交重复的文件数据,SVN对文件内容采用的是增量式管理,而git采用的是文件快照(如果文件没有修改就会通过指针指向之前的文件,在该版本中只是保存了一个地址指向未修改的文件,修改后就会产生一个新的)的形式
  4. 权限控制:对团队中不同的人员进行权限分配,git还可以对团队外人员贡献的代码进行审核,SVN没有审核功能
  5. 分支管理

版本控制是一个思想,最早是从工程设计发明的,后来被计算机开发所借鉴,一个工程是不能一次性就设计完美,而是需要进行不断的修改迭代

git和svn的优劣势:svn只有一份文件存储在服务器上,开发人员需要从服务器下载到本地然后把自己的修改提交的服务器才能完成开发过程,是一个集中式的管理过程,而git是一个分布式的管理,服务器上依然有一份代码,开发人员也需要从服务器下载下来但是可以本地就完成开发任务,最后大家一起上传合并。这样就解决了一个问题,万一服务器挂了,使用git进行版本控制依然可以在本地完成开发,而svn就不能,这就是svn单点故障缺陷。git可以在本地就完成版本控制

git的历史

  1. git使用的是linux内核,早期linux是开源的内核,很多开发者都会对linux进行代码贡献,最早是由linux的创始人Linus 托马斯把这些代码进行手动合并,可是后代系统越来越庞大,一个人根本没有办法去完成这么大的工作量,急需一个版本控制工具来对这些贡献的代码进行合并,这个时候一家叫bitMove的公司出于人道主义精神提交了一个免费的版本控制工具给linux使用,但是要求不能进行破解,但是linux代码的贡献者都是社区大佬,不仅去破解了还被这个bitMove公司发现了,bitMove公司就把这个免费版本给收回了,不给用了,linus 托马斯没办法,版本控制工具用肯定是要使用的,于是就自己使用c语言自己开发了git
  2. 2008年github代码托管服务器上线了

git优势

  1. git不需要联网,在本地就可以进行版本控制,本地库拥有所有的版本提交历史
  2. 兼容linux命令
  3. 完整性保存,每次提交都有hash加密,每个的hash值都是不一样的
  4. 分支操作流畅

git版本控制工具区分

git本地库(自己pc上)和远程库(代码托管服务器上如github,码云,gitlab)进行交互场景

1.团队内部协作

2.跨团队协作

git命令行操作

  1. 在一个文件夹打开git bash
  2. 输入git init对本地库进行初始化
  3. 每个pc上都有git签名配置,配置用户名和邮箱,这个用户名和邮箱只是为了用来区分用户没有实际作用,跟登录github这些代码托管中心的账户无任何关系,git签名有全局配置和项目配置,优先级是就近原则,
    1. 项目配置命令:git config user.name "name"   git config user.email "[email protected]"
    2. 全局配置命令:git config --global user.name "name"   git config global user.email "[email protected]"
    3. 查看命令:git config --global user.name  git config --global user.email

git常用命令

  • git status

查看工作区和暂存区的状态,文件没有提交到暂存区git就不会进行追踪,在工作区会有丢失的风险,git命令提示一般会飘红

  • git add 文件名

把文件从工作区存入暂存区

  • git rm --cached 文件名

把文件从暂存区移出到工作区

  • git commit 文件名或者git commit -m "提交"

把暂存区的文件存到本地库

  • git help 某个命令

用来查看命令文档

  • git diff 文件名

用来比较文件修改的差异,比较的是工作区和暂存区某个文件进行比较

  • git diff 某个历史记录(可以是HEAD^也可以是历史记录的hash值) 文件名

用来比较文件修改的差异,比较的是工作区和某个版本的某个文件进行比较

  • git diff

用来比较文件修改的差异,比较的是工作区和暂存区的文件进行比较,不跟文件名参数,所有差异的文件都会列出

git的一些标识

  • HEAD

在版本控制过程中指向当前所在的版本

  • hash值

每一个版本都有一个独一无二的hash用指向该版本的一些信息,比如提交时间,提交者,提交时的备注

linux操作常识

  • vim是linux自带的文本编辑器,使用vim打开文件后,敲i键就可以进行编辑,按esc出现命令操作,w保存编辑的内容,q退出vim编辑器
  • linux多屏控制,空格向下翻页,b向上翻页,q退出

git版本前进后退,本质操作的是HEAD的指向,HEAD一般是指向当前版本

有3种方法

  1. 基于索引值操作(推荐):git reset --hard 索引值
  2. 用^只能后退,,一个^表示后退一个版本,按个数后退版本:git reset --hard HEAD^
  3. 用~也是只能后退用于解决后退多个版本:git reset --hard HEAD~3
  4. 备注:其实除了--hard还有其他几个参数比如soft和mixed他们的作用就是修改的重置的地方有区别比如工作区和暂存区,本地库之间的重置差异,推荐--hard

git找回删除的文件,提交到版本库后删除的文件找回

  1. 新增一个文件然后git add 和 git commit提交到本地库
  2. 然后删除文件,使用git add 和 git commit 把删除记录提交到本地库
  3. 这样就是完整的删除操作
  4. 找回原理就是把本地库的版本回退到之前的版本也就是操作HEAD指针
  5. 另一种场景就是我们提交到暂存区并没有提交到本地库,这个时候文件被删除想要找回,也是版本回退,回退到当前版本就行git reset --hard HEAD 利用的就是--hard参数的效果他会刷新本地库、暂存区、工作区
  6. 备注:因此需要找回一个文件的前提就是删除操作记录是否提交到本地库或者暂存区,找回原理就是依据的HEAD指针调整

git是以行为单位对我们的文件进行管理的

修改的每一个记录都会删除该行然后新增一行

git分支操作,及常用命令

  • 一个git仓库创建好了就会自带一个master分支,被称为主分支
  • 创建分支命令git branch 分支名
  • git branch -v查看当前所有的分支和个分支所在的本地库版本
  • 切换当前所在分支命令git checkout 分支名
  • 在哪个分支上新建一个分支就会把该分支所有内容添加到新创建的分支上,历史记录也会保持一致,一般开发一个新功能都会新建一个新的分支,开发完成之后把分支合并到之前的分支上,这样才是一个完整的开发过程
  • 合并分支的命令,把开发好功能的A分支合并到B分支上,操作步骤
  1. 切换到B分支上git checkout B
  2. 执行merge命令git merge A
  • git合并冲突解决
  1. 冲突产生原因:多个分支同时推进时修改了同一个文件的同一个位置,这个时候git就不知道听谁的修改,就会产生冲突 
  2. 冲突表现
  3. 解决冲突的步骤:打开冲突的文件,把文件修改到自己满意的程度,保存,使用git add 文件名提交到暂存区,然后使用git commit -m "提交日志" 提交到本地库,注意此处commit不需要文件名,比较特殊,这个commit其实就是你确认修改的解决冲突的标志告诉git程序你已经解决好了冲突

git基本原理解析-哈希

哈希是一种加密算法,种类比较多,比如MD5、SHA-1

git采用的是SHA-1

每一个commit版本都会有一个哈希值,这个哈希值是又多个文件的哈希值进行加密得到的,内部原理类型如下:首先对版本里面的所有的文件进行哈希加密得到一个哈希值,每个文件的哈希值是不一样的,如果文件没有发生修改改变,他的哈希值就会是之前的哈希值,不会再次进行加密而是引用之前得到的,然后把这些哈希值挂到一棵树上,然后把这棵树进行哈希得到每次的commit哈希值

哈希特征:

  1. 使用同一种哈希加密算法处理的数据得到的加密结果长度是一定的
  2. 同一个数据加密后的加密结果是一样的
  3. 不可逆(文件加密是不可逆的,字符串加密可逆)
  4. 加密应用场景:文件校验,文件下载会有丢失,通过加密算法加密校验可以检测出文件是否有差异

git分支管理机制

通过指针进行切换和管理,新建分支和所做的修改都是通过指针进行切换,这样比svn的复制一份数据快的多

git本地库和远程库交互

  1. 先在本地初始化一个本地库git init
  2. 新建一个txt文件vim test.txt
  3. 添加到暂存区git add test.txt
  4. 添加到本地库git commit -m "first commit"
  5. 创建远程库登录github创建一个远程仓库
  6. 在本地库创建一个远程库的别名地址,为什么要取一个别名呢?这个是为了解决不至于每次提交都带一窜很长的地址,创建远程库地址别名命令:git remote add origin github远程库的http地址
  7. 把本地库推送到远程库git push origin master
  8. 以上是个人开发,但是项目一般是团队多成员开发,如果其他人也想上传代码,那就需要加入团队,这样才会拥有权限,远程库如果是向所有人公开那么大家都可以读取下载,想要贡献代码才需要加入团队
  9. 把远程库克隆到本地的命令git clone 远程库的http地址
  10. 把远程库克隆到本地有3个效果:把远程库完整下载到本地,创建origin远程地址别名,初始化本地仓库
  11. 加入团队步骤:远程库创建者邀请成员账户加入,成员登录自己的账号同意加入,这样就可以进行push操作
  12. 拉取远程库代码命令:git pull origin master
  13. 一个成员推送了自己的代码其他的开发者需要拉去最新的代码来完成协作,拉去操作使用pull或者fetch操作,两者的差距就是fetch只会把远程库的代码下载到本地,本地库的代码不会变化,pull操作会把远程库的代码拉倒本地并进行merge合并操作,结论就是fetch + merge = pull
  14. fetch+merge适用场景就是当修改比较多时,你想先进行查看修改的地方然后觉得ok后在自己进行手动合并到本地库
  15. pull适用于修改比较少,对结果预料可控
  16. 如果推送者的本地库版本落后于远程库,远程库是不允许进行推送的,他会要求推送者拉取最新的版本,拉取的时候就可能产生冲突
  17. 团队协作冲突解决:如果两个开发者同时修改了同一行,就会拉取的时候就会产生冲突

git跨团队协作fork的使用

  • fork的作用就是可以复制一份别人的远程库给自己,复制好的这个远程库就是自己的远程库了,自己拥有push权限,贡献了代码就可以进行push
  • fork操作步骤,使用自己的账号打开别人远程库的地址点一下fork就可以了,fork好了之后我们的github上就会有一个属于我们自己的远程库,跟别人的远程库一模一样,然后就可以进行正常的git操作了,完成开发后进行本地提交然后推送到自己的远程库上
  • 推送到自己远程库,要合并到之前别人的远程库上就要发起一个pull request请求
  • 直接打开自己的github上的远程库然后点击pull request然后点击new pull request就可以看到自己所做的修改然后在点击create pull request然后填写标题(简要概括干了啥)还可以填写详情然后确认pull request
  • 发送pull request之后远程库最终拥有者在pull request里面就可以看到其他开发者发来的pull request然后进行代码审核,觉得OK就可以合并到自己的远程库了,审核过程如果不满意还可以进行回复对话询问,说白了就是两个开发者进行交流
  • 代码审核操作:在pull request中找到commit然后点击files changed
  • 代码审核好了之后觉得没有什么问题就点击conversation点击merge pull request
  • 合并好了就可以把代码拉取到本地完成跨团队协作

git的SSH登录 

在win10什么因为win10自带凭据管理,使用http进行代码提交他会保留github登陆者的账号和密码,但是在win7上或者其他操作系统上可能是没有这种密码账号保存功能的,那就需要每次都进行账号和密码登录,为了节省时间提高效率,还有一种SHH登录的方式

  • SSH登录原理就是公钥和私钥进行对比检查
  • 在本地电脑创建公钥和私钥的命令:ssh-keygen -t -rsa -C github或者代码托管服务器的邮箱账户
  • 然后一直回车就会创建完成然后走到创建好的公钥添加到github或者代码托管服务器的设置里面
  • 本地库进行操作就是创建一个基于SSH的远程地址别名git remote add origin_ssh 远程库的ssh地址
  • 推送命令就是git pull origin_ssh master

git工作流-git在工作中怎么使用

  1. 集中式工作流,就像svn一样,不使用分支的功能,纯粹的pull push clone,都是对master分支进行操作
  2. git-flow工作流(用的最多),把分支功能利用到了极致,通过赋值管理进行开发
  3. forking工作流,就是跨团队协作使用的方式,使用pull request

git-flow工作流介绍

  • 分支介绍
  1. master:线上现在的版本,一般是没有bug
  2. develop:开发主分支,用于新功能开发的主分支
  3. feature:某个功能的开发分支,基于develop开发分支创建,开发好了合并到develop分支
  4. release:预发测试分支,基于develop分支创建,用于上线时测试伙伴进行测试所用的分支
  5. hotfix:线上的版本出现了bug需要立马修复,就会基于master创建hotfix分支,在hotfix进行bug修复,修复完成合并回master
  • 实例
  1. 基于master创建hotfix分支
  2. 切换到hotfix在hotfix分支上进行操作
  3. 操作完成后git add 和git commit
  4. 然后切换到master分支,进行合并操作
  5. 如果出现冲突就解决冲突,如果没有就把本地库master分支推送到远程库

猜你喜欢

转载自blog.csdn.net/weixin_32682577/article/details/86773429