Git
Git 流程
Git 保存资料有四个区域
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
区域间的关系
Git 配置
使用 git config 工具,来配置或读取 windows 不同环境下,Git 的相关信息和配置项。
不同环境配置方式
- Windows 所有用户可用:
git config --system <相关配置信息> - windows 当前用户可用:
git config --global <相关配置信息> - 当前项目可用:
git config <相关配置信息>
使用配置信息
多种环境都设置了配置项,默认使用时的配置项根据优先级选择:
- 项目
- 当前用户
- 所有用户
配置用户信息
安装完 Git 之后就需要配置用户信息。每次提交的数据都会用此用户信息来区分数据的提交者。【必须配置项】
- 配置用户名:
git config --global user.namme "<自定义>"
- 配置用户Email:
git config --global user.namme <自定义email>
其他配置项
- 配置文本编辑器:(一般使用 Vi 或者 Vim)
git config --global core.editor <工具名称,如:emacs>
- 配置差异分析工具:
git config --global merge.tool <工具名称,如:vimdiff>
查看配置信息
- 查看所有配置信息:
git config --list
- 查看【指定环境】的【指定配置】信息:
git config --global user.name
vim 文本编辑器
vim 是一个文本编辑器,https://www.vim.org/download.php 官网下载,环境变量配置 vim.exe 所在目录,即可在 DOS 命令编辑文件
当执行 git commit 或某些命令,会打开 vim 文本编辑器,此处介绍使用 Git 时调出 vim 编辑器常用命令
vim 的三种模式:
- 命令模式
- 调用相关命令进行一些操作做,如:复制、粘贴、删除、撤销、光标移动等
- 编辑模式
- 用于编辑文本的信息
- 底线命令模式
- 在最末行通过命令将进行一些操作,如:保存、退出等
vim 进入模式
- 命令模式:
- 刚打开的文件就处于命令模式
- 按键
esc进入命令模式
- 编辑模式:
- 按键
i进入编辑模式
- 按键
- 底线模式:
- 按键
:进入底线模式 - 使用命令,要删除全部末行内容
- 按键
常用命令
- 底线模式:
- 保存
:w:保存:w <文件路径>:另存为
- 退出
:q:退出:wq:保存并退出:q!:强制退出
- 保存
创建仓库
- 仓库:工作区、.git 所在的目录,此目录即为仓库
- 创建 Git 仓库,会在仓库目录下生成一个隐藏的 .git 文件夹
| 作用 | 代码 | 说明 |
|---|---|---|
| 初始化仓库 | git init |
当前目录下创建隐藏的 .git 目录 |
git init <路径> |
在指定路径下创建隐藏的 .git 目录 | |
| 克隆当前分支 | git clone <目标仓库地址> |
将目标地址仓库的当前分支,克隆到当前目录下(包括仓库目录) |
git clone <目标仓库地址> <指定路径> |
将目标地址仓库的当前分支,克隆到指定目录下(只克隆仓库内容) | |
| 克隆指定分支 | git clone -b <分支名> <目标仓库地址> |
将目标地址仓库的指定分支,克隆到当前目录下(包括仓库目录) |
git clone -b <分支名> <目标仓库地址> <指定路径> |
将目标地址仓库的指定分支,克隆到指定目录下(只克隆仓库内容) |
本地库操作
添加
将 工作区 的文件添加到 暂存区
| 命令 | 说明 |
|---|---|
git add <文件名.tet> <文件名.pdf> <文件名> |
添加指定(多个)文件到暂存区 |
git add <路径> |
将指定 目录 和 目录下的内容 添加到暂存区【目录也算内容】 |
git add . |
当前目录下所有文件,添加到暂存区 |
git add --all |
将 仓库 下所有文件,添加得到暂存区【仓库中任意位置执行都可】 |
提交
将 暂存区 内容添加到 本地仓库 中
| 命令 | 说明 |
|---|---|
git commit |
将暂存区的所有文件提交到本地库 (通过 vim 编辑器填写备注信息进行提交) |
git commit -m "<备注信息>" |
将暂存区的所有文件提交到本地库 |
git commit <文件> <文件> ... -m <备注信息> |
将暂存区中指定(多个)文件提交到本地库 |
将 工作区 中进行了修改、删除操作的文件,直接提交到 本地库
工作区新增的文件还是需要先 git add 添加到暂存区,再从暂存区提交到本地库
| 命令 | 说明 |
|---|---|
git commit -a |
通过 vim 编辑器填写备注信息进行提交 |
git commit -a -m "<备注信息>" |
直接添加备注信息进行提交 |
git commit -am "<备注信息>" |
效果与 git commit -a -m "<备注信息>" 相同 |
查看
查看 工作区 和 暂存区 中 文件 的 状态
| 命令 | 说明 |
|---|---|
git status -s |
以简短方式输出状态 |
git status |
完整的状态和提示 |
| 状态码 | 说明 |
|---|---|
| 红色 | 工作区文件的状态 |
| 绿色 | 暂存区文件的状态 |
| ?? | 工作区的文件,暂存区中没有,没有 git add 过(文件未被git管理,即没有建立追踪), |
| A | 暂存区的文件,版本库中没有,没有 git commit 过 |
| M | 文件内容或mode被修改 |
| C | 文件的一个新拷贝 |
| D | 删除的文件,Git版本库中还存在 |
| R | 文件名被修改 |
| T | 文件类型被修改 |
| U | 文件没有被合并(需要完成合并才能进行提交) |
| X | 未知状态(bug) |
查看 暂存区 的文件
| 命令 | 说明 |
|---|---|
git ls-files –c |
显示 暂存区 中的文件 |
git ls-files |
默认:同 git ls-files -c 一样 |
git ls-files -d |
显示 暂存区 比 工作区 缺少的文件 |
git ls-files -m |
显示 暂存区 和 工作区 内容不同的文件 |
git ls-files -o |
显示 暂存区 未从 工作区 添加过的文件(未 git add) |
git ls-files -s |
显示 暂存区 文件的 模式位、对象名称、阶段编号 |
git ls-files -s <文件名> |
显示 暂存区 指定文件的 模式位、对象名称、阶段编号 |
查看 文件 在 工作区 、 暂存区 、 版本库 之间 内容差异
返回数据的查看方式:
- 新内容
+- 绿色
- 旧内容
-- 红色
- 新/旧内容
- 新改的文件内容,旧的文件内容
- 新文件优先级:工作区 > 缓存区 > 存储库
| 命令 | 说明 |
|---|---|
git diff |
工作区 状态是 M 的所有文件,与 缓存区 的差异内容 |
git diff <文件名> |
工作区 状态是 M 的指定文件,与 缓存区 的差异内容 |
git diff --cached |
暂存区 状态是 A 和 M 的所有文件,与 存储库 的差异内容 |
git diff --cached <文件名> |
暂存区 状态是 A 和 M 的指定文件,与 存储库 的差异内容 |
git diff HEAD |
工作区 和 暂存区 状态是 M 的所有文件,与 存储库 的差异内容 |
git diff HEAD <文件名> |
工作区 和 暂存区 状态是 M 的指定文件,与 存储库 的差异内容 |
git diff HEAD^ |
工作区 和 暂存区 状态是 M 的所有文件,与 存储库 的回退一次的差异内容 |
git diff HEAD~2 |
工作区 和 暂存区 状态是 M 的所有文件,与 存储库 的????????差异内容 |
查看文件内容
| 命令 | 说明 |
|---|---|
git cat-file -p <id> |
根据 commit-id、HEAD 等信息查看文件的内容 |
回退
将 工作区 、 暂存区 、 存储库 内容依据 存储库 进行回退
(可以回退指定文件)
| 命令 | 说明 |
|---|---|
git reset --mixed |
将 暂存区 回退到 存储库 当前的版本(即:上次commit提交的内容) |
git reset |
与 git reset --mixed 一样【默认】 |
git reset <HEAD> |
将 暂存区 和 存储库 回退到 存储库 之前指定某版本 |
git reset --soft <HEAD~n> |
将 存储库 回退到 存储库 之前的某个版本(HEAD代表当前版本) |
git reset --hard |
将 工作区 和 暂存区 回退到 存储库 当前版本,并删除回退点之后所有编辑内容(未commit的) 【谨慎使用,会删除回退点之后的所有编辑内容(未commit的)】 |
git reset --hard <HEAD> |
与 git reset --hard 一样【或:指定版本(HEAD~n、HEAD^^)】 |
将 暂存区 内容回退到 工作区
| 命令 | 说明 |
|---|---|
git restore <文件名> |
将 暂存区 指定文件回退到 工作区 |
git restore . |
将 暂存区 所有文件回退到 工作区 |
HEAD
HEAD 用来指定版本
^指定版本
HEAD:当前版本HEAD^:上一个版本HEAD^^:上上一个版本HEAD^^^:上上上一个版本- 以此类推……
~指定版本
HEAD:当前版本HEAD~0:当前版本HEAD~1:上一个版本HEAD~2:上上一个版本- 以此类推……
删除
三种参数 -f --cached -r 可以相互结合使用
| 命令 | 说明 |
|---|---|
git rm <文件名> |
工作区 、暂存区 、存储库 文件内容相同,将文件从 工作区 和 暂存区 删除 |
git rm -f <文件名> |
工作区 或 暂存区 与 存储库 中文件内容不同,强行将 工作区 和 暂存区 内容删除 |
git rm --cached <文件名> |
工作区 、暂存区 、存储库 文件内容相同,仅删除 暂存区 内容 |
git rm -r <目录> |
删除 工作区 和 暂存区 中,指定目录即目录下所有目录和文件 |
git rm -r * |
删除 工作区 和 暂存区 中,当前所在目录的所有目录和文件 |
历史
查看历史提交记录
【只能看到 HEAD 指针之前的版本信息】
【无法看到删除了 commit 记录和执行了 rebase、reset、merge 之后的记录】
| 命令 | 说明 |
|---|---|
git log |
历史提交记录 |
git log <文件名> |
查看指定文件历史提交记录 |
git log --oneline |
历史提交记录,简洁版 |
git log --graph |
查看历史中什么时候有分支、合并 |
git log --reverse |
逆向显示所有历史记录 |
git log --author=<用户名> |
查看指定用户提交历史记录 |
git log --before={<指定日期>} |
查看指定日期之前的历史记录 |
git log --after={<指定日期>} |
查看指定日期之后的历史记录 |
git log --no-merges |
隐藏合并提交 |
查看参考日志
【保留了从clone仓库开始,用户所有在本地库中的提交记录】
| 命令 | 说明 |
|---|---|
git reflog |
查看历史所有的 提交 记录 |
git reflog <文件名> |
查看指定文件历史所有的 提交 记录 |
查看历史添加记录
| 命令 | 说明 |
|---|---|
git fsck --lost-found |
查看历史中添加到 暂存区 ,但未提交到 存储库 ,并且被其他操作顶替掉的 暂存区 记录(blob数据格式代表文件内容) |
查看指定文件提交的历史 修改记录
| 命令 | 说明 |
|---|---|
git blame <文件名> |
显示文件中每行内容,最后一次修改的提交记录(HEAD、用户名、时间、代码行数、备注信息) |
git blame -L <代码行1>,<代码行2> <文件名> |
文件代码行1,到代码行2最后一次的修改记录 |
远程库操作
库操作
| 命令 | 说明 |
|---|---|
git remote add <远程库-别名> <远程库-地址> |
添加 远程库 |
git remote -v |
查看 已经添加的远程库 |
git remote rm <远程库-别名> |
删除 添加的远程库 |
git remote update <远程库-别名> --prune |
更新 远程库,更新后可以看到远程库最新的分支(也不知道对不对,??????待续) |
git remote rename <旧-远程库-别名> <新-远程库-别名> |
修改 远程库的 别名 |
git remote show <远程库-别名> |
查看 指定远程库的 信息 |
拉取合并
| 命令 | 说明 |
|---|---|
git fetch <远程库-别名> |
将远程库全部 取回 到本地(不影响本地库) |
git fetch <远程库-别名> <远程分支名> |
将远程库指定分支,拉取 到本地(不影响本地库) |
git merge <远程库-别名>/<远程分支名> |
将远程库指定分支,合并 到存储库当前分支(也不知道对不对,??????待续) |
git pull <远程库-别名> <远程分支名>:<本地分支名> |
将远程库指定分支,拉取合并到本地指定分支(等同于 fetch merge 同时使用) |
git pull <远程库-别名> <远程分支名> |
将远程库指定分支,拉取合并到 当前 分支(等同于 fetch merge 同时使用) |
推送
| 命令 | 说明 |
|---|---|
git push <远程库-别名> <本地分支名>:<远程分支名> |
将本地指定分支 上传 到远程库并与远程库指定分支 合并 |
git push <远程库-别名> <本地分支名> |
本地分支和远程 分支同名,将本地分支上传并合并(必须这么写,不然会有警告提示) |
git push --force <远程库-别名> <本地分支名> |
本地版本与远程版本有差异,可以进行 强推,覆盖远程代码 |
git push <远程库-别名> --delete <远程分支名> |
删除 远程库的指定分支 |
git push <远程库-别名> <本地分支名>:<远程分支名> |
将本地指定分支,上传合并到一个不存在的远程分支,远程库会 创建 一个同名分支 |
分支管理
分支:像是不同走向的快照,向不同方向组成的树杈
查看分支
| 命令 | 说明 |
|---|---|
git branch |
列出 本地分支 |
git branch -v |
列出 本地分支 和 最后快照信息 |
git branch -a |
列出 远程分支 和 本地分支 |
git branch -r |
列出 远程分支 |
创建分支
| 命令 | 说明 |
|---|---|
git branch <分支名> |
创建分支(根部为当前分支) |
切换分支
| 命令 | 说明 |
|---|---|
git checkout <分支名> |
切换到指定分支(切换分支时,分支的最后快照会替换工作区内容) |
git checkout -b <分支名> |
创建并切换到该分支 |
合并分支
| 命令 | 说明 |
|---|---|
git merge <分支名> |
将指定分支合并到当前所在分支 |
删除分支
| 命令 | 说明 |
|---|---|
git branch -d <分支名> |
删除指定分支 |
