1. 选择修订版本
1.1 简短SHA
git log --abbrev-commit
1.2 分支引用
git show f9a60ac 可以查看此次提交做了哪些变化(其实是git diff f9a60ac f8a60ac简写)
1.3 reflog日志
reflog表示的是本机的操作记录, 不是提交记录, 是不会同步到远程的
git reflog 显示所有的操作记录
git reflog HEAD@{5} 显示第五条之后的操作记录, 之前的操作记录不显示
1.4 祖先引用
^: 表示的是对象的父对象, ^2表示的是对象的第二个父对象, 只在合并分支的时候才能出现
- ~: 表示的是对象的父对象, ~2表示的是对象的父对象的父对象 ```git git show C6^ 查看的是C5这个对象 git show C6^2 查看的是C4这个对象
git show C6~ 查看的同样是C5这个对象 git show C6^3 查看的是C2这个对象, 也可以写成C6~~~
![02.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/2309174/1621681124431-7f2150fb-c41f-41c2-a30d-ee7db853e132.jpeg#height=2075&id=u822c10ce&name=02.jpg&originHeight=2075&originWidth=8425&originalType=binary&ratio=1&size=394212&status=done&style=none&width=8425)
<a name="MLfRd"></a>
### 1.5 提交范围
![绘图1.png](https://cdn.nlark.com/yuque/0/2021/png/2309174/1624458770828-61dc7a56-8970-4049-a804-2c29b8054905.png#height=3138&id=Fn2CB&margin=%5Bobject%20Object%5D&name=%E7%BB%98%E5%9B%BE1.png&originHeight=3138&originWidth=11613&originalType=binary&ratio=1&size=383516&status=done&style=none&width=11613)
<a name="Z4GGR"></a>
#### 1.5.1 双引号
- **master..dev: 表示显示dev上有但是master上没有的版本记录**
```git
git log master..dev 显示C6和C7两个版本
git log origin/master..HEAD 再本地分支有, 但是远程分支却没有
1.5.2 多点号
git log dev --not master 显示再dev分支, 但是不在master分支的提交对象
git log dev ^master 简写
git log dev --not origin/master
git log dev test --not master 显示再dev, test 但是不在master上的提交对象
1.5.3 三点号
master…dev: 显示的是master和dev的非公共对象
git log master...dev 显示的是C4, C5, C6, C7四个对象
git log master...dev --left--right 显示具体提交对象属于哪一个分支
2. 交互式暂存
**交互式命令-i, 全称interactive**
git add -i 暂存交互
git add --patch 部分提交, 可简写成-p
3. 储藏与清理
3.1 创建存储
储藏stash就是单独用一个空间存储我们修改的文件
- stash不单单能够存储修改的文件, 还能够存储提交到暂存区的文件; 只不过恢复的时候, 所有的状态都是修改状态; ```git git stash save 创建储藏, save可省略 git stash 简写
git stash —keep-index 只储藏没有提交到暂存区的变化 git stash —include-untracked 储藏没有跟踪的文件, 简写用-u git stash —patch 交互式暂存(好像只能用于暂存区的文件)
<a name="swF3a"></a>
### 3.2 查看储藏
```git
git stash list 查看有那些储藏
git stash show 查看储藏(最近一次)汇总的文件变化
git stash show -p 查看储藏(最近一次)具体的内容变化
git stash show stash@{3} 查看指定储藏汇总的文件变化
git stash show stash@{3} -p 查看指定储藏具体的内容变化
3.3 应用储藏
git stash apply 应用最新的一个储藏(注意我们的储藏是不会删除的)
git stash apply stash@{1} 应用指定的储藏
git stash pop 应用最近的储藏, 并将此储藏删除
git stash pop stash@{1} 应用指定的储藏, 并将此储藏删除
3.4 删除储藏
git stash drop 删除最新的储藏
git stash drop stash@{1} 删除指定的储藏
3.5 储藏创建分支
- branch 不能写成别名
- 储藏创建的分支的最新版本是当初创建储藏是所创建的commit
git stash branch dev
3.6 清空未跟踪文件
```git git clean -n 查看所有为跟踪的文件(不删除, 只是查看) git clean -n -x 查看所有的未跟踪文件(包括gitignorez中忽略的未跟踪文件z)
git clean -fd 清空所有的未跟踪文件, -fd可以分开写成-f(强制) -d(确定执行) git clean -i 交互是删除文件
<a name="QluzV"></a>
## 5. 搜索
- **注意JS中的类就是一个构造函数**
<a name="fsRpq"></a>
### 5.1 内容搜索
```git
git grep getStudent 全局搜索getStudent
git grep -n getStudent 显示行号
git grep --count getStudent 输出总结信息
git grep -p getStudent 查找getStudent属于那个方法, 再js中匹配的是getStudent方法属于那个类
5.2 日志搜索
git log -S getStudent 查看getStudent在那个版本记录出现
# 查看StudentController构造方法中每个版本之间够差异
git log -L :StudentController:src\controller\StudentController.js
6. 重置揭秘
7. 高级合并
7.1 忽略空白符
# 切换到test分支
git checkout test
# 合并master分支时忽略空白符(空格, 制表, 换行)
git merge -Xignore-all-space master
# 第二种写法
git merge -Xignore-space-change master
7.2 手动文件合并
git merge master # 进入冲突状态
# 获取共同祖先版本, 个人版本, 他人版本
git show :1:01-study.js > 01-study.commen.js
git show :2:01-study.js > 01-study.ours.js
git show :3:01-study.js > 01-study.theirs.js
# 使用merge-file合并文件
git merge-file -p \
# 手动处理冲突, 在执行git clean删除掉三个问跟踪的文件, 提交版本
#在提交版本之前, 可以查看文件做了那些变动
git diff --ours # 查看个人版本做了那些变动
git diff --theirs -b # 查看他人版本做了那些变动
7.3 revert还原
原文链接: https://segmentfault.com/a/1190000012897697
11. 子模块
原本连接: https://juejin.cn/post/6844903492750934029
通常而言, 都是由一个主模板, 然后主模块下由多个子模版; 我们只要来去主模块仓库就行了
11.1 添加子模块
主模块和子模块都是一个仓库, 都可以独立存在; 只不过主模块仓库中多了一个gitmodules文件, 用来表示子模块有那些
- 主模块的每一个版本都有与其对应的子模块版本; 例如主模块的版本1001对应子模块的1001, 但是此时的子模版版本可以提交到1002, 主模块的版本号如果想和1002子模块对应, 则再提交一次主模块即可; 这种映射关系是有git自动管理的
添加子模块之后, 项目中会自动生成一个.gitmodules文件, 保存了子模版的映射关系
git submodule add [subUrl] 添加子模块地址
11.1 删除子模块
注意此删除会将所有历史版本中的子模块统统删除, 毕竟我们把git/module目录对应的子模块都给删除了, 历史版本中自然也没有对应的子模块;
- 但是历史版本中会有一个空子目录目录文件, 即使我们使用
**git submodule updat**
也拉取不到数据, 因为我们把对应的配置文件也给删除了; ```git rm -rf subFile 删除子模块目录 vi .gitmodules 删除gitmodules文件中对应的子模块 vi .git/config 删除配置项中子模块相关条目 rm .git/module/* 删除模块下的子模块目录
如果删除目录后, 想在恢复子目录, 一直恢复失败, 可以清空缓存
git rm —cached subName 清空缓存
<a name="dtTjf"></a>
### 11.2 克隆子模块
```git
# 方法一
git clone [mainUrl] --recursive 克隆主模块的时候, 将子模块一并clone
# 方法二
git clone [mainUrl] 只克隆主模块(注意此时的子模块目录是没有文件的)
git submodule init 初始化本地子模块配置文件
git submodule update 拉取子模块数据
11.3 查看子模块
git submodule 查看子模块对应的目录
# 已检出子模块代码
# cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)
# 前面带 - 表示未检出代码,子模块是空文件夹
# -cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)
git diff --submodule 查看子模块之间的版本差
git status 整体查看
git diff 显示不是很全
11.4 拉取数据
- 当执行git submodule update命令从子模块获取变更时, 子仓库会处于一种叫做分离式HEAD状态, 这意味着本地子模是没有工作分支变更追踪的, 所以此时不能使用git branch -vv查看和远程仓库的比较
11.4.1 fetch拉取
cd subFile 切换到子模块所在的目录
git fetch 拉取远程子模块代码(注意不能使用pull, 因为子模块不是具体的分支)
git merge origin master 合并远程代码
11.4.2 pull命令拉取
cd subFile 切换到子模块所在的目录
git checkout master 检出一个分支, 这样子模块就不是分离式HEAD了
git pull 拉取远程分支
# 再次切换成游离HEAD(所谓游离HEAD其实就是git checkout commitID)
git mainFile
git submodule update 切换到有理HEAD
# 如果没有显示游离HEAD, 则查看一下此时HEAD对应的版本, 再切换到此版本
git checkout commitID
11.4.2 update更新
- —remote参数不能省略, 否则拉取不到远程的信息; 因为省略掉remote参数之后, 更新的子模块版本是与主模块对应的子模块版本, 但是此时的子模块版本不一定是远程仓库中最新的版本
忘记—merge或—rebase参数的话, 子模块便会处于分离式HEAD状态; 而且游离HEAD指向的子模版版本正式和主模块版本对应的
cd mainFile 切换到主目录
git submodule update --remote 更新子模块代码(这里是更新所有的子模块, 而且是master分支)
git submodule update --remote --merge 更新子模块(子模块不会处于分离式HEAD状态)
git submodule update --remote my-study 只更新my-study子模块
11.5 推送数据
推送主模板项目的话, 需要先将子模块都推送到远程, 不然会报错
cd mainFile
git push 直接推主模板, 但是如果子模块没有推送的话, 就会报错
git push --recurse-submodules=check 检查子模块有没有推送到远程
git push --recurse-submodules=on-demand 直接推送主模板, 如果子模块没有推动的话, 会先推送子模块, 然年推动主模块