Git的介绍
- Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与 Linux 命令全面兼容
-
Git的官网:https://git-scm.com/
-
Git的安装
-
本地库初始化(注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改):
-
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name xx(tomzhou)
git config user.email xx(tomzhou@qq.com)
-
信息保存位置:
./.git/config
文件
-
系统用户级别:登录当前操作系统的用户范围
git config --global user.name tomz
git config --global tomz@qq.com
-
信息保存位置:~/.gitconfig 文件
-
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
-
状态查看
git status
(查看工作区、暂存区状态):
-
添加
git add [file name]
(将工作区的 “新建/修改” 添加到暂存区):编辑vim good.txt,并保存(esc + :wq)
-
从暂存区中删除
git rm --cached [file name]
:
-
提交
git commit -m "commit message" [file name]
(将暂存区的内容提交到本地库):
-
修改并提交 也是
git commit -m "commit message" [file name]
(将暂存区的内容提交到本地库):
-
查看历史记录
git log
:多屏显示控制方式:空格向下翻页,b 向上翻页,q 退出
git log --pretty=oneline
git reflog
(HEAD@{移动到当前版本需要多少步})
-
前进后退:
基于索引值操作[推荐],
git reset --hard [局部索引值]
,如:git reset --hard a6ace91使用 ^ 符号:只能后退
git reset --hard HEAD^
(注:一个 ^ 表示后退一步,n 个表示后退 n 步)使用 ~ 符号:只能后退
git reset --hard HEAD~n
(注:表示后退 n 步)
分支的管理
-
什么是分支?
在版本控制过程中,使用多条线同时推进多个任务
-
分支的好处?
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
-
分支操作
创建分支:
git branch [分支名]
查看分支:
git branch -v
切换分支:
git checkout [分支名]
合并分支:第一步:切换到接受修改的分支(被合并,增加新内容)上,
git checkout [被合并分支名]
;第二步:执行 merge 命令,git merge [有新内容分支名]
冲突的表现如下:
冲突的解决:- 1,编辑文件,删除特殊符号
- 2,把文件修改到满意的程度,保存退出
- 3,
git add [文件名]
- 4,
git commit -m "日志信息"
- 注意:此时 commit 一定不能带具体文件名
Git 基本原理
- 哈希
-
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①,不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②,哈希算法确定,输入数据确定,输出数据能够保证不变
③,哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④,哈希算法不可逆
-
Git 底层采用的是 SHA-1 算法,Git 就是靠这种机制来从根本上保证数据完整性的。
GitHub
-
创建远程库地址别名
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
-
推送
git push [别名] [分支名]
-
克隆
git origin [远程地址]
完整的把远程库下载到本地,创建 origin 远程地址别名,初始化本地库 -
团队成员邀请
-
拉取
pull=fetch+merge
复杂的使用
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
比较简单的情况下用:
git pull [远程库地址别名] [远程分支名]
-
解决冲突
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取,拉取下来后如果进入冲突状态,则按照 “分支冲突解决” 操作解决即可。
-
跨团队协作
Fork
本地修改,然后推送到远程,Pull Request
SSH 登录
-
进入当前用户的家目录
cd ~
-
删除.ssh 目录
rm -rvf .ssh
-
运行命令生成.ssh 密钥目录
ssh-keygen -t rsa -C TommeyZ
[ 注意:这里-C 这个参数是大写的 C] -
进入.ssh 目录查看文件列表
cd .ssh
ls -lF
-
查看 id_rsa.pub 文件内容
cat id_rsa.pub
-
复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像——》Settings——》SSH and GPGkeys——》 New SSH Key,输入复制的密钥信息, 回到 Git bash 创建远程地址别名
git remote add origin_ssh git@github.com:TommeyZ/GitTest.git
-
执行上述命令可能会报错:
! [rejected] master -> master (fetch first) error: failed to push some refs to ' 。。。
出现这个问题是因为github中的README.md文件不在本地代码目录中,可以通过命令进行代码合并:git pull --rebase origin master
-
远程仓库的删除和重命名:
git remote rm [删除的名]
,git remote rename [旧名] [新名]
IDEA中使用Git
-
不需要提交的目录忽略:
在目录下找到.git(要是未找到点击隐藏的项目)——》info——》exclude,进行修改
-
将项目添加到暂存区,文件变成绿色:
-
将项目提交到本地库
- 点击历史记录,找到想要切换的版本,点击Copy Revision Number
- 分支的创建
- 合并分支
Git 工作流
-
集中式工作流:
像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到 Master 这个分支上。这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。
-
GitFlow 工作流:
Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
-
Forking 工作流:
Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。
-
主干分支
master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。
-
开发分支
develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
-
bug 修理分支
hotfix
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
-
准生产分支(预发布分支)
release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。
-
功能分支
feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。 开发完成后会合并到开发分支。