Git
一.Git简介
Git是目前世界上最先进的分布式版本控制系统。
1.关于版本控制
什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
2.关于分布式版本控制系统
在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
二.Git的本地仓库操作
工作区,暂存区,版本库三者之间的区别:
01.创建本地仓库
1.创建目录(也可以直接在本地以新建的方式创建)
$ mkdir 目录名
2.进入项目目录
$ cd 目录名
3.仓库初始化(即让Git知道需要他来管理这个目录)
$ git init
执行后,打开这个项目目录下,点击隐藏目录你会发现多了一个.git文件夹。不能删除,也不能随意更改。
到这里就可以在里面进行开发。
02.常用指令操作
1.查看当前工作状态:
$ git status
2.将工作区文件添加到缓存区:
$ git add
提交至版本库:
$ git commit -m "注释内容"
注意:必须添加注释内容,否则无法提交
4.修改
1.修改后,重新添加到暂存区后统一提交
2.查看修改(比较修改):
git diff:比较工作区与暂存区。
5.忽略文件
1.新建.gitignore配置文件,并在其中添加要忽略的文件或目录,每行表示一个忽略规则。
2.让Git识别该配置文件,例如:
$ git config cat.gitignore
6.移除暂存区文件
$ git rm
三.远程仓库操作
使用步骤:
1.Github线上仓库的创建
2.使用线上仓库
方式一:基于https协议:
1.克隆远程仓库到本地
1.创建空目录。
2.复制https对应得地址。
3.使用clone指令克隆线上仓库到本地
$ git clone 线上仓库地址
2.本地仓推送到远程仓库
指令:
提交到线上仓库的指令
$ git push //未指定库以及分支
$ git push origin master
注意:1)如果你提交成功后,其他人也往远程仓库提交了新的内容。再次使用时,你需要拉去线上的仓库的最新版本
使用命令:
$ git pull
2)如果是首次提交,首先应获取权限,因为不是任何人都可以往线上仓库提交内容。
获取权限:
修改".git/config 文件内容,url这一项中,在github.com前面加上:用户名:密码@
如:
url=https://用户名:密码@github.com/用户名/仓库名.git
方式二:基于ssh协议
该方式与前面https方式相比,只是影响github对于用户的身份鉴定方式,对于git的具体操作没有任何改变。
步骤:
1.生成客户端公私钥文件。
2.将公钥上传到Github。
1.克隆远程仓库到本地
1.创建空目录。
2.复制https对应得地址。
3.使用clone指令克隆线上仓库到本地。
$ git clone ssh地址
2.本地仓库推送到远程仓库
(与https基本一致)
注意:相比于https,ssh一旦配置好后,以后的项目就不需要一个个去配置用户名和密码了
3.冲突
1.产生冲突原因
产生:多个开发者同时使用或者操作git中的同一个文件,最后在依次提交commit和推送push的时候,第一个操作的是可以正常提交的,而之后的开发者想要执行pull(拉)和push(推)操作的时候,就会报冲突异常conflict。
解决:保留自己修改的数据,同时保留别人的数据信息;同时pull代码之前,需要手动解决冲突之后再作提交。
2.冲突解决
1.先pull远程仓库内容
2.根据提示手动修改文件
删去<<<<<<<<<<<<<<<<<HEAD 内容即可。
3.push至远程仓库
4.分支
1.分支的概念
Git 的分支,就是开发过程中,要选择的一条路,你可以选择和其他小伙伴一起走同一条路,也可以自己走一条路,路与路之间相互没有影响,作为路的主人,你也随时可以让两条路合并。
深入一点的话,是这么个概念:
Git 的分支,其实本质上仅仅是指向提交对象的可变指针,这个可变指针,指向路的终点。同时,还有一个比较特别的 HEAD 指针,用于记录当前工作的位置,借用上面的例子,这个 HEAD 指针等于在路上走的你自己,你在哪,指针就在哪,你在哪个分支,HEAD 指针就指向哪个分支的指针。
这里master就是git默认的分支
当我们新创建一个分支dev并使用它时,HEAD指针指向dev这个新的分支
2.创建分支
git branch name
需要注意是否在当前分支上创建分支
3.查看分支
三个命令,让你想看什么分支就看什么分支,就是这么方便
git branch //查看本地分支
git branch -r //查看远程分支
git branch -a //查看本地和远程的所有分支
4.分支的删除
git branch -d <name>
git branch -D <name> //强制删除
删除远程分支需要 push 操作。
git push origin :<name>
5.检出(切换)分支
1.已经存在的分支,现在要切换过去。
git checkout name
2.创建一个新分支,并切换到新分支,这个一步到位的话需要 -b 参数。
git checkout -b branch name
5.分支的合并
分支合并使用到的命令是
git merge branchname
但实际上分支的合并有两种方式:
-
Fast-Forward(快进式)
这种方式实际上只是移动了HEAD指针。
-
Recursive Strategy Merge(策略合并式)
使用这种方式合并,先要切换到想要保留的分支上,然后再将另一条分支合并。
这种方式可能会产生冲突。
5.回退
git reset
原理:修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
具体操作:
1.首先查看版本号,确定需要回到的时刻点
$ git log
$ git log --pretty=oneline // 简化了信息
$ git reflog//可以查看reset和已删除的commit记录
注意: 1. 输入git log指令并回车后,输入q退出
2.log提供了不同的搜索条件,比如按时间查找,按作者查找等等.....
2.回退操作:
$ git reset –-hard 版本号
$ git reset --hard HEAD^
( ^ 表示回到上一个版本,如果需要回退到上上个版本的话,将HEAD改成HEAD^, 以此类推。那如果要回退到前100个版本,这种方法肯定不方便,我们可以使用简便命令操作:git reset –-hard HEAD~100 );
$ git reset --soft HEAD^
执行之后版本回退到上一个版本,但是修改的内容保留
- 使用“git push -f”提交更改到远程库:
此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以我们要用“git push -f”强制推上去。
git revert
原理:“反做”某一个版本,以达到撤销该版本的修改的目的
具体操作:1.使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
(1)反做
$ git revert -n 版本号//该版本号是需要反做的版本
(2)提交
$ git commit -m 版本名
2.使用“git push”推上远程库。