1、Git概述
git的优势
分布式的版本控制
- 大部分操作在本地完成,不需要联网
- 保证完整性(使用hash)
git的区域概念
- 工作区:就是我们写代码的地方
- 暂存区:临时存储,可以撤回
- 本地库:将暂存区的文件提交
记录了历史提交的版本信息
- 远程库:将本地库中的文件push到远程库
2、Git的基本使用
2.1初始化本地库
命令
git init
演示
进入一个空的目录(D:\Desk\GitTest\Rep1),执行 git init
命令,然后会为当前这个目录生成一个隐藏的.git
文件夹,然后这个文件夹(D:\Desk\GitTest\Rep1)就被初始化为了一个`本地仓库
.git文件夹
里面存放的是本地库相关的子目录和文件,包括一些配置信息,版本信息等,不要随意的修改的删除
2.2设置签名
形式
用户名:xx
邮件地址:xxx@xx.com
作用:为了区分不同开发人员的身份信息
注意:这里设置的签名和你的远程仓库的账号和密码没有任何关系
命令
项目级别/仓库级别:仅在当前的本地库有效
项目级别的设置会将信息保存在初始化本地库时的 .git目录下的config文件中保存
git config user.username xxx
git config user.email xxx.@xx.com
系统级别的设置:登录当前操作系统的用户范围
系统级别的签名设置会将数据保存在 用户的家目录下(windows下 C:\Users\用户名)的 .gitconfig文件中
git config --global user.name xx
git config --global user.email xx@xx.com
级别优先级
- 就近原则:项目优先级大于系统的优先级,即二者都有时使用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 不允许二者都没有(不允许提交代码到远程仓库)
2.3添加/提交/查看状态
添加文件到暂存区
git add [fileName]或 .
将暂存区的文件撤回
git rm --cached [fileName]或.
将暂存区的文件提交到本地库
git commit -m "提交信息" [fileName]或.
查看状态
查看当前分支
工作区
暂存区
的状态
git status
当一个文件提交之后,对文件进行了修改,那么有两种方式可以再次提交
-
先add 后commit (正常步骤)
-
直接使用commit命令 带上
-a这个参数
git commit -am "提交的信息" [fileName]或.
2.4查看提交历史记录
可以查看所有提交的历史信息(按照提交时间排序)以及当前所在的提交版本
git log --显示详细的信息 显示所有版本
更简洁的命令
git log --pretty=oneline 只能显示当前版本及前版本
git log --online //只能显示当前版本及前版本
git reflog --详细显示了版本之间需要移动的次数 HEAD@{n} 显示所有版本
2.5版本切换
版本移动的本质
就是一个指针,名字就叫HEAD,切换版本时本质上就是指针的移动
实际操作
1、基于索引进行版本的切换
随意的切换版本
git reset --hard 版本的哈希索引值
2、使用^符号
只能往前退
git reset --hard HEAD^^ 几个^就回退几个版本
3、使用~符号
也是只能后退,对^的简便操作
git reset --hard HEAD~n 回退n个版本
2.6reset命令的三个参数对比
-
–soft
仅仅在本地库移动HEAD指针
-
–mixed
在本地库移动HEAD指针,重置暂存区
-
–hard
在本地库移动HEAD指针,并且重置暂存区和工作区
2.7删除文件的找回
提提:删除前 文件存在的状态commit到了本地库
git reset --hard [指针位置]
--如果删除操作已经提交到了本地库,指针位置指向文件存在的历史记录
--如果删除操作没有提交到本地库,指针位置使用HEAD(当前位置)
2.8文件的比较
git diff [filename] --将工作区的文件和暂存区的文件进行比较
git diff [本地库的历史版本] [filename] --将工作区中的文件和本地库历史记录进行比较
不带文件名 比较多个文件
3、分之管理
3.1分之的工作
3.2分之的好处
1、同时并行推进多个功能的开发,提高开发效率,各个功能开发完毕后,只需合并分之即可
2、各个分之在开发过程中,是相互独立的,如果某一分之开发失败,不会对其他分之有任何的影响,只需要删除失败的分之重新开始即可
3.3分之的基本操作
默认有的分之:master分之
注意:至少commit一次才能创建分之
查看当前所在分之
git status
查看所有分之(也可以查看当前所在分之,前面带*号)
git branch -v
创建分之
git barnch [name]
切换分之
git checkout [name]
删除分之
git branch -d [name]
3.4分之合并
1. git checkout [接受修改的分之name] //切换到被修改的分之(例如master)
2. git merge [有新内容的分之name]
3.5分之合并后的冲突问题
注意:git对于文件的管理是根据行的内容
,也就是说两个分之的同一个文件内容可以不一致,可以合并,
前提是 : 一个文件的同一行 两个分之不能都修改然后提交
分之冲突示例
由于两个分之同时修改了同一个文件的同一行
,并都做了提交操作,所以在合并分支的时候就出现了冲突
解决冲突
4、Git基本原理
4.1hash算法
Git底层采用的是SHA1
这种加密算法验证文件的完整性
4.2保存版本机制
快照机制
4.3分之管理原理
本质上就是指针的切换
5、远程操作&Github
5.1入门操作
- 1、本地初始化本地库(git init)
- 2、
创建远程库(注意:这种方式的推送一定不能点初始化,因为初始化操作也是一次提交,这样导致我们的本地库和远程库版本不一致,那么就无法push)
- 3、设置远程库的地址和名称
- 4、push到远程库
//显示远程库的列表
git remote -v
// 添加一个远程库地址 并为远程仓库起一个别名 一般都是origin
git remote add [name] http:xxxx
//推送到远程库
git push [远程库名] [分之名]
// git push origin master
5.2克隆远程库
//克隆远程库(将远程库的所有信息全部搂下来 包括内容+分之+提交历史记录)
git clone http://xxx
//指定tag版本克隆
git clone -b [tag] http://xxx
克隆做的事情
- 1、
完整
的把远程库下载到本地 - 2、自动设置远程库地址和别名
- 3、自动初始化本地库(git init)
5.3拉取
//将远程库中的某一分之的内容拉取下来并合并到本分之中
git pull origin master
//等于下面的两个操作
fetch + merge
//将远程库的内容抓取下来 (注意:此时抓取的远程库的内容没有合并到本地库)
git fetch [远程库地址别名] [远程库分支名]
//将拉取的远程库的内容合并到本地库
git megre [远程地址别名]/[远程库分之名]
5.4团队协作的冲突&push失败
如果不是基于远程库最新版本所做的修改,那么不能推送
,(类似于乐观锁原理,现在有一个远程库,然后多个本地库现在跟远程库的版本一致,然后某一个本地库进行了push操作,然后远程库的版本就发生了变化,现在其他的本地库就无法进行push操作了,因为不是基于最新版进行的push) 必须先进行拉取(pull)操作- 如果拉取下来后进入冲突状态,则按照
"3.5节分之合并后的冲突问题"
解决即可,然后就可以推送到远程库
6、标签tag
像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签
6.1基本使用
git有两种标签 轻量标签
和附注标签
//创建轻量标签 默认的就为当前的版本附带上了这个标签
git tag [name]
//创建附注标签 使用-a选项 后面-m标注一些信息
git tag -a [name] -m "一些信息"
//列出所有的标签
git tag
//显示标签信息与之对应的版本信息
git show [标签名]
//后期打标签 假设在 v1.2 时你忘记给项目打标签
git tag v1.2 9fceb02
6.2推送到远程
- 默认情况下,通过上面的创建标签命令创建出一个标签时,只能在本地有效,并且在进行将代码推送到远程时,标签的信息并不会一起推送到远程 ,你必须显式地推送标签到共享服务器上。
- 这个过程就像共享远程分支一样——你可以运行
git push origin <tagname>
。
git push origin [标签名]
推送多个标签
-
如果想要一次性推送很多标签,也可以使用带有
--tags
选项的git push
命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。 -
使用
git push <remote> --tags
推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。
git push origin --tags
6.3删除标签
//删除本地库的标签
//注意这个命令并不会从远程仓库中移除这个标签
git tag -d [name]
//删除远程库中的标签 (本地还有)
git push origin --delete <tagname>
。
git push origin [标签名]
推送多个标签
-
如果想要一次性推送很多标签,也可以使用带有
--tags
选项的git push
命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。 -
使用
git push <remote> --tags
推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。
git push origin --tags
6.3删除标签
//删除本地库的标签
//注意这个命令并不会从远程仓库中移除这个标签
git tag -d [name]
//删除远程库中的标签 (本地还有)
git push origin --delete <tagname>
7常见问题的解决方案
1.推送失败
说明远程库的版本已经变化,这时就需要使用git pull
命令拉取最新的代码,如果有冲突就解决,解决完就可以推送到远程库