一、什么是 Git
1. 基本介绍
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持
2. Git 与 SVN 的区别
- 1、Git 是分布式的,而 SVN 不是。这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别
- 2、Git 把内容按元数据方式存储,而 SVN 是按文件。所有的资源控制系统都是把文件的元信息隐藏在一个类似
.svn
、.cvs
等的文件夹里 - 3、Git 分支和 SVN 的分支不同。分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录
- 4、Git 没有一个全局的版本号,而 SVN 有。目前为止这是与 SVN 相比 Git 缺少的最大的一个特征
- 5、Git 的内容完整性要优于 SVN。Git 的内容存储使用的是
SHA-1
哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
二、Git 安装配置
windows 安装:进入网站 https://git-scm.com/ 下载安装,然后在 cmd 命令行配置
# 创建 git 用户
> git config --global user.name "Felix"
> git config --global user.email "Felix@126.com"
# 检查信息是否写入
> git config --list
ubuntu 配置:apt-get install git
三、Git 基本概念
1. Git 工作流程
Git 的工作流程基本上分为工作区、暂存区和版本库
- 工作区:就是在电脑本地可以看到的目录
- 暂存区:一般存放在
.git
目录下的index
文件中,所以暂存区有时也叫作索引 - 版本库:工作区有一个隐藏目录
.git
,这个不算工作区,而是 Git 的版本库
2. 版本库间的通讯
3. Git 分支管理
四、Git 基础命令
1. 创建 Git 仓库
Git 使用 git init
命令来初始化一个 Git 仓库,由于 Git 很多命令都需要在 Git 仓库中运行, git init
很重要
在执行完成 git init
命令后,Git 仓库会生成一个 .git
目录,该目录包含了资源的所有数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn
目录,Git 只在仓库的根目录生成 .git
目录)
使用方法
- 使用当前目录作为 Git 仓库,我们只需使它初始化
git init
该命令执行完后会在当前目录生成一个 .git
目录,
- 使用我们指定目录作为 Git 仓库
git init 文件名
初始化后,会在该文件目录下会出现一个名为 .git
的目录,所有 Git 需要的数据和资源都存放在这个目录中
2. 设置用户
使用 Git 的时候也需要创建用户,其中用户也分为全局用户和局部用户
- 全局用户
git config --global user.name '用户名'
git config --global user.email '用户邮箱'
# 注:在全局文件 C:Users用户文件夹.gitconfig 下新建用户信息,可以在所有仓库都可以使用
- 局部用户
git config user.name '用户名'
git config user.email '用户邮箱'
# 注:在当前仓库下的 config 新建用户信息,只能在当前仓库下使用
# 注:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
3. 查看仓库状态
当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
# 查看仓库状态
git status
# 查看仓库状态的简约显示
git status -s
4. 工作区操作
在工作区中通过任何方式完成的文件删与改都会被 Git 记录,而空文件夹不会被 Git 记录
- 撤销工作区操作
# 撤销所有暂存区的提交
git checkout
# 撤销某一文件的暂存区提交
git checkout 文件名
- 工作区内容提交到暂存区
# 添加指定文件
git add 文件名
# 添加项目中所有文件
git add .
- 撤销暂存区提交:add 的逆运算
# 撤销所有暂存区的提交
git reset HEAD
# 撤销某一文件的暂存区提交
git reset 文件名
# 撤销所有暂存区的提价
git reset .
- 提交暂存区内容到版本库
git commit -m "版本描述信息"
- 撤销版本库提交:commit 的逆运算
# 查看历史版本
git log
git reflog
# 查看时间点之前的或者之后的日志
git log --after 2020-07-21
git log --before 2020-07-21
git reflog --after 2020-07-21
git reflog --before 2020-07-21
# 查看指定开发者日志
git log --author 作者名字
git reflog --author 作者名字
# 回滚到指定版本
# 回滚到上一版本
git reset --hard HEAD^
git reset --hard HEAD~
# 回滚到上三个版本
git reset --hard HEAD^^^
git reset --hard HEAD~3
# 回滚到指定版本号的版本
git reset --hard 版本号
五、过滤文件
在日常开发中总有几个文件不需要被管理,那么如何让 Git 不管理这些文件呢?需要创建 .gitignore
文件
# 1) 在仓库根目录下创建该文件
# 2) 文件与文件夹均可以被过滤
# 3) 文件过滤语法
那如何定义这些被过滤的文件呢?
# 文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
# /文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
a.txt:项目中所有 a.txt 文件和文件夹都会被过滤
/a.txt:项目中只有根目录下 a.txt 文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的 b 文件夹下的 a.txt 文件和文件夹会被过滤
*x*:名字中有一个 x 的都会被过滤(* 代表 0~n 个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
六、多分支开发
1. 分支操作
在实际项目中,一个项目需要多人一起协同开发,这就涉及到了多分支开发的概念
指令 | 详解 |
---|---|
git branch 分支名 |
创建分支 |
git branch |
查看分支 |
git checkout 分支名 |
切换分支 |
git checkout -b 分支名 |
创建并切换到分支 |
git branch -d 分支名 |
删除分支 |
git branch -a |
查看远程分支 |
git merge 分支名 |
合并分支 |
# 1)多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫 dev(协同开发)
# 2)如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的 dev 分支开发,可以依赖 dev 开一个子分支,进行开发,开发完毕后合并到 dev 分支,再删除该分支即可
# 3)所有的开发任务都可以在 dev 分支上进行(除非公司硬性要求不能直接在 dev 分支开发,只能在 dev 子分支开发,测试通过后才能合并给 dev)
2. 远程 Git 开发
既然要进行多分支开发,当然也需要远程仓库的存在,所以就有一些人搭建了仓库,常见的远程仓库有 GitHub、Gitee 以及公司自己搭建的 GitLab
1) 两种本地与远程仓库同步
"""
1)作为项目仓库初始化人员:
线上要创建空仓库 => 本地初始化好仓库 => 建立 remote 链接(remote add) => 提交本地仓库到远程(push)
2)作为项目后期开发人员:
远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发
"""
2) remote 源操作
"""
1)查看仓库已配置的远程源
>: git remote
>: git remote -v
2)查看remote命令帮助文档
>: git remote -h
3)删除远程源
>: git remote remove 源名
eg: git remote remove origin
4)添加远程源
>: git remote add 源名 源地址
>: git remote add orgin git@gitee.com:doctor_owen/luffyapi.git
5)提交代码到远程源
>: git push 源码 分支名
6)克隆远程源
>: git clone 远程源地址
"""
"""
1)通过克隆方式连接远程源,默认远程源名就叫 origin;所以主动添加远程源来连接远程仓库,源码也用 origin
2)本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫 origin 了,比如 online 都可以
3)pull 和 push 都可以提供选择不同的源码,和不同的远程仓库交互
"""
3. 采用 SSH 协议连接远程源
1) 创建电脑的公钥和私钥
# 官网:https://gitee.com/help/articles/4181#article-header0
# 本机命令,生成公钥:ssh-keygen -t rsa -C "*@*.com",邮箱可以任意填写
# 本机命令,查看公钥:cat ~/.ssh/id_rsa.pub
# 码云线上添加公钥:项目仓库 => 管理 => 部署公钥管理 => 添加公钥 => 添加个人公钥
2) 提交本地代码到远程仓库
# 命令
git push origin master
3)拓展
A. 如何成为其他码云项目的开发者
"""
1)生成自己电脑的公钥,配置到自己的码云个人公钥中
2)把自己的码云用户名提供给别人,别人添加你成为项目开发者
3)自己确认添加,成为开发者,克隆开发项目,进行开发
"""
B. 如何成为公司自建 Git 服务器的开发者
"""
1)生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
2)项目管理者添加你公钥,加入开发者,提供给你项目克隆地址
3)克隆开发项目,进行开发
"""
4. 协同开发
"""
1)作为开发者,第一次同步项目(前台已经是项目开发者了)
git clone 项目地址
2)保证自己本地有 dev 分支,且与远程仓库版本同步(没有就自己新建)
3)本地开发的代码,必须 add、commit 到本地版本库后,才和远程仓库进行交互
4)交互顺序:必须 先拉(pull)后提(push)
5)必须切换到要交互的分支,在与远程同名的分支进行交互,如本地 dev 与远程 dev 交互
git checkout dev
git add .
git commit -m '本次提交的信息提示'
git pull origin dev
git push origin dev
"""
5. 冲突解决
"""
1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
3)将解决冲突后的代码重新提交到本地版本库
4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程
"""
"""
<<<<<<< HEAD # 冲突的开始
# 自己的代码
======= # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50 # 冲突的结束(版本)
"""
"""
1)删除冲突相关标识:冲突的开始、分割线、冲突的结束(版本)
2)线下沟通,根据实际需求完成代码整合
3)测试整合后的代码
"""
"""
出现冲突的前提:
1)不同开发者同时操作了同一文件
2)并且在相同行写了代码
强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
"""
6. 线上分支合并
7. 远程仓库回滚
"""
用dev分支举例
1)本地切换到远程要回滚的分支对应的本地分支
git checkout dev
2)回滚本地分支
git reset --hard 版本号
3)本地版本强行提交给服务器
git push origin dev -f
"""