对于多分支的代码库,往往需要切换不同分支。那么往往需要用到以下两个操作:
- git merge (合并分支所有commit)
- git cherry-pick (有选择的合并其他分支的commit)
假设现在的git log拓扑如下:
a - b - c - d master
\
e - f - g dev
接下来想要将其中dev branch的 f应用于master branch.
git checkout master
git cherry-pick f
执行以上命令后,目前的拓扑如下
a - b - c - d - f master
\
e - f - g dev
其他操作:
- 转移最后一次commit
git cherry-pick dev
- 转移多个commit
#合并e和f,尖括号内为e和f两次commit对应的hash值
git cherry-pick <hash of e> <hash of f>
- 转移连续的多个commit
# 转移e到f所有commit,不包含e
git cherry-pick e..f
#转移e到f所有commit,包含e
git cherry-pick e^..f
git cherry-pick命令的帮助信息:
$ git cherry-pick -h
usage: git cherry-pick [<options>] <commit-ish>...
or: git cherry-pick <subcommand>
--quit 退出但是不恢复到操作前的状态
--continue 解决完冲突后继续执行
--abort 发生冲突后,放弃合并,恢复操作前的状态
-n, --no-commit 更新工作区和暂存区,不自动产生新的提交。
-e, --edit 编辑commit信息
-s, --signoff 添加提交者的签名信息
-m, --mainline <parent-number>
select mainline parent
--rerere-autoupdate update the index with reused conflict resolution if possible
--strategy <strategy>
merge strategy
-X, --strategy-option <option>
option for merge strategy
-S, --gpg-sign[=<key-id>]
GPG sign commit
-x 在末尾添加一行(cherry picked from commit ...)以便记录此commit是cherry pick得到的
--ff allow fast-forward
--allow-empty preserve initially empty commits
--allow-empty-message
allow commits with empty messages
--keep-redundant-commits
keep redundant, empty commits
如果发生冲突,首先处理冲突的文件,然后执行 git add . (注意后面有个.),将修改后的文件加入暂存区。然后执行:
git cherry-pick --continue
网友评论