1. 选择修订版本

1.1 简短SHA

  1. git log --abbrev-commit

1.2 分支引用

  1. git show f9a60ac 可以查看此次提交做了哪些变化(其实是git diff f9a60ac f8a60ac简写)

1.3 reflog日志

  • reflog表示的是本机的操作记录, 不是提交记录, 是不会同步到远程的

    1. git reflog 显示所有的操作记录
    2. 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~~~

  1. ![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)
  2. <a name="MLfRd"></a>
  3. ### 1.5 提交范围
  4. ![绘图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)
  5. <a name="Z4GGR"></a>
  6. #### 1.5.1 双引号
  7. - **master..dev: 表示显示dev上有但是master上没有的版本记录**
  8. ```git
  9. git log master..dev 显示C6和C7两个版本
  10. git log origin/master..HEAD 再本地分支有, 但是远程分支却没有

1.5.2 多点号

  1. git log dev --not master 显示再dev分支, 但是不在master分支的提交对象
  2. git log dev ^master 简写
  3. git log dev --not origin/master
  4. git log dev test --not master 显示再dev, test 但是不在master上的提交对象

1.5.3 三点号

  • master…dev: 显示的是master和dev的非公共对象

    1. git log master...dev 显示的是C4, C5, C6, C7四个对象
    2. git log master...dev --left--right 显示具体提交对象属于哪一个分支

    Snipaste_2021-06-23_22-51-56.png

    2. 交互式暂存

    **交互式命令-i, 全称interactive**

    1. git add -i 暂存交互
    2. git add --patch 部分提交, 可简写成-p

    image.png

    3. 储藏与清理

    3.1 创建存储

  • 储藏stash就是单独用一个空间存储我们修改的文件

  • stash不单单能够存储修改的文件, 还能够存储提交到暂存区的文件; 只不过恢复的时候, 所有的状态都是修改状态; ```git git stash save 创建储藏, save可省略 git stash 简写

git stash —keep-index 只储藏没有提交到暂存区的变化 git stash —include-untracked 储藏没有跟踪的文件, 简写用-u git stash —patch 交互式暂存(好像只能用于暂存区的文件)

  1. <a name="swF3a"></a>
  2. ### 3.2 查看储藏
  3. ```git
  4. git stash list 查看有那些储藏
  5. git stash show 查看储藏(最近一次)汇总的文件变化
  6. git stash show -p 查看储藏(最近一次)具体的内容变化
  7. git stash show stash@{3} 查看指定储藏汇总的文件变化
  8. git stash show stash@{3} -p 查看指定储藏具体的内容变化

3.3 应用储藏

  1. git stash apply 应用最新的一个储藏(注意我们的储藏是不会删除的)
  2. git stash apply stash@{1} 应用指定的储藏
  3. git stash pop 应用最近的储藏, 并将此储藏删除
  4. git stash pop stash@{1} 应用指定的储藏, 并将此储藏删除

3.4 删除储藏

  1. git stash drop 删除最新的储藏
  2. git stash drop stash@{1} 删除指定的储藏

3.5 储藏创建分支

  • branch 不能写成别名
  • 储藏创建的分支的最新版本是当初创建储藏是所创建的commit
    1. 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 交互是删除文件

  1. <a name="QluzV"></a>
  2. ## 5. 搜索
  3. - **注意JS中的类就是一个构造函数**
  4. <a name="fsRpq"></a>
  5. ### 5.1 内容搜索
  6. ```git
  7. git grep getStudent 全局搜索getStudent
  8. git grep -n getStudent 显示行号
  9. git grep --count getStudent 输出总结信息
  10. git grep -p getStudent 查找getStudent属于那个方法, 再js中匹配的是getStudent方法属于那个类

5.2 日志搜索

  1. git log -S getStudent 查看getStudent在那个版本记录出现
  2. # 查看StudentController构造方法中每个版本之间够差异
  3. git log -L :StudentController:src\controller\StudentController.js

6. 重置揭秘

7. 高级合并

