【实例】git cherry-pick使用指南

1,624 阅读6分钟

我正在参加「掘金·启航计划」

介绍

git cherry-pick命令用于将其他分支中的一个或多个提交合并到当前分支中。下面是使用git cherry-pick命令的详细教程和步骤:

  1. 首先,切换到需要合并提交的分支:
git checkout <branch>
  1. 然后,运行以下命令来选择要合并的提交:
git cherry-pick <commit-hash>

其中,<commit-hash>是要合并的提交的哈希值。您可以在其他分支中使用git log命令查看提交的哈希值。

  1. 如果要合并多个提交,可以在命令中指定它们的哈希值,或者指定一个提交范围,例如:
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>

或者:

git cherry-pick <start-commit-hash>..<end-commit-hash>
  1. 运行命令后,Git将应用选定的提交,并自动创建一个新的提交。
  2. 您可以使用git log命令查看新提交的哈希值。
  3. 如果在应用提交时发生冲突,您需要手动解决冲突,然后运行以下命令来继续应用提交:
git cherry-pick --continue
  1. 如果您需要中止应用提交,您可以运行以下命令:
git cherry-pick --abort

这将回滚应用的所有提交,并将您的工作区还原到之前的状态。

示例

下面我们通过一个示例来看看这个功能吧。

git cherry-pick命令的示例。

假设您有两个分支,分别称为featuremaster。您想要将feature分支中的一个提交复制到master分支中。

  1. 切换到feature分支,查看commit log;
git log

输出:

commit 316e1b3ab68fdd8f81b3e2ec2ae51471f839915c (HEAD -> feature)
Author: xxx
Date:   Tue May 9 10:55:16 2023 +0800

    feature 2nd

commit d671a5b18470ce0014b81f1b3f89df68df57c1fd
Author: xxx
Date:   Tue May 9 10:54:39 2023 +0800

    feature 1st

commit 01a5a3854485313a048d81218722024a10314d3b (master)
Author: xxx
Date:   Tue May 9 10:52:20 2023 +0800

    init

可以看到当前分支有两个新的提交:

commit 316e1b3ab68fdd8f81b3e2ec2ae51471f839915c feature 2nd
commit d671a5b18470ce0014b81f1b3f89df68df57c1fd  feature 1st

这个时候我们想要将feature 1st这个提交合并到master

  1. 切换到master分支:
git checkout master
  1. 运行以下命令来选择要复制的提交:
git cherry-pick d671a5b18470ce0014b81f1b3f89df68df57c1fd
  1. 运行git log命令查看新提交的哈希值:
git log

输出:

commit 2c5ec89687ca256af3bcd2f465b087edc10769ef (HEAD -> master)
Author: xxx
Date:   Tue May 9 10:54:39 2023 +0800

    feature 1st

commit 01a5a3854485313a048d81218722024a10314d3b
Author: xxx
Date:   Tue May 9 10:52:20 2023 +0800

    init

可以看到在master分支上多两个提交,提交内容和feature一样

5.再来演示一下冲突的解决办法,我们先在feature分支上建一个新的提交

commit b1dcf11d92a80506d5a6b9f8669a1f1e9aa8135a (HEAD -> feature)
Author: xxx
Date:   Tue May 9 11:08:24 2023 +0800

    feature 3rd

commit 316e1b3ab68fdd8f81b3e2ec2ae51471f839915c
Author: xxx
Date:   Tue May 9 10:55:16 2023 +0800

    feature 2nd

commit d671a5b18470ce0014b81f1b3f89df68df57c1fd
Author: xxx
Date:   Tue May 9 10:54:39 2023 +0800

    feature 1st

commit 01a5a3854485313a048d81218722024a10314d3b
Author: wangb-q <wangb-q@glodon.com>
Date:   Tue May 9 10:52:20 2023 +0800

    init
  1. 切换到master分之,也新建一个提交:
commit 0184126dbb05f627f539d8ffeec81c701004f71b (HEAD -> master)
Author: xxx
Date:   Tue May 9 11:11:50 2023 +0800

    master 1st

commit 2c5ec89687ca256af3bcd2f465b087edc10769ef
Author: xxx
Date:   Tue May 9 10:54:39 2023 +0800

    feature 1st

commit 01a5a3854485313a048d81218722024a10314d3b
Author: xxx
Date:   Tue May 9 10:52:20 2023 +0800

    init
  1. 执行cherry-pick,将feature分支feature 3rd 合并到master
git cherry b1dcf11d92a80506d5a6b9f8669a1f1e9aa8135a

发现有冲突:

Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
error: could not apply b1dcf11... feature 3rd
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".

冲突内容:

* 初始化内容

* featrue分支 第一次提交内容
<<<<<<< HEAD
* master分支 第一次提交内容
=======
* featrue分支 第二次提交内容
* featrue分支 第三次提交内容
>>>>>>> b1dcf11 (feature 3rd)
  1. 手动解决冲突,然后运行以下命令来继续应用提交:
git add .

//会弹出commit message 修改界面,可以修改message后再提交
git cherry-pick --continue

查看log:

commit 07a803961c33a19521f6c5cebcae7c72479f3ae2 (HEAD -> master)
Author: wangb-q <wangb-q@glodon.com>
Date:   Tue May 9 11:08:24 2023 +0800

    feature 3rd

commit 0184126dbb05f627f539d8ffeec81c701004f71b
Author: wangb-q <wangb-q@glodon.com>
Date:   Tue May 9 11:11:50 2023 +0800

    master 1st

commit 2c5ec89687ca256af3bcd2f465b087edc10769ef
Author: wangb-q <wangb-q@glodon.com>
Date:   Tue May 9 10:54:39 2023 +0800

    feature 1st

commit 01a5a3854485313a048d81218722024a10314d3b
Author: wangb-q <wangb-q@glodon.com>
Date:   Tue May 9 10:52:20 2023 +0800

    init

发现已经合并了。

  1. 如果您需要中止应用提交,请运行以下命令:
git cherry-pick --abort

总结

以上就是使用cherry-pick的基本操作。通过合理地使用cherry-pick,可以使得开发高效,同时也可以更加安全地进行代码开发和维护。