1 cherry-pick
cherry-pick可用于把其他分支的commit,移到当前分支。
实践一下:
1 在master分支新建git.txt
2 在git.txt输入 “master第一次提交”
3 在master分支提交
git add git.txtgit commit -m 'master第一次提交'复制代码
4 基于master新建test分支
git checkout -b test复制代码
5 在git.txt加一行 “test第一次提交”
6 在test分支提交
git add git.txtgit commit -m 'test第一次提交'写法2: 此时git.txt已经add过了,可以用偷懒的写法git commit -am 'test第一次提交'复制代码
7 在git.txt加一行 “test第二次提交”
8 在test分支提交
git commit -am 'test第二次提交'复制代码
9 参照上面 4 ~ 8,基于master新建test2分支,在test2中也提交两遍。
此时,在master分支有一次提交,在test和test2分支有两次提交,如下图所示。
如果我们需要把test和test2分支的第一次提交移到master上,那么可以使用cherry-pick(注意:使用merge合并的方式会把所有提交合并过来,而这里我们只需要test和test2第一次提交)
使用git log查看test和test2中第一次提交的commit id,在cherry-pick中使用。
然后在master分支中cherry-pick
// 4d5a7b1 为test第一次提交的commit id, 3d56b9a为test2第一次提交的commit idgit cherry-pick 4d5a7b1 3d56b9a复制代码
此时如果无冲突,那么test和test2分支第一次提交的内容将会移到master中
如果有冲突,那么解决后使用git add,添加后再执行git cherry-pick --continue
当然你也可以退出cherry-pick,使用git cherry-pick --quit 会退出cherry-pick,但是刚刚cherry-pick的结果会留下
如果你希望回到cherry-pick之前,那么可以使用 git cherry-pick --abort
如果cherry-pick已经顺利执行完,而你又想回到cherry-pick之前,那么可以使用版本回退啦。
注意:
1 cherry-pick一个分支的多个commit时,请按顺序填写commit id,或者使用 "..." 限定范围,如下。
// 从start-commit-id 到 end-commit-id 不包含 start-commit-id git cherry-pick… // 从start-commit-id 到 end-commit-id 包含 start-commit-idgit cherry-pick ^… 复制代码
2 假如有一个commit,是从其他分支合并过来形成的,那么cherry-pick这个commit将会报错,是因为git不知道取哪个分支的内容,使用-m选项即可。
error: commit fd30d42926885f792976a094b1aa0c96e8228240 is a merge but no -m option was given.复制代码
2 查看某个文件的历史
git log --all --full-history -- package-lock.json复制代码
--all 展示包括其他分支的所有历史
--full-history 查看某个文件历史时,git会自动简化历史(),甚至会隐藏一些提交。--full-history可以关闭History Simplification。
3 --allow-unrelated-histories
git 2.9 后默认不允许合并两个不相关的没有共同祖先的分支,比如新建本地仓库,新建github仓库,本地仓库 git remote add origin <repository url> ,然后git pull origin master,会报错。
fatal: refusing to merge unrelated histories复制代码
可以使用--allow-unrelated-histories解决
// pull时git pull origin--allow-unrelated-histories// merge时git merge --allow-unrelated-histories复制代码
4 创建干净历史的分支
git checkout --orphan复制代码
--orphan创建出来的分支没有任何提交历史
5 git clone深度
// 克隆仓库,且只克隆最近 1 次提交历史,如果想克隆最近 n 次的历史,把 1 改成 n 即可。git clone --depth=1复制代码