git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。因此学习Git是很有必要的!
文章目录
- Git的优势
- Git的安装
- Git的结构
- 本地库和远程库
- 本地库初始化
- 设置签名
- 基本操作
- 分支管理
- Git基本原理
- 本地库和远程库的交互
- SSH免密登录
Git的优势
- 大部分操作本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与Linux命令全面兼容
Git的安装
想要使用这么一个工具我们必须要安装Git工具,网上已经有很多关于Git安装的详细步骤,这里推荐一篇写的很详细的Git安装的详细教程(基于Windows版本的)
Git的结构
本地库和远程库
为了更好更形象的描述本地库与远程库的关系,我借鉴了B站老师的金庸小说《笑傲江湖》谈Git来方便大家理解。
有一个经理叫岳不群,手下有一个程序员叫令狐冲。某一天岳不群创建了一个本地库,为了能把本地库托管到远程,因此岳不群在代码托管中心创建了一个远程库,但是远程库是没有内容的,因此岳不群通过千里传送将本地库的内容推送(push)到远程库。岳不群觉得的自己的领悟能力不够,练习不了辟邪剑法。于是决定把如何炼成辟邪剑法推送给令狐冲让令狐冲来完成。令狐冲作为大弟子谨遵师命,令狐冲从远程库克隆(clone)工程到自己的本地库,当然克隆的同时也顺带把自己的本地库给初始化好了。经过一番努力令狐冲终于参悟了这本武功秘籍,在自己本地库的基础上进行修改,写了详细的注意事项以后提交到本地库,然后再通过自己本地库提交到远程库,但是岳不群对令狐冲设有防线(远程库是岳不群创建的),因此令狐冲不能直接提交本地库到远程库,令狐冲需要通过push来加入团队。令狐冲提交完成以后,岳不群通过pull拉取令狐冲的远程修改到自己的本地,这样就能实现团队内的协助操作。
某一天,岳不群发现辟邪剑法不香了,想研究葵花宝典。于是语重心长对令狐冲说:“冲儿啊!为师最近喜得武功秘籍一部,鉴于你上次表现还不错,为师决定借你看看这本武功秘籍。过几天为师会来问你领悟到的精髓的”。令狐冲很开心的收下了宝典,通宵看了两夜也没有一点启发。想着过几天师傅就要检查了,这不行得想想办法。于是,令狐冲想到了日月神教的东方姑娘(东方不败)让东方不败来帮助自己参悟。令狐冲找到东方姑娘,表明了来意,东方姑娘怎么会拒绝呢?当然豪爽的就答应了!
岳不群和令狐冲有自己的本地库,同时岳不群也有自己的远程库。东方不败为了帮助令狐冲,她将岳不群的远程库复制(fork)了一份,生成了一个新的和岳不群的远程库内容相同的远程库,然后她将这个复制的远程库下载到本地(clone),经过大量的修改后,再将自己的本地库的内容上传(push)到自己复制的远程库。东方不败想着帮兄弟就要帮到底,随后她向岳不群的远程库发送了一个拉起(pull request)的请求,经过岳不群的审核通过后。发现原来如此,毫不犹豫的将东方不败提交的内容进行合并(merge)了。然后,令狐冲和岳不群就可以从岳不群创建的远程仓库中拉取(pull)东方不败提交的内容了。这样也就实现了团队外的协助操作了!
本地库初始化
- 进入一个空的文件夹目录,鼠标右键打开git bash
- 输入命令
git init
,会发现创建一个.git的隐藏文件 - 通过
ls -la
查看当前文件下是否生成的隐藏文件 - 通过命令
cd .git/
进入该隐藏的文件夹
注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要乱改动
设置签名
作用:通过用户名和Email地址来区别不同开发人员的身份。
辨析:这里设置的签名和登录远程库的(代码托管中心)的账号、密码没有任何关系。
命令:
项目级别/仓库级别:仅仅在当前本地库范围有效
git config user.name '用户名'
git config user.email '用户邮箱'
信息保存目录:.git/.config
系统用户级别:登录操作系统的用户范围
git config --global user.name '用户名'
git config --global user.email '用户邮箱'
信息保存目录:~/.gitconfig
级别优先级:就近原则
- 项目级别优于系统级别,两者都有时,采用项目级别签名
- 如果只有系统用户签名,就以系统用户签名为准
- 二者都没有不允许
基本操作
- 状态查看操作
git status#查看工作区、暂存区状态
- 添加操作
git add 'file name'#将工作区的 新建/修改 添加到转存区
- 提交操作
git commit -m "commit message"#将暂存区的内容提交到本地库
- 查看历史记录操作
git log#查看历史提交参数
git log --pretty==oneline#漂亮的显示历史记录
git log --oneline#更简洁的显示历史记录信息
git reflog#会提示回到之前的版本需要移动多少步指针
多屏幕显示方法:
空格:向下翻页
b:向上翻页
q:退出
- 前进后退
本质:移动HEAD指针
一、索引值法:
① 先查看记录对应的索引值
②在通过命令到相关的记录
git reset --hard '对应的索引值'
二、其它方法
git reset --hard HEAD^ #向后移动一步
git reset --hard HEAD^^ #向后移动两步
git reset --hard HEAD^^^ #向后移动三步
git reset --hard HEAD~1 #向后移动1步
git reset --hard HEAD~n #向后移动n步
使用 ^ 和~只能实现版本的后退,并且后退几步就有几个该符号(^)。通过以上比较发现还是索引值法比较方便
- reset命令的三个参数对比
参数 | 作用 |
---|---|
- -soft | 仅仅在本地库移动HEAD指针 |
- -mixed | 在本地库移动指针的同时重置缓存区 |
- - hard | 在本地库移动HEAD指针,同时重置暂存区和工作区 |
- 删除文件并找回
前提:删除前,文件存在时的状态提交到本地库
因为Git进行操作时只会增加版本,而不会删除任何一个版本。因为历史记录没有删除,所以只要本地库没有删除就是可以退回到之前版本的。依旧是通过命令git reset --hard '相关版本的索引值'
- 比较文件差异
git diff [文件名] #将工作区中的文件和暂存区进行比较
git diff [本地库历史版本][文件名]#将工作区的文件和本地历史记录进行比较
#不带文件名,可以比较当前工作区的所有文件
分支管理
- 分支概念
在版本控制中,使用多条线同时推进多个任务。
在初始化本地库之后,本身会创建一个master分支(主干),某一天突然想重新创建一个新的功能,但是不想在master分支上进行开发(不想对它造成污染)。我创建了一个新的feature_blue分支来进行开发,创建时是从master分支复制过来的。另外,我又想开发一个功能。因此,我又创建了另外一个分支(feature_game)。会发现每个分支都是彼此独立的,各自向前开发,如果不合并各个分支之间是不会有任何影响的。如果在开发过程中遇到了bug,那么就需要及时进行修复bug。这个时候就又需要创建另一个hot_fix修复分支。
- 分支操作
操作 | 命令 |
---|---|
创建分支 | git branch '分支名' |
查看分支 | git branch -v |
切换分支 | git checkout '分支名' |
合并分支 | ①使用git checkout [被合并分支名] 切换到接受修改的分支上②执行git merge [有新内容的分支名] |
分支冲突:
我在给master分支下创建提交了一个hello.py文件文件内容如下:
print('hello world')
print('hello python')
print('中国')edit by master
我在给git_fix分支下也修改了hello.py的内容如下:
print('hello world')
print('hello python')
print('中国')edit by git_fix1
但是当我将master分支合并到git_fix分支时会出现以下问题:
当我再打开hello.py文件时就发现了冲突的表现:
解决冲突:
① 编辑文件,删除特殊符号
② 把文件修改到自己满意的程度,保存退出
③ git add [文件名]
④ git commit -m ‘日志信息’
注意:使用git commit -m提交合并后的文件时,一定不能带具体的文件名
分支管理的本质是创建和移动指针
Git基本原理
- 哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定(16个字节)
②哈希算法确定,输入数据确定,输出数据能够保证不变
⑧哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git底层采用的是SHA-1算法
哈希算法可以被用来验证文件。原理如下图所示:
- Git版本数据管理机制
Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作-个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一“个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流。
本地库和远程库的交互
- 创建本地库
岳不群为了广大门楣,打开一个新的文件夹,给文件里创建了一个yuebuqun.txt的文件夹,文件夹内容如下:
壮大华山,称霸武林!
创建完成以后添加到暂存区,然后再提交到远程库
- 创建远程库
- 本地创建远程库别名
然后通过git remote -v命令查看 - 推送本地库到远程库
通过命令git push new_git master
推送本地库到远程库,需要输入github的账户和密码,然后点击Login,再进入远程库就看到了相关内容!
- 从远程库克隆项目
①完整的把远程库下载到本地
②创建new_git远程地址别名
③初始化本地库
命令:git clone [远程地址]
SSH免密登录
① 进入当前用户家目录 $ cd~
② 运用命令生成.shh密钥目录
$ ssh-keygen -t rsa -C ‘对应的邮箱’(注意:参数-C是大写的)
③进入.ssh目录查看文件列表
$ cd .ssh
$ ls -lF
④查看id_rsa.pub文件内容
$ cat id_rsa.pub
⑤复制id_rsa.pub文件内容,登录GitHub,点击头像——Settings——SHH and GPG keys
⑥New SHH Key
⑦输入复制的密钥信息
⑧回到Gitbash创建远程地址别名
git remote add new_git_ssh ‘对应的SSH链接’
不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论” “收藏”
三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那我祝你开心每一天,欢迎下次再来!