Git————自学git
这里写目录标题
一个网站练习git的网站:https://codechina_dev.gitcode.host/learn-git-branching/?locale=zh_CN
1.版本控制工具应该具有功能
-
协同修改
多个人能够不重读的修改同一个文件
-
数据备份
不仅保存目录和文件的当前状态,还能保存每个提交过的历史状态 -
版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面 SVN采用的是增量式管理的方式,而 Git采取了文件系统快照的方式。
在电脑系统中,快照(英语:snapshot)是整个系统在某个时间点上的状态。这个名词是由摄影中借用而来。它储存了系统映象(System image),让电脑系统在出现问题时,可以快速恢复到未出问题前的状况。
-
权限控制
对团队中参与开发的人员进行权限控制。
对团队外开发者贡献的代码进行审核——Git独有。
-
历史记录
查看修改人、修改时间、修改内容、日志信息。
将本地文件恢复到某一个历史状态。
-
分支管理
允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效
2.版本控制简介
- 版本控制是一种记录一个或若干个内容变化,以便将来查阅特定版本修订情况的系统。实际上,我们可以对任何类型的文件进行版本控制
- 版本控制系统发展可以分为本地版本控制系统,集中式版本控制系统以及分布式版本控制系统三个节点
git的诞生
Linux系统发展了十多年,代码库发展的很大,大到Linux本人很难继续通过手工方式管理了,整个项目组开始用一个分布式系统来管理维护——bitkeeper,但是bitkeeper的东家发现社区试图破解bitkeeper的协议,于是收回了其免费试用权,所以情况迫切的要求有一个新的系统能够改变这种现象
对此他们有以下的目标
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
于是,Linux花费了两个州写了一个分布式版本控制系统的初级版本,后以极短的时间Linux系统的源码由git进行管理了。
3. git简介
Git 的优势
** 大部分操作在本地完成,不需要联网**
** 完整性保证**
** 尽可能添加数据而不是删除或修改数据**
** 分支操作非常快捷流畅**
** 与 Linux 命令全面兼容**
4. Git 命令行操作
git命令和linux系统关系非常大,所以很多命令相同相似,所以要对linux系统有一定的了解
本地库初始化
初始化命令:git init
**效果:**在相应的目录中可以创建一个Git仓库,同时产生一个.git文件,点文件是linux系统的隐藏文件。所以ll不能显示出来通过ls-la或ls -a可以看到隐藏文件
.git 目录中存放的是本地库的子目录和文件,不要轻易删除或修改信息
设置签名
形式:
eg:用户名:tom
email地址:xxxx@xxxx
作用:区分不同开发人员的身份
辨析:签名和远程的路的账号和密码没有任何关系
命令:设置级别
- 项目级别、仓库级别: 仅仅在当前本地库范围内有效
-
- git config user.name xx - git config user.email xxx@xxx
-
信息保存位置 ./.git/config文件中
- 系统用户级别:登录当前操作系统的用户范围
git config --global user.name xxx
git config --global xxxx@xxxx
- 信息保存位置:~/.gitconfig 文件
- 级别优先级
- 就近原则:项目优先级优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有是不允许的
基本操作
状态查看命令 :git status
查看工作区,暂存区状态
添加命令:git add [file name]
将工作区的新建的 "新建/修改"添加到暂存区
撤销缓存区文件命令:git rm --cached
将刚提交的到缓存区的文件撤销掉
提交命令:git commit -m “commit message” [file name]
将工作区的内容提交到本地库
查看历史记录命令:git log
多屏显示控制方式:
空格向下翻页
b 向上翻页
q 退出
命令:git log --pretty=oneline
简短命令,以一行显示
命令:git log --oneline
简短命令,哈希值只显示一部分
命令:git reflog
简短命令,head指针需要移动的次数
HEAD@{移动到当前版本需要多少步}
前进后退
本质:就是指针的移动
基于索引值操作[推荐]
git reset --hard [局部索引值/索引值]
使用^符号:只能后退
git reset --hard HEAD^
注:一个^表示后退一步,n 个表示后退 n 步
使用~符号:只能后退
git reset --hard HEAD~n
注:表示后退 n 步
reset 命令的三个参数对比
–soft参数
仅仅在本地库移动HEAD指针
–mixed参数
在本地库移动HEAD指针
重置暂存区
–head参数
在本地库移动HEAD指针
重置暂存区
重置工作区
删除文件并找回
前提:删除前,文件存在时的状态提交到本地库
操作:git reset --hard[指针位置]
- 删除操作已经提交到本地库:指针位置只想历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
比较文件差异
git diff[文件名]
- 将工作区的文件和暂存区的文件进行比较
git diff [本地库中历史版本] [文件名]
- 将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
分支管理
什么是分支?
在版本控制过程中,使用多条线同时推进多个任务
分支的好处?
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不贵对其他分支有任何影响。失败的分支删除重新开始即可
分支操作
- 创建分支
git branch[分支名]
- 查看分支
git branch -v
- 切换分支
git checkout [分支名]
- 合并分支
-
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
-
第二部:执行merge命令
git merge [有新内容分支名]
解决冲突
- 解决冲突
- 第一步:编辑文件,删除特殊符号
- 第二步:把文件修改到满意的程度,保存退出
- 第三步:git add [文件名]
- 第四步:git commit -m “日志信息”
- 注意:此时commit 一定不能带具体文件名
5.git基本原理
哈希:
明文——>加密算法——>密文
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆 Git 底层采用的是 SHA-1 算法。
Git 就是靠这种机制来从根本上保证数据完整性的。
Git保存版本机制
集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的工作方式可以称之为快照流。
Git文件管理机制细节
git的提交对象
提交对象及父对象形成的链条
Git分支管理机制
分支创建
分支的切换
6 Github
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git
作为唯一的版本库格式进行托管,故名GitHub。简单来说,GitHub是一个代码托管云服务网站,帮助开发者存储和管理其项目源代码,且能够追踪、记录并控制用户对其代码的修改。
gitee 可以理解是github国内版,但审查要素过多,好用程度远远不如github好用。
账号信息
创建远程库
首先注册页面:github.com
略
找到+,new repository,在Repository name 这里输入仓库名 ,根据自己的自己或项目的需求,最后create repository
创建远程库地址别名
git remote -v 查看当前远程地址别名
git remote add [别名] [远程地址]
推送
git push [别名] [分支名]
克隆
git [别名] [远程地址]
- 效果
- 完整的把远程库下载到本地
- 创建origin远程地址别名
- 初始化本地库
团队成员邀请
拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
解决冲突
-
要点
-
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
-
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
-
跨团队协作
Fork
本地修改,然后推送到远程
Pull Reques
审核代码
合并代码
将远程库修改拉取到本地
ssh登录
进入当前用户的家目录
$ cd ~
删除.ssh 目录
$ rm -rvf .ssh
运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C xxx@xxxx
[注意:这里-C 这个参数是大写的 C]
进入.ssh 目录查看文件列表
$ cd .ssh
$ ls -lF
查看 id_rsa.pub 文件内容
$ cat id_rsa.pub
复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPGkeys New SSH Key
输入复制的密钥信息
回到 Git bash 创建远程地址别名
git remote add origin_ssh /*ssh地址*/
推送文件进行测试