7.1 忽略空白符

  1. # 切换到test分支
  2. git checkout test
  3. # 合并master分支时忽略空白符(空格, 制表, 换行)
  4. git merge -Xignore-all-space master
  5. # 第二种写法
  6. git merge -Xignore-space-change master

7.2 手动文件合并

  1. git merge master # 进入冲突状态
  2. # 获取共同祖先版本, 个人版本, 他人版本
  3. git show :1:01-study.js > 01-study.commen.js
  4. git show :2:01-study.js > 01-study.ours.js
  5. git show :3:01-study.js > 01-study.theirs.js
  6. # 使用merge-file合并文件
  7. git merge-file -p \
  8. # 手动处理冲突, 在执行git clean删除掉三个问跟踪的文件, 提交版本
  9. #在提交版本之前, 可以查看文件做了那些变动
  10. git diff --ours # 查看个人版本做了那些变动
  11. 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文件, 保存了子模版的映射关系

    1. 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 清空缓存

  1. <a name="dtTjf"></a>
  2. ### 11.2 克隆子模块
  3. ```git
  4. # 方法一
  5. git clone [mainUrl] --recursive 克隆主模块的时候, 将子模块一并clone
  6. # 方法二
  7. git clone [mainUrl] 只克隆主模块(注意此时的子模块目录是没有文件的)
  8. git submodule init 初始化本地子模块配置文件
  9. git submodule update 拉取子模块数据

11.3 查看子模块

  1. git submodule 查看子模块对应的目录
  2. # 已检出子模块代码
  3. # cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)
  4. # 前面带 - 表示未检出代码,子模块是空文件夹
  5. # -cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)
  6. git diff --submodule 查看子模块之间的版本差
  7. git status 整体查看
  8. git diff 显示不是很全

image.png
image.png

11.4 拉取数据

  • 当执行git submodule update命令从子模块获取变更时, 子仓库会处于一种叫做分离式HEAD状态, 这意味着本地子模是没有工作分支变更追踪的, 所以此时不能使用git branch -vv查看和远程仓库的比较

image.png

11.4.1 fetch拉取

  1. cd subFile 切换到子模块所在的目录
  2. git fetch 拉取远程子模块代码(注意不能使用pull, 因为子模块不是具体的分支)
  3. git merge origin master 合并远程代码

11.4.2 pull命令拉取

  1. cd subFile 切换到子模块所在的目录
  2. git checkout master 检出一个分支, 这样子模块就不是分离式HEAD
  3. git pull 拉取远程分支
  4. # 再次切换成游离HEAD(所谓游离HEAD其实就是git checkout commitID)
  5. git mainFile
  6. git submodule update 切换到有理HEAD
  7. # 如果没有显示游离HEAD, 则查看一下此时HEAD对应的版本, 再切换到此版本
  8. git checkout commitID

11.4.2 update更新

  • —remote参数不能省略, 否则拉取不到远程的信息; 因为省略掉remote参数之后, 更新的子模块版本是与主模块对应的子模块版本, 但是此时的子模块版本不一定是远程仓库中最新的版本
  • 忘记—merge或—rebase参数的话, 子模块便会处于分离式HEAD状态; 而且游离HEAD指向的子模版版本正式和主模块版本对应的

    1. cd mainFile 切换到主目录
    2. git submodule update --remote 更新子模块代码(这里是更新所有的子模块, 而且是master分支)
    3. git submodule update --remote --merge 更新子模块(子模块不会处于分离式HEAD状态)
    4. git submodule update --remote my-study 只更新my-study子模块

    11.5 推送数据

  • 推送主模板项目的话, 需要先将子模块都推送到远程, 不然会报错

    1. cd mainFile
    2. git push 直接推主模板, 但是如果子模块没有推送的话, 就会报错
    3. git push --recurse-submodules=check 检查子模块有没有推送到远程
    4. git push --recurse-submodules=on-demand 直接推送主模板, 如果子模块没有推动的话, 会先推送子模块, 然年推动主模块