Git之Git 命令行操作,Git 的基本原理
本地库操作
本地库初始化
命令:git init (在任意目录下 > 右键Git Bash Here > 用liunx命令到对应目录下 > 初始化)
效果:
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改
记录几个常见的命令
1. ll :查看当前目录下的文件
2. ll -la :查看当前目录下的文件(包括隐藏文件)
3. cd 目录名 + "/" :进入对应的文件内部
4. mkdir 文件夹名 :在当前目录下,创建新的文件夹
5. ll 目录名 + "/" :查看指定目录下的文件
6. cd .. :返回上一层目录
7. pwd :显示当前目录的全路径名
设置签名
形式
用户名:tom
Email 地址:goodMorning@atguigu.com
作用:区分不同的开发人员
辨析:这里设置的签名和登录远程库(代码托管中心的账号、密码没有任何关系)
使用命令如下:
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name tom_pro
git config user.email goodMorning_pro@atguigu.com
信息保存位置:./.git/config 文件
系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_glb
git config --global user.email goodMorning_glb@atguigu.com
文件保存位置:~/.gitconfig 文件
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
项目级别/仓库级别 用户信息展示
系统级别 用户信息展示
基本使用
状态查看
git status 查看当前仓库的状态
第1代表是那个分区的,第2是否提交,第三3有没有可提交的文件和提示
git status -uno后,查看当前仓库的状态 (不再显示未被追踪的文件)
使用vim 创建文件
1.vim good.txt
2.按下 i 进入编辑模式,输入文件内容
3.编辑结束 使用 esc 再按 : 进入指令列模式,输入保存并退出命令 wq ,按回车 结束文件编辑
注意:vim打开一个文件时,都会产生一个.swp的隐藏文件(即文件名.开头的),这个文件是一个临时交换文件,用来备份缓冲区中的内容,用于保存数据
工作区添加文件至暂存区
gid add (file.name) 例如:git add good.txt
将工作区中的"新建/修改" 添加到 暂存区
暂存区撤销文件
git rm --cached (file.name) 例如:git rm --cached good.txt
从暂存区撤回提交的文件
从暂存区提交到本地库
git commit -m "commit message"[file name]
其中deletions(-)表示删除 insertions(+)表示增加
git commit [file name]
在vim编辑器中 添加 "commit message",按 i 进入编辑模式,编辑结束使用esc : wq结束编辑
查看历史记录
git log:查看版本记录
多屏显示控制方式:空格向下翻页 ,b 向上翻页 ,q 退出(超过了自动多屏)
git log --pretty=oneline:每个历史只显示一行(hash值和日志)
git log --oneline:每个历史只显示一行且显示hash的部分值
git reflog:显示历史只显示一行,并且显示指针(要移动到版本多少步)
前进后退 本质:指针移动(HEAD)
基于索引值操作(推荐)
git reset --hard [索引值] 举例:$ git reset --hard 7264306
使用 ^ 符号:只能后退
git reset --hard HEAD^^ 说明:一个^表示后退一步,n 个^表示后退 n 步
使用 ~ 符号:只能后退
git reset --hard HEAD~n 说明:表示后退 n 步
reset 命令的三个参数
--soft:仅仅在本地库移动 HEAD 指针
--mixed:在本地库移动 HEAD 指针;重置暂存区
--hard:在本地库移动 HEAD 指针;重置暂存区;重置工作区
删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库
git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
比较文件差异
git diff [文件名]:将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]:将工作区中的文件和本地历史记录作比较
不带文件名 将比较多个文件
分支管理
什么是分支?
在版本控制过程中,使用多条线同时推进多个任务
分支的好处:
同时并行推进多个功能的开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支产生影响,失败的分支删除,重新开始即可
分支的操作
创建分支:git branch [分支名] 举例:git branch hot_fix
查看分支:git branch -v
切换分支:git checkout [分支名] 举例:git checkout hot_fix
合并分支:
1.切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名] 举例:git checkout master
2.执行merge命令(合并分支指令)
git merge [有新内容的分支] 举例:git merge hot_fix
解决冲突
冲突的原因:2个分支,修改同一文件,同一位置,修改内容不一样时,进行合并分支时,发生冲突
冲突的表现:文件中会出现 <<<<<<<<<< hhhhhhhhhh ========== 这样的标记
冲突的解决:
1.编辑文件,删除特殊符号
2.把文件修改到满意的程度,保存退出
3.git add [文件名]
4.git commit -m "日志信息" 注意:此时commit 一定不能带具体文件名
Git 的基本原理
哈希
情形:明文 -----> 加密算法 -----> 密文
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下的几个共同点:
1.不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
2.哈希算法确定,输入数据确定,输出数据能够保证不变
3.哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
4.哈希算法不可逆
Git 底层采用的是 SHA-1 算法
哈希算法可以被用来验证文件。原理如下图所示:(传输前后hash值对比)
Git 就是靠这种机制来从根本上保证数据完整性的
Git 保存版本的机制
集中式版本的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。SVN
Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
Git文件管理机制细节
Git 的“提交对象” (每个文件对应的hash值)
提交对象及其父对象形成的链条
分支管理机制
分支的创建
本质:新建一个指针指向当前版本
分支的切换
本质: HEAD指向不同的分支
HEAD指向testing时提交了内容
切换回 master分支
HEAD指向master时 提交了数据
参考链接
(尚硅谷) Git与GitHub基础全套完整版教程 直达链接