基础(本地仓库)
git commit(提交)
- 创建一个新的提交记录:git commit
git branch(分支)
- 使用分支=我想基于这个提交以及它所有的父提交进行新的工作:git branch newName
- 切换到新的分支:git checkout <name>git
- 创建新的分支并同时切换到该新分支:git checkout -b <your-branch-name>
git merge(分支合并)
- 合并两个分支时会产生一个特殊的提交记录,它包含两个父节点
- 合并分支=我要把这两个父节点本身及它们所有的祖先都包含进来
- 将bugFix合并到main里:git merge branchName(前提是当前分支为main分支)完整过程如下图所示:
git rebase(分支合并)
- 取出一系列的提交记录,复制它们并在另一个地方逐个的放下去,可以创造更线性的提交历史
- 转移分支内容:git rebase main(将bugFix分支的内容复制到main分支下,看起来是顺序开发,实际上还是并行开发)
- 分支内容转移后,提交记录依然在原来的位置,main下方的记录只是一个副本
在提交树上移动(head)
- 对当前检出记录的符号引用:指向正在其基础上进行工作的提交记录
- 总是指向当前分支上的最近一次提交记录(通常指向分支名),大多数修改提交树的git命令都是从改变head的指向开始的
相对引用
- 查看提交记录的哈希值:git log
- 向上移动一个提交记录:^
- 向上移动多个提交记录:~<num> 不跟数字时默认值向上移动一次
- 如:git checkout HEAD~4
- 强制修改分支位置:-f
撤销变更(git reset/git revert)
- git reset(本地变更,对远程分支无效)
- 向上移动分支,原来指向的提交记录就跟从来没有提交过一样
- 当reset将main分支移回到c1提交之后,c2做的变更还在,只是处于了未加入暂存区的状态
- git revert(可远程变更)
- revert之后的更改可以推送到远程仓库与别人分享
- revert变更之后会多一个新的提交记录,这个新的提交记录实际上是用来撤销原来的提交的,也就是说这个新的提交的状态与原来提交的上一级提交是一样的。如下图中,c2'的状态和c1的状态其实就是相同的