Git&GitHub
Git&GitHub
一、Git结构
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地库)
- Remote:远程仓库
二、Git 命令行操作
2.1 本地库初始化
git init
效果:初始化本地库,在目录中创建一个.git文件
注意: .git目录中存放的是本地库相关的子目录和文件,不要删除,也不用轻易修改
2.2 设置签名
形式:
- name:Yan
- email:rocyan98@gmail.com
作用: 区分不同开发人员的身份
注意:这里设置的签名和登陆远程仓库(github)的账号密码没有关系
命令:
# 项目级别/仓库级别:仅在当前本地仓库范围内有效
git config user.name Yan
git config user.email rocyan98@gmail.com
# 信息保存的位置 ./.git/config 文件中
# 系统用户级别:登陆当前操作系统的用户范围
git config --global user.name Yan
git config --global user.email rocyan98@gmail.com
# 信息保存的位置:~/.gitconfi文件
# 查看当前Git配置信息
git config --list / git config -l
# 编辑Git配置文件
git config -e [--global]
级别优先级:
- 就近原则:项目级别优先于系统用户级别,二者都有时,采用项目级别的签名
- 不允许没有签名
2.3 基本操作
2.3.1 状态查看
# 查看工作区、暂存区状态
git status
共有三种状态:
- Untracked files 红色 未追踪的文件,工作区新建文件,但是没有提交到暂存区
- Changes not staged for commit 红色 工作区内的文件有更新,但是没有提交到暂存区
- Changes to be committed 绿色 改变的内容提交到暂存区
- working tree clean 暂存区的内容都已经提交到本地库
- Untracked files 红色 未追踪的文件,工作区新建文件,但是没有提交到暂存区
2.3.2 添加/删除/恢复文件
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区(配合.gitignore,即删除远程仓库但不删除本地)
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复某个 commit 的指定文件到暂存区和工作区
git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
git checkout .
2.3.3 提交
# 提交暂存区到本地库
git commit -m [message]
# 提交暂存区的指定文件到本地库
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次 commit 之后的变化,直接到本地库
git commit -am [message]
# 提交时显示所有 diff 信息
git commit -v
# 使用一次新的 commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次 commit 的提交信息
git commit --amend -m [message]
# 重做上一次 commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...
2.3.4 查看历史记录
- 方法一:
git log
- 多屏显示控制方式:空格向下翻页、b 向上翻页、 q 退出
方法二:
git log --pretty=oneline
方法三:
git log --oneline
方法四:
git reflog
- HEAD@
2.3.5 版本前进后退
- 基于索引值操作(推荐)
git reset --hard [局部索引值]
git reset --hard f73f651
- 使用^符号(只能后退)
git reset --hard HEAD^
注意:一个 ^ 表示后退一步,n 个 ^ 表示后退 n 步
使用 ~ 符号(只能后退)
git reset --hard HEAD~n
- 注意:表示后退 n 步
2.3.6 reset 命令的三个参数对比:
- --soft 参数(status 为绿色)
- 仅在本地库移动 HEAD 指针
- --mixed 参数(status 为红色)
- 在本地库移动 HEAD 指针
- 重置暂存区
- --hard 参数(整体回退,status 为 working tree clean)
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
2.3.7 比较文件差异:
# 显示暂存区和工作区的差异
git diff [file]
# 显示暂存区和上一个 commit 的差异
git diff --cached [file]
# 显示工作区中的文件和本地库历史记录的差异
git diff [本地库中历史版本] [file]
# 显示工作区与当前分支最新 commit 之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}"
2.4 分支管理
2.4.1 分支操作
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 新建一个分支,指向指定 commit
git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
# 在现有分支与指定的远程分支之间建立追踪关系
git branch --set-upstream [branch] [remote-branch]
# 查看本地分支与远程分支的追踪关系
git branch -vv
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 合并指定分支到当前分支
git merge [branch]
# 选择一个 commit,合并进当前分支
git cherry-pick [commit]
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
2.4.2 冲突
解决冲突:
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存并退出
第三步:
git add [file]
第四步(此时commit一定不能带具体文件名):
git commit -m [message]
三、.gitignore 文件
.gitignore 文件是用来忽视提交到 Github 上的文件和文件夹的,除了忽略掉文件夹,还有其他用法:
- ##注释##:注释
- /文件夹/ :过滤文件夹
- *.xml :过滤某类型的文件
- /mtk/do.c:指定过滤具体文件
- !开头表示不过滤
- *.[oa] 支持通配符:过滤repo中所有以.o或者.a为扩展名的文件
四、Git 基本原理
4.1 简介哈希
- 哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
- 哈希算法确定,输入数据确定,输出数据能够保证不变
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
- 哈希算法不可逆
- Git 底层采用的是 SHA-1 算法。
- 哈希算法可以被用来验证下载的文件的完整性(Git 就是靠这种机制来从根本上保证数据完整性的):
4.2 Git 保存版本的机制
4.2.1 集中式版本公知工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本
文件和每个文件随时间逐步累积的差异。
4.2.2 Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前
的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流。
4.2.3 Git 文件管理机制细节
Git 的“提交对象”
提交对象及其父对象形成的链条
4.3 Git 分支管理机制
4.3.1 分支的创建
4.3.2 分支的切换
五、GitHub
- 远程同步
# 查看当前所有远程地址别名
git remote -v
# 增加一个新的远程仓库,并命名
git remote add [alias] [url]
# 删除远程仓库
git remote rm [alias]
# 显示某个远程仓库的信息
git remote show [remote]
# 完整的把远程库下载到本地
# 创建 origin 远程地址别名
# 初始化本地库
git clone [url]
# 将本地 master 分支推动到远程 origin 库
# -u 表示本地指定分支就和远程主机的同名分支建立追踪关系,下次直接用 git push 代替
# -f 表示强制执行(非个人仓库禁止使用)
git push -u [remote] [branch]
git push -u origin master
# 同时指定要将本地分支推送到哪一个远程分支
# 如果没有指定远程分支,则 push 当前分支到当前分支的追踪关系分支
git push [remote] [local branch]:[remote branch]
# 下载远程仓库的所有变动
git fetch [远程地址别名] [远程分支名]
# 把下载的远程库的分支合并到当前分支
git merge [远程地址别名/远程分支名]
# 取回远程仓库的变化,并与本地分支合并
# pull = fetch + merge
git pull [远程地址别名] [远程分支名]
六、Git工作流
6.1 概念
- 在项目开发过程中使用 Git 的方式
6.2 分类
6.2.1 集中式工作流
像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有
修改都提交到 Master 这个分支上。这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。
6.2.2 GitFlow 工作流
Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布
迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
6.2.3 Forking 工作流
Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的
功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受 不信任贡献者的提交。
6.3 GitFlow 工作流详解
6.3.1 分支种类
主干分支 master
- 主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。
开发分支 develop
- 主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
bug修理分支 hotfix
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修
理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
准生产分支(预发布分支)release
- 较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集 成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后 可以视情况删除。
功能分支 feature
- 为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支 中独立出来。 开发完成后会合并到开发分支。