Git本地结构
-
工作区 – 写代码的区域
git add操作后代码会从工作区存储到暂存区
-
暂存区 – 打算提交而未提交的代码存放区(可提交可撤回)
git commit后代码会从暂存区提交到本地库
-
本地库 – 真实存在的历史版本
Git远程结构
-
远程库
- 远程库创建者git push操作后会将本地库的代码推送到远程库中
- git clone操作后会将远程库的代码拉取到本地库,并初始化本地库
- 远程库非创建者需要被邀请到远程库的团队中才能进行push操作
- git pull会将远程库的最新代码拉取到本地库
- 远程库操作有团队内协作、团队外协作。团队外的fork操作
Git本地库操作
本地库初始化
1. git init - 初始化一个空的本地库,生成.git文件目录
2. .git目录下存放的就是本地库相关的子目录和文件,不能随意删除、修改
3. 设置签名
作用:区分不同开发人员的身份
注意:这里设置的签名和登录远程库的账号、密码没有任何关系
作用域:
仓库级别:仅在当前本地库范围内生效(配置后在./git/config文件中)
git config user.name xxx
git config user.email xxxx@xxx.com
系统级别:登录当前操作系统的用户范围(配置后在C:/user/xxx/.gitconfig文件中)
git config --global user.name xxx
git config --global user.email xxxx@xxx.com
级别优先级:仓库级别优先与系统级别,二者都设置时采用仓库级别2的签名,二者都没有不允许
基本操作
1. git status -- 查看本地库状态
信息说明
On branch master -- 当前是在master分支。
No commits yet -- 还没有已commit提交的文件,即本地库中还没有文件。
Untracked files -- 未被追踪的文件,即还未提交到暂存区。
2. git add -- 从工作区提交到暂存区
操作:git add 指定文件名 OR .(. 代表工作区中所有的文件)
3. git commit -- 从暂存区提交到本地库(没有-m会进入vim编辑器进行写描述
操作:git commit -m "提交描述" 指定文件名 OR .(. 代表工作区中所有的文件)
查看历史记录(只要本地commit了就在历史记录中)
-
git log
1. commit部分为哈希索引 2. HEAD为指向当前版本的指针 3. 其他信息为作者、提交时间、提交描述
-
git log --pretty=oneline 查询当前HEAD指针所在位置之前的所有版本,不显示之后的版本
简化了部分其他信息
-
git log --oneline查询当前HEAD指针所在位置之前的所有版本,不显示之后的版本(区别:简化了索引,只使用前7位)
简化了部分其他信息,并且只取哈希索引的前7位
-
git reflog 查询本机从第一次clone到当前的时间的所有操作,不显示clone之前的操作(推荐)
HEAD@{移动到当前版本需要的步数}
-
前进和回退历史记录
-
基于哈希索引值操作(长短索引都可以,可前进可回退)
git reset --hard 哈希索引值
-
使用^符号(只可回退,一个 ^ 回退一个版本)
git reset --hard HEAD^^^ 表示回退三个版本
-
使用~符号(只可回退)
git reset --hard HEAD~3 表示回退3个版本
-
-
reset的三个参数比较
-
–soft(只是将本地库版本移动到HEAD指针处,此时相当于add之后commit之前,可用于回退commit,新的代码还在)
git reset --soft 索引值
-
–mixed(将本地库、暂存区的版本移动到HEAD指针处,此时相当于add之前,可用于回退commit,新的代码还在)
git reset --mixed 索引值
-
–hard (将本地库、暂存区、工作区的版本都移动到HEAD指针处,三者版本一致,新的代码不在了)
比较文件差异
-
git diff 文件名
将工作区中的文件和暂存区中对应的文件做比较
-
git diff HEAD 文件名
将工作区中的文件和本地库中对应的文件做比较
-
git diff HEAD^ 文件名
将工作区中的文件和本地库中对应文件的上一个版本做比较
-
git diff
不指定文件名是将工作区中的所有文件和暂存区中对应的文件做比较
分支管理
定义:在版本控制过程中,使用多条线同时推进多个任务
好处:1. 并行推进多任务;2. 每个分支之间相互独立,一个分支开发失败,并不影响其他分支。
-
查询当前分支
git branch -v
-
创建分支(复制主分支现有的版本)
git branch 分支名称
-
切换分支
git checkout 分支名称
-
将本地创建的分支推送到远程
git push origin 分支名称
-
合并分支
1. 必须切换到接受合并的分支上(将2分支合并到master主分支,需要切换到master分支) git checkout 分支名(master) 2. git merge 分支名(2分支)
-
解决合并冲突
1. 分支处显示merging表示有合并冲突 2. 将出现冲突的地方和冲突当事人商量后删除冲突标记(等号和箭头标识部分),并将内容进行合并 3. git add 文件名,将冲突解决后的文件提交暂存区 4. git commit -m "描述" 《注意:此处不能指定文件名进行commit,否则git直接报错》 5. 查看分支处的冲突标识是否消息
- 删除分支(修改分支名称)
1. 查看所有分支名称 git branch -r 2. 删除指定分支 git push origin -d 分支名
git 原理
hash算法
1. 常见种类:MD5、SHA1、CRC32 2. 共同特点 1. 不管输入数据的数据量有多大,采用同一个哈希算法加密,得到的结果长度固定。 2. 哈希算法相同,输入数据相同的情况,输出数据也始终是同一个 3. 哈希算法相同,输入数据有变化,输出数据肯定也不同 4. 哈希算法不可逆 3. 哈希算法验证文件传输过程是否有损坏的原理 1. 服务器端用哈希加密原始文件,得到密文 2. 文件传输后到达终端,用和服务器端同样的哈希算法加密,得到密文。 3. 比较两此密文的结果是否相同
-
git底层采用SHA1的哈希算法进行文件的验证
-
git文件管理机制细节
1. 每一个文件都会用哈希SHA1算法加密得到一个固定密文 2. 一次commit就生成一个tree树对象,指向当此提交的所有文件的哈希密文 3. tree树也会使用哈希算法加密成固定密文 4. 每一次commit的“提交对象”都会包含一个tree属性,其值就是tree哈希后的密文 5. 提交对象同样使用哈希加密,该对象生成的密文就是git log查看到的哈希值 6. 每一个提交对象都会有parent的父提交对象(即上一个版本),该属性指向其父提交对象的哈希密文
-
git分支本质
1. HEAD为当前选中分支 2. Gie创建分支不是像svn一样将所有文件重新复制一份,而是将分支1的指针指向版本3
-
GIt远程库操作
生成SSH密钥免密登录
1. cd ~
2. rm -rvf .ssh
3. ssh-kengen -t rsa -C git邮箱
C是大写的
4. cd .ssh
5. cat id_rsa.pub
6. 复制id_rsa文件内容,登录git,设置SSH keys中粘贴即可。
在本地创建远程库地址别名
作用:用别名代替http长连接地址
1. 查询远程库在本地的别名
git remote -v
2. 创建别名
git remote add origin(远程库地址别名) git远程仓库的https地址/SSH地址(推荐使用SSH免密)
3. 当origin(远程库别名)已经绑定https协议,需要更改为SSH。反之也可改
git remote set-url origin(远程库地址别名) git远程仓库的https地址/SSH地址
克隆远程库到本地库
git clone 远程库地址
1. 把远程库文件下载到本地
2. 给本地创建远程库地址的别名origin
3. 初始化本地库(有.git文件)
将远程分支clone到本地
git clone -b 远程分支名称 远程库地址
拉取远程库到本地库
1. 读取远程库文件,将更新部分下载到本地。此操作并不该表本地库的内容,需要进行合并。
git fetch origin(远程库地址别名) master(远程分支名)
2. 查看fetch到本地的远程master分支的更新内容
git checkout origin(远程库地址别名)/master(远程分支名)
3. 远程master合并到本地master
git merge origin(远程库地址别名)/master(远程分支名)
4. git pull = git fetch + git merge的操作
git pull origin(远程库地址别名) master(远程分支名)
本地库推送到远程库
1. git push 远程库地址别名 远程分支名
注意:推送需要加入团队后才能操作
git push冲突
1. push操作需要本地库处于远程库的最新版本下才能进行推送,否则报错。
2. 远程push冲突解决和合并分支冲突解决方式一样
git push将本地新建分支推送到远程仓库
1. 将本地新建的dev分支推送到远程仓库,远程仓库若没有该分支会创建新分支
git push 远程仓库别名 本地新建分支名
2. 也可将本地dev分支推送到远程仓库指定的其他分支
git push 远程仓库别名 本地新建分支名:远程仓库其他分支名