1 什么是 Git
Git 是一个免费、开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。
Git 最初是由 Linus Torvalds 设计开发的,用于管理 Linux 内核开发。
2 Git 配置
2.1 配置作用域
Git 管理文件系统主要分为三个层次
# config的三个作用域
# 缺省(留空)等同于local
git config --local # local 只对某个仓库有效
git config --global # global 对登录用户所有仓库有效
git config --system # system 对系统所有登录的用户有效,基本不用
# 常用配置方式
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'
# 如果你已经初始化过用户名和邮箱,现在想修改,那么使用下面的命令
git config --global --replace-all user.name "输入你的用户名"
git config --global --replace-all user.email "输入你的邮箱"
注:优先级 local > global > system,也就是说当对一个仓库同时设置了 global 和 local 那么采用 local 配置的信息。
2.2 查看配置信息
有时候我们也会查看 Git 配置信息等,使用如下命令可以查看相应层次的配置信息
# 显示 config 的配置 加--list
git config --list --local # 这个只能在 git 仓库中使用
git config --list --global
git config --list --system
2.3 清除配置信息
git config --unset --local user.name
git config --unset --global user.name
3 Git 初始化
3.1 注册账号
Git 在线代码托管的仓库平台,常用的有两种,一个是 GitHub,一个是 Gitee。
- GitHub 是全英文并且用户基数多,知名的库也多,在国内访问 Github 偶尔会有不稳定情况。
- Gitee 全是中文,而且大部分用户都是国人,优秀的库相对于 GitHub 也少,但Gitee不会出现不稳定情况。
国内用户选择 Gitee,注册登录账号。
-
登录后,点击右上角的➕号 -> 新建仓库
-
仓库信息补充完整。
- 仓库名称自定义,路径会自动根据仓库名称生成。
- 仓库权限私有与开源区别在于,仓库的大小(开源为1G,私有为500M)和协作人数(开源不限,私有限制 5 人以下)
-
新建仓库完成后,进入仓库,获取仓库地址。
- 点击克隆/下载,选择 HTTPS,然后点击复制。
3.2 Git 初始化
Git 有两种方式来进行初始化
-
git clone
你已经有一个远程的 Git 版本库,只需要在本地克隆一份
git clone <远程仓库地址>
-
git init 和 git remote
git init 命令进行初始化
git remote add 命令来增加一个远程服务器端
# cd 项目代码所在的文件夹 git init # 添加远程库地址 git remote add origin <远程仓库地址> # 修改远程地址 git remote set-url origin <远程仓库地址> # 删除远程地址 git remote rm origin
4 Git 基本命令
-
git add:将所有改动的文件(新增和有变动的)放在暂存区,由 git 进行管理。
git add readme.md # 将 readme.md 文件添加到暂存区 git add . # 将当前工作目录的所有文件添加到暂存区 git add -u # 把修改之后的文件(这些文件已经被管理起来了)一次性提交到暂存区
-
git commit:提交当前工作空间的修改内容,提交的时候必须用 -m 来输入一条提交信息。
git commit -m 'first commit' # -m 指定 commit 的信息 git commit # 这时候会跳出一个文本输入界面,让你输入更多的 commit 信息 # 修改代码提交信息 git commit --amend
-
git status:查看工作区和暂存区文件的状态
git status -- 红色:新增的文件/修改的文件 => git add . -- 绿色:已添加到暂存区 => git commit -m '描述信息'
-
git reset:从暂存区回撤
git reset HEAD -- 文件名 // 撤回特定文件 git reset HEAD -- . // 撤回暂存区所有的内容 # 回滚历史版本 git reset --hard 版本号 # 查看提交历史记录 git reflog # 回滚到指定记录 git reset --hard 版本号
-
git mv:将 git 管理的文件进行重命名
git mv readme readme.md # 使用git的方式对文件进行重命名
-
git rm:从 git 管理的文件删除某个已管理的文件,同时把修改的情况添加到暂存区
-
git log:查看历史日志
-
git pull:从版本库(既可以是远程的也可以是本地的)将代码更新到本地。
# 将 origin 这个版本库的代码更新到本地的 master 主分支 git pull origin master # 强制拉取没有关联的分支 git pull origin master --allow-unrelated-histories
-
git push:将本地 commit 的代码更新到远程版本库中
# 将本地的代码更新到名为 origin 的远程版本库中 git push origin master git push origin <分支名称> # 强制推送 git push origin master --force # 强制推送 git push origin HEAD --force
Git 的三个区域
Git 的 3 个区域,分别是工作目录、暂存区、版本历史。
为什么要有暂存区
为什么要有暂存区,通过工作目录直接提交到本地仓库不就OK了!那么暂存区存在有什么作用,存在的意义是什么?
每一个功能应该单独做成一次提交,这样可以保证提交历史的清晰。否则,当你想要回滚历史的时候,你会无所适从,根本分不清每个版本包含了哪些功能,修复了哪些 bug,而暂存区的作用就是为了,可以选择提交,比如你在开发 B 功能的时候,发现 A 功能还存在 Bug,这时候就需要先修复 A 中的 Bug,然后先提交修复的 A 中的 Bug,然后再提交 B 功能开发的文件。这样就可以提高提交版本历史记录的清晰,方便回滚。
5 Git 分支
分支就相当于一个独立的开发空间,比如前端和后端开发,前端开发可以建立一个分支,后端开发也可以建立一个分支,但是彼此在不同工作空间里面工作的时候是互不影响的,当需要集成的时候又可以把他们集成到一个公共的分支上面去。
-
git branch 查看分支情况、创建分支、删除分支
git branch -v # 查看本地分支的详细情况 git branch -a # 查看所有分支,包括远端分支,但没有过于详细的信息 git branch -av # 查看所有分支情况 # 创建一个新的分支,基于 hash_value 的这个 commit 创建一个新的分支,hash_value 可以省略,那么默认是基于当前分支的最后一个 commit 创建。 git branch branch_name hash_value # 删掉某个分支 git branch -d branch_name git branch -D branch_name # 这个分支已经有了一些 commit
-
git checkout 切换分支或者创建分支
# 切换分支 git checkout branch_name # 切换回主分支 git checkout master # 创建一个新的分支并切换过去 # git_id可以是hash_value,也可以是某个分支的名字(分支的名字其实就指向了某个 commit) git checkout -b branch_name git_id git checkout -b temp 9ef147d git checkout -b temp2 master # 创建空分支 git checkout --orphan branch_name # 清空目录 git rm -rf . git rm --cached -r . # 合并分支,将指定分支合并到当前分支,切换分支后再合并 git merge 分支名称 # 在合并改动之前,你可以使用如下命令预览差异: git diff <source_branch> <target_branch>
切换分支,必须在 .git 的同级目录下执行
6 Git FLow
在实际生产开发的过程中,如果每个人都随意的创建分支,随意的提交commit,必将导致整个 git 仓库非常的混乱,不易于团队协作。
Vincent Driessen 同学为了解决这个问题提出了A Successful Git Branching Model,最后形成了业内普遍采用的git 工作流程,大家都在约定的流程内使用 git,使得团队协作效率大大提高。
Git Flow 的常用分支
-
生产分支(master)
Master分支是仓库的主分支,这个分支包含最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改
-
补丁分支(hotfix)
当我们在生产环境发现新的Bug时候,我们需要基于master分支创建一个Hotfix分支,然后在Hotfix分支上修复bug,完成Hotfix后,我们要把hotfix分支合并回Master和Develop分支
-
发布分支(release)
当你需要发布一个新功能的时候,要基于Develop分支创建一个Release分支,在Release分支测试并修复bug,完成release后,把release合并到master和develop分支
-
开发分支(develop)
这个分支是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
-
功能分支(feature)
feature分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release
git flow 的具体使用细节
- 当我们新建git仓库之后,默认会创建一个主分支也就是master分支,由于master分支是用于发布生产环境,所有必须保证master上代码的稳定性,所以我们不能直接在master分支上修改提交。
- 我们要基于master分支创建一个develop分支,develop分支用于保存开发好的相对稳定的功能,master分支和develop分支是仓库的常驻分支,一直会保留在仓库中。
- 当新的开发任务来了之后,就要编写代码了,我们尽量不要在develop分支上写代码,要保证develop分支的相对稳定,所以这时我要就要基于develop 分支创建一个临时的开发分支,然后在开发分支上编写代码,等功能开发完之后我们再把开发分支合并到develop上。
- 新功能合并到develop分支之后,我们想把新功能发布到生产环境,首先基于develop分支创建release分支,然后在release分支测试完成之后,把release分别合并到master分支和develop分支。
- release分支合并到master分支之后,在master分支上打标签用于发布。
- 我们把代码发布到了生产环境,用户在使用的时候给我们反馈了一个bug,这时我们需要基于master分支创建一个hotfix 分支,用于修复bug,bug修好之后,把 hotfix 分支分别合并到master分支和develop分支。
分支的命名规范 + 大家约定俗成的东西
1. 主分支 - master
=> 创建 git 仓库的时候就会生成的
=> 不接受任何代码上传
=> 只接收 dev 分支合并的内容
=> 只存储每一个迭代版本中经过测试合格的版本
2. 主开发分支 - dev / developmen / deve
=> 初始化项目以后, 就会直接从 master 上开辟的分支
=> 不接受任何代码上传
=> 只接收 主功能分支 合并的内容
=> 存储再开发过程中的每一个阶段内容
3. 主功能分支 - feature-xxx
=> 直接从 dev 分支上开辟出来的分支
=> 进行各个功能的开发
=> 开发完毕以后吧代码合并到 dev 分支上
=> 接收文件上传
4. 功能 bug 解决分支 - feature-xxx-fix-xxx
=> 再项目运行过程中, 出现 bug 进行修复的分支
=> 都是从 功能分支 上开辟出来的
=> 修改完毕以后合并到 功能分支上
=> 再由功能分支合并到 dev 分支上
5. 紧急 bug 解决 - hot-fix-xxx
=> 直接从 master 上开辟
=> 进行紧急的 bug 修复
=> 修复完毕以后, 直接合并到 master 上
7 Git 相关文件
.gitignore
git 忽略文件:在我们开发过程中,如果有一些文件并不希望被git所管理,可以新建一个 .gitignore 文件,在里面书写你不希望 git 帮你管理得文件或者文件夹。
- 这个文件没有名字,只有后缀,window下如果不能直接创建,可以通过vscode
- 文件的位置必须与 .git 文件同级
readme.md
说明文件:对当前仓库内容得描述和说明解释。
上传到远端仓库时,readme 中的内容会按照 Markdown 的格式显示在仓库的首页。
8 练习作业
- 创建一个自己的 Git 远程仓库,并上传小米官网