Git
1.Git
- 分布式:取中心化,没有中央处理服务器,每个人的电脑都是完整的一个版本库,每个电脑都是独立连接的;
- 有能力高效管理类似Linux内核一样的超大规模项目(进度和速度)
2.Git与SVN
- 传统的SVN
SVN是集中式版本控制系统
版本库是集中放在中央服务器的,而开发人员工作的时候,用的都是自己电脑,所有首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。
- Git是分布式版本控制系统
Git是目前世界上最先进的分布式版本控制系统
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在联网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
3.Git下载和安装
下载连接:Git
选择对应的电脑型号进行下载
查看git版本
git --version
4.Git-工作流程
工作流程如下:
- 从远程仓库中克隆代码到本地仓库
- 从本地仓库中checkout代码然后进行代码修改
- 在提交前先将代码提交到暂存区
- 提交到本地仓库,本地仓库中保存修改的各个历史版本
- 修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
5.Git-命令(Mac为例)
仓库的主要作用就是:
- 记录版本的信息以及记录远程仓库的地址信息
获取git仓库通常有两种方式:
- 本地仓库
- 远程仓库克隆
本地仓库创建
- 首先在创建一个文件夹
- 在终端对应的路径下输入
git init
mac访达查看隐藏文件夹快捷键Command + Shift + .
- 点击查看.git文件
目录 | 描述 |
---|---|
config | 该文件主要记录针对该项目的一些配置信息,例如是否一bare方式初始化、remote的信息等,通过git remote add命令增加的远程分支的信息就保存在这里 |
objects | Git中的文件和一些操作都会以git对象来保存,git对象分为BLOB、tree和commit三种类型,例如git commit便是git中的commit对象,而各个版本之间是通过版本树来组织的,比如当前的HEAD会指向某个commit对象,而该commit对象又会指向几个BLOB对象或者tree对象 |
HEAD | 改文件指明了git branch(当前分支)的结果,比如当前分支是master,则该文件就会指向master,但是并不是存储一个master字符串,而是分支在refs中的白哦是,例如:ref:refs/heads/master |
idnex | 该文件保存了暂存区域的信息。该文件某种程度就是缓冲区(staging area),内容包括它指向的文件的时间戳、文件名、shal值等 |
Refs | 该文件夹指向数据(分支)的提交对象的指针 |
远程仓库克隆
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地
git clone 远程git仓库地址
Git-配置环境-配置开发者
设置用户信息(全局配置好了后续就不需要再配置,而局部每次都要配置)
#全局配置
git config --global user.name "名字"
git config --global user.email "邮箱"
#局部配置
git config user.name "名字"
git config user.email "邮箱"
只有局部配置,name和email才会在.git中config体现
然后添加到缓存区:
git add .
然后版本区:
git commit -m "init"
查看配置信息:
git config --list
git config user.name
git config user.email
总结:
- 全局配置对未来所有的git管理的项目都是用这个签名作为作者的名字和邮箱
- 局部配置的优先级高于全局配置
- 配置只会在本地仓库生效,远程仓库会自动使用远程的昵称
git add/commit 添加/提交命令
在对应的目录下创建txt文本,这里创建了2个txt
现在对修改a,删除b,新增d,使用git status
进行查看当前状态
然后将修改的部分放入缓存区git add .
(红色为修改部分工作区,绿色为缓存区部分)
形成版本git commit -m "修改a,删除b,新增d"
,形成版本
查看日志
git log
日志缩小版
git log --pretty=oneline
再缩小版
git log --oneline
Git checkout/reset 撤销修改
文件存在工作区
修改d文件的内容
文件存在缓存区
先回退版本
#HEAD^从上到下第一个^有几个就是几个,等价于HEAD~1
git reset HEAD^
git reset HEAD~1
git reset --hard "指定版本号"
总结:
- 撤销工作区修改,使用
git checkout --<file>
- 撤销暂存区修改,分两步
- 使用
git reset HEAD<file>
来撤销暂存区修改 - 使用
git checkout --<file>
来撤销工作区修改
- 使用
6.Git-.gitignore文件忽略
概述
一般我们总会有些文件无法纳入git的管理,也不希望它们总出现在未跟踪文件列表,通常都是自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore的文件(文件名固定不能更改),列出要忽略的文件模式,下面是一个实例。
bin/:忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略bin文件,但是git中不会存在空的文件夹,所有等价于/bin
/bin:忽略根目录下的bin文件
/*.c:忽略cat.c,不葫芦build/cat.c
debug/*.obj:忽略debug/io.obj,不忽略debug/common/io.obj和tools/debug/io.obj
**/foo:忽略/foo,a/foo,a/b/foo等
a/**/b:忽略/foo,a/x/b,a/x/y/b等
!/bin/run.sh:不忽略bin目录下的run.sh文件
*/log:忽略所有的.log文件
config.go:忽略当前路径的config.go文件
.gitignore规则不生效
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
解决方法就是先把本地缓存删除(改变成为track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m "updata .gitignore"
7.Git-添加远程仓库 git remote
(这里不再叙述如何创建gitee)(GitHub使用方式和gitee一致)
填好仓库名称,点击创建
得到这样的一个页面,回到之前在本地创建的文件,现在将之前的文件进行跟gitee仓库进行关联
git remote add origin 仓库地址
打开.git文件中config查看
然后进行下一步
git push origin master
我在这里按照git push origin master
之后报错src refspec master does not match any,解决办法为现在终端创建一个远程master
分支git checkout -b master
,然后再进行推送git push origin master
git checkout -b master
git push origin master
git branch
你也可以进行删除关联地址更换其他的
git remote rm origin 远程仓库地址
git remote add origin 新的仓库地址
克隆
在本地新建一个文件夹,然后终端进入该文件夹
在gitClone中的d.txt文件进行了新增
返回到gitee,就能查看到
现在需要在gitproject中同步gitClone更新的东西
然后在gitproject目录下进行终端操作git pull origin master
就类似于文件的 上传–中转–下载
8.Git-分支Branch
- 查看分支
- 创建分支
- 切换分支
- 推送至远程仓库分支
- 合并分支
- 删除分支
查看分支
列出所有本地分支
git branch
列出所有远程分支
git branch -r
列出所有本地分支和远程分支
git branch -a
创建分支
创建一个分支
git branch 分支名
切换分支
git checkout 分支名
创建分支并且切换分支
git checkout -b 分支名
推送至远程仓库分支
git push origin 分支名
合并分支
现在是master为主分支,v2.0位其他分支,现在要把v2.0合并到master,就
先切换到master分支下,然后写入以下指令
git merge v2.0
然后在master分支上,重新进行add/commit操作,最后在push
删除分支
先创建一个分支git branch v3.0
,然后push到仓库git push origin v3.0
,
目前仓库存在v3.0分支
先删掉本地仓库中的分支git branch -d v3.0
,然后再删掉远程仓库中的分支
git push origin --delete v3.0
9.Git分支的应用场景
工作场景如下:
开发某个网站
为实现某个新的需求,创建一个分支
在这个分支上开展工作
正如果在这个时候,突然有紧急事情需要修复,可以按照如下方法来处理:
切换到你的线上分支(production branch)
为这个紧急任务新建一个分支,并在其中修复它
在测试通过之后,切换回线上分支,然后合并这个修复分支,最后将改动推送到线上分支。
切换回你最初工作的分支上,继续工作。
10.Git-标签tag
标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
- 列出已有的标签
- 创建标签
- 将标签推送至远程仓库
- 检出标签
- 删除标签
列出已有的标签
#列出所有tag
git tag
#查看tag信息
git show [tag]
创建新标签命令
git tag [tagName]
将标签推送至远程仓库
git push origin tagName
删除本地tag
git tag -d tagName
删除远程tag
git push origin :refs/tags/[tagName]