Git详细介绍
0 基本介绍
1 准备工作
1.1 配置文件
git的配置文件包括3个层级,分别是系统级(system)
,用户级(global)
和项目级(local)
。低层级的配置会覆盖高层级
系统级:对所有用户生效。位置在git安装目录/etc/gitconfig
用户级:对当前用户生效。位置在~/.gitconfig
项目级:在当前项目文件夹内生效。位置在项目根目录/.git/config
查看配置
// 查看所有生效的配置文件
git config --list
// 查看特定作用域的配置
git config --<层级> --list
修改配置
git config --<层级> user.name "user"
删除配置
git config --<层级> --unset user.name
常用的配置信息
// 用户信息
git config --global user.name "xiaoli"
git config --global user.email "xiaoli@sina.com"
// 设置默认编辑器
git config --system core.editor "vim"
// 指定diff工具。虽然git内置了diff工具,但也支持自定义
# 查看合并和解决冲突的工具列表
git mergetool --tool-help
# 设置差异分析工具
git config --global merge.tool vimdiff
// 中文显示。在默认设置下,git status 查询的中文文件名不能正确显示,可设置改正
git config --global core.quotepath false
// 指定代理
http.proxy=http://127.0.0.1:7897
https.proxy=http://127.0.0.1:7897
1.2 初始化
本地初始化
// 在当前文件夹创建git项目
git init
// 在指定目录创建git项目
git init <文件名>
从远端项目初始化
git clone <url> [文件名]
1.3 .gitignore
gitignore有多个文件来源,依次顺序为:
- 从命令行中读取可用的忽略规则
- 当前目录定义的规则
- 父级目录定义的规则,依次递推(推荐放在git项目根目录)
- $GIT_DIR/info/exclude 文件中定义的规则
- core.excludesfile中定义的全局规则
2 一次提交内的操作
2.1 文件空间和状态
2.2 文件状态查看
可以使用git status
查看文件状态
状态 | 颜色提示 |
---|---|
未追踪 | Untracked files,红色 |
已修改 | modified,红色 |
已暂存 | 绿色 |
未修改,已提交 | 不显示 |
查看工作区文件:直接查看
查看暂存区文件:git ls-files [--stage]
查看版本库文件:git ls-tree -r HEAD
2.3 工作区和暂存区
工作区存在一份文件。当提交之后,暂存区也存在同样的一份文件。
暂存文件
// 提交所有文件
git add .
// 提交指定文件
git add <文件名>
删除暂存区的文件
注意是删除文件,不是删除修改。删除后的文件会变成未追踪状态。
// 删除指定文件。
git rm --cached <file>
同时删除工作区和暂存区的文件
// 同时删除指定文件
git rm <file1> <file2> ...
撤销工作区的修改(使用暂存区覆盖)
checkout意思为检出,在这里表示取出暂存区的内容覆盖工作区。
注意:只覆盖暂存区对应的文件,如暂存区有文件file1,而工作区有文件file1和file2。则执行之后,只有file1被覆盖,file2不变。
// 若文件未放入暂存区,则恢复到版本库状态。若文件暂存之后还修改,则恢复到暂存时的状态。
git checkout -- <file>
若想要完全移除暂存区的修改(也就是git status中的绿色文件变为红色),可以使用git reset
命令
// 完全移除暂存区文件。等效为用版本库覆盖暂存区。若文件之前是未追踪,则也恢复成未追踪。注意后跟文件时,版本库不会发生变化。
git reset <file>
2.4 暂存区和版本库
提交文件
将暂存区的文件提交至版本库。提交之后,生成版本号。
// 从暂存区提交
git commit -m "提交描述"
// 直接从工作区提交
git commit -a -m "提交描述"
// 修改提交备注。提交,生成新的版本号,与上一次的提交合并。
git commit --amend
使用版本库覆盖文件
可以使用版本库中的文件覆盖当前工作区和暂存区的文件。
// 【慎重使用】退回HEAD指向的版本,并覆盖暂存区和工作区(和版本库)
git reset --hard HEAD
// 【默认】退回HEAD指向的版本,并覆盖暂存区(和版本库)
git reset --mixed HEAD
// 退回HEAD指向的版本,并覆盖版本库
git reset --soft HEAD
3 版本管理
3.1 版本生成
git每一次的commit都会生成版本,对应唯一的commit-id。
3.2 版本回退
版本回退reset
reset用于回退到某一个版本(包括当前版本)或者分支,然后覆盖工作区或者暂存区(参考上文)。
// 利用commit-id回退版本
git reset <commit-id>
// 利用HEAD回退
git reset HEAD // 回退到当前版本
git reset HEAD^ // 回退到上一个版本
git reset HEAD~<n> // 回退到前n个版本
// 切换到branch的最新提交
git reset <branch-name>
版本回退revert(逆操作提交)
// 执行commit-id的逆操作,并生成新的commit-id。注意,①未暂存的文件和修改需要先暂存,②已暂存的文件可能存在冲突,需要解决冲突。
git revert -n <commit-id>
4 分支管理
4.1 查看分支
// 查看分支信息
git branch -vv
// 查看分支图
git log --oneline --decorate --graph
4.2 创建分支
// 创建一个新分支
git branch <new-branch>
// 创建并切换分支
git checkout -b <new-branch>
// 创建临时分支,查看某commit-id的内容
git checkout <commit-id>
4.3 切换分支
git checkout <branch-name>
分支切换时的工作中区和暂存区
当分支切换时,存在以下几种情况
- 未追踪的文件:对于未追踪的文件,由于不受版本库的管理,因此会切换分支时会出现在新分支。
- 未修改的文件:当工作区和版本库文件一致时,切换分支后,工作区和暂存区与目标分支版本库一致。
- 分支文件修改,但修改文件在当前版本库的blob值与目标版本库中该文件的blob值相同,则该文件可以同步过去。
- 分支文件修改,但当前分支和目标分支的版本库中,修改文件的blob值不同,则git会报错。注意:只要有一个文件报错,就无法切换分支。
对分支切换的一种简单理解:
- 理想情况下,分支切换时,会首先用目标分支的版本库恢复至工作区和暂存区
- 应用原分支中
git status
显示的修改,包括:未追踪、已修改、已暂存三种类型的操作。 - 当文件无法应用操作时(因为两个版本库文件不同),则无法切换分支,git报错。
4.4 stash栈
当切换分支时报错,但必须切换分支时,可以利用stash解决。stash是一个可以保存工作区和暂存区工作状态的栈。当不得不切换分支时,可以先将当前工作区和暂存区存入stash栈,之后再需要时将工作状态出栈。
存(入栈)
// 入栈
git stash
// 入栈并注释
git stash save "注释"
取(出栈)
注意取出时,若本地工作区或者暂存区存在修改文件,则可能发生错误导致终止。
若本地修改且已经提交新版本,取出时若存在冲突需要解决。
// 取出并从栈中删除
git stash pop stash@{<栈编号>}
// 应用栈,但不从栈中删除
git stash apply stash@{<栈编号>}
清除栈
// 清除特定的栈快照
git stash drop stash@{<栈编号>}
// 清空栈
git stash clear
查看栈
// 显示整个栈结构
git stash list
// 显示栈的具体修改内容,默认为栈顶的修改
git stash show -p stash@{<栈编号>}
4.5 合并分支
合并分支通常有两种方式:分别是merge
和rebase
。两种分支的区别如图所示。
冲突解决
在分支合并的过程中,如果两个分支修改了同一个文件的同一行代码,则会产生冲突。
解决冲突的过程包括(不确定):
// 1 手动编辑冲突文件
vim <conflicted files>
// 2 添加冲突文件到暂存区,并重新提交
git add ... git commit ...
// 3 继续合并
git merge <new-branch>
4.6 删除分支
// 删除本地分支
git branch -d <new-feature>
5 git lfs大文件管理
先挖坑,有空再写