### 疑问
#### 关于 stash 和 cherry-pick
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场`git stash`一下,然后去修复bug,修复后,再`git stash pop`,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用`git cherry-pick <commit>`命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
#### 树形查看
```
git log --graph --pretty=oneline --abbrev-commit
```
#### 回退
`git reset --hard commit_id`
上一个`HEAD^`,上上一个版本就是`HEAD^^`,当然往上100个版本写100个`^`比较容易数不过来,所以写成`HEAD~100`
查看命令历史,回到未来版本 `git reflog`
#### 分支
合并某分支到当前分支:`git merge <name>`
删除分支:`git branch -d <name>`
创建+切换分支:`git checkout -b <name>`或者`git switch -c <name>`
#### merge
branch a aaa (old)
branch master mmm (new)
branch new merge old
old have old
new have new
in master merge a
- a: aaa
- master: mmm
branch old merge new
总结:
`fast forward`合并看不出来曾经做过合并。
`--no-ff`参数,合并后的历史有分支,能看出来曾经做过合并
1、normal (Fast forward)
in a merge master
- a: mmm
- master: mmm
2、recursive strategy (保留)
```
git merge --no-ff -m "merge with no-ff" dev
```
--no-ff`参数,表示禁用`Fast forward`模式
```
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
```
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过`git branch -D <name>`强行删除。
rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比