git多分支时,经常将代码从一个分支转移到另个分支上。

  • 如果是将一个分支上的所有代码都转移到另个分支上,使用git merge;
  • 如果只是转移其中部分commit的移到另个分支上时,使用cherry pick。原来的分支上这些commit也依然存在。

分支合并游离commit

分支master合并游离commit 33333333333:

1
2
3
git checkout master
git pull
git cherry-pick 33333333333

基本使用

将A分支上的commit1,移到分支B上:

1
2
git checkout B
git cherry-pick commit1

这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

如果使用分支名,表示将该分支的最新提交转移到当前分支。

1
git cherry-pick A

转移多个提交

cherry-pick支持转移多个提交。

1
git cherry-pick commit1 commit2

上面的命令将commit1和commit2两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。

如果想要转移一系列的连续提交,可以使用下面的简便语法:

1
git cherry-pick commitstart..commitend

上面的命令可以转移从commitstart到commitend的所有提交。它们必须按照正确的顺序放置:提交commitstart必须早于提交commitend,否则命令将失败,但不会报错。

注意,使用上面的命令,提交commitstart将不会包含在 Cherry pick 中。如果要包含提交commitstart,可以使用下面的语法:

1
git cherry-pick commitstart^..commitend

代码冲突

在cherry-pick的过程中,发生代码冲突,会停下来,由用户决定如何继续操作。

  • 继续
    出现冲突,用户解决代码冲突后,将修改的文件重新加入暂存区git add .,然后继续cherry-pick:

    1
    git cherry-pick --continue
  • 放弃

    1
    git cherry-pick --abort

    发生代码冲突后,放弃合并,回到操作前的样子。

  • quit

    1
    git cherry-pick --quit

    发生代码冲突后,退出cherry-pick,但是不回到操作前的样子。

转移到另一个代码库

1
2
3
4
5
6
7
8
9
10
11
# 先将该库加为远程仓库
git remote add target git://gitUrl

# 然后,将远程代码抓取到本地
git fetch target

# 检查一下要从远程仓库转移的提交,获取它的哈希值。
git log target/master

# 使用git cherry-pick命令转移提交
git cherry-pick <commitHash>