git cherry pick详解

1. 什么是git cherry pick
在git中,cherry-pick是一个非常有用的命令,它允许我们选择并合并某个分支中的特定提交到当前分支中。这种命令可以帮助我们管理分支、合并代码以及解决问题。
具体来说,git cherry-pick命令可以选择一个提交(commit)应用到另一个分支上。使用这个命令,我们可以将一个分支中的一个或多个特定提交应用到当前分支,而不需要合并整个分支。
2. git cherry pick的用途
git cherry-pick 命令有以下几个常用的用途:
- 合并特定的提交:有时候,在我们的开发过程中,可能只需要合并某个特定的提交,而不是整个分支。这时使用
git cherry-pick命令可以方便地将该提交合并到当前分支中。 -
修复bug:当我们在某个分支上修复了一个重要的bug并提交了修改,但是发现其他分支也存在这个问题时,可以使用
git cherry-pick命令将修复bug的提交应用到其他分支,从而避免重复劳动。 -
回滚提交:有时候,在我们的提交历史中,某个提交引入了问题或者与预期的功能不符,我们需要将该提交从分支中移除。这时可以使用
git cherry-pick命令回滚相应的提交。
3. 使用git cherry pick
3.1 查看可用的提交
在使用git cherry-pick命令之前,我们需要先了解要选择的提交的哈希值。可以通过以下命令查看可用的提交:
$ git log
commit c9f75087903b5e0dddc901580335bf32e4ca2c25
Author: John Smith <john@example.com>
Date: Fri May 21 12:34:56 2022 -0700
Add new feature
commit a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
Author: Jane Doe <jane@example.com>
Date: Thu May 20 09:00:00 2022 -0700
Update documentation
commit 19af05b3654c6d293269c910b58ff9d2d0dbe71f
Author: John Smith <john@example.com>
Date: Wed May 19 15:30:00 2022 -0700
Fix bug in login feature
...
以上是一个假想的提交历史,我们可以看到每个提交都有一个唯一的哈希值。
3.2 使用git cherry pick合并提交
使用git cherry-pick命令将选定的提交合并到当前分支,命令的基本语法如下:
$ git cherry-pick <commit>
这里的<commit>指的是要合并的提交哈希值或者引用。
例如,我们想将提交c9f75087903b5e0dddc901580335bf32e4ca2c25合并到当前分支,可以使用以下命令:
$ git cherry-pick c9f75087903b5e0dddc901580335bf32e4ca2c25
这样就将指定的提交合并到了当前分支中。
3.3 合并多个提交
git cherry-pick命令还支持合并多个提交。可以一次传递多个提交的哈希值或者引用。
$ git cherry-pick <commit1> <commit2> ...
例如,我们想要合并提交c9f75087903b5e0dddc901580335bf32e4ca2c25和a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde,可以使用以下命令:
$ git cherry-pick c9f75087903b5e0dddc901580335bf32e4ca2c25 a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
这样就将这两个提交依次合并到了当前分支中。
4. 使用场景示例
4.1 合并特定的提交
假设我们有一个主分支master和一个开发分支dev,我们在dev分支上开发了一些新功能并提交了多次。然而,我们只想将其中的一个特定提交合并到master分支,并且不想合并整个dev分支。
首先,我们查看dev分支上的提交历史,找到需要合并的提交的哈希值:
$ git log dev
commit c9f75087903b5e0dddc901580335bf32e4ca2c25
Author: John Smith <john@example.com>
Date: Fri May 21 12:34:56 2022 -0700
Add new feature
commit a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
Author: John Smith <john@example.com>
Date: Thu May 20 09:00:00 2022 -0700
Update documentation
commit 19af05b3654c6d293269c910b58ff9d2d0dbe71f
Author: John Smith <john@example.com>
Date: Wed May 19 15:30:00 2022 -0700
Fix bug in login feature
...
假设我们想把提交a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde合并到master分支,可以使用以下命令:
$ git checkout master
$ git cherry-pick a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
这样就将特定的提交合并到了master分支中。
4.2 修复Bug
假设我们有一个bug在bugfix分支上修复,并提交了修复的代码。但是,同样的bug也存在于master分支中。我们可以使用git cherry-pick命令将bugfix分支的修复应用到master分支。
首先,我们查看bugfix分支上的提交历史,找到需要合并的修复提交的哈希值:
$ git log bugfix
commit c9f75087903b5e0dddc901580335bf32e4ca2c25
Author: John Smith <john@example.com>
Date: Fri May 21 12:34:56 2022 -0700
Fix critical bug
commit a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
Author: John Smith <john@example.com>
Date: Thu May 20 09:00:00 2022 -0700
Update documentation
commit 19af05b3654c6d293269c910b58ff9d2d0dbe71f
Author: John Smith <john@example.com>
Date: Wed May 19 15:30:00 2022 -0700
Fix bug in login feature
...
假设我们想把提交c9f75087903b5e0dddc901580335bf32e4ca2c25所修复的bug合并到master分支,可以使用以下命令:
$ git checkout master
$ git cherry-pick c9f75087903b5e0dddc901580335bf32e4ca2c25
这样就将修复bug的提交合并到了master分支中。
4.3 回滚提交
假设我们在开发过程中,发现某个提交引入了问题或者与预期的功能不符,我们需要将该提交从分支中移除。
首先,我们查看分支的提交历史,找到需要回滚的提交的哈希值:
$ git log
commit c9f75087903b5e0dddc901580335bf32e4ca2c25
Author: John Smith <john@example.com>
Date: Fri May 21 12:34:56 2022 -0700
Add new feature
commit a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
Author: Jane Doe <jane@example.com>
Date: Thu May 20 09:00:00 2022 -0700
Update documentation
commit 19af05b3654c6d293269c910b58ff9d2d0dbe71f
Author: John Smith <john@example.com>
Date: Wed May 19 15:30:00 2022 -0700
Fix bug in login feature
...
假设我们想要回滚提交a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde,可以使用以下命令:
$ git revert a4d567342e8b3a9d4e9144c49a7ecb8ed81f7fde
这样就会在分支中创建一个新的提交,将指定的提交的更改撤销。
5. 总结
git cherry-pick命令在管理分支、合并特定提交以及回滚提交中起到了重要的作用。通过它,我们可以方便地将一个分支的特定提交应用到另一个分支,从而更加灵活地管理代码。
在使用git cherry-pick命令时,我们需要先查看提交历史,找到需要选择合并的提交的哈希值。然后,使用git cherry-pick命令将选定的提交合并到当前分支。
需要注意的是,在使用git cherry-pick命令时,可能会出现冲突(conflict)的情况,需要手动解决冲突后才能继续合并。
极客教程