在代码与约会之间,git cherry-pick 为你腾出时间😉

322 阅读6分钟

小明,一个普通的实习生,在一天的忙碌工作中也遇到了很多问题:工作上的一个小错误和无心的提交,让他陷入了困境。幸运的是,在他掌握了Git的一些技巧后,他不仅解决了工作中的问题,还顺利地腾出了时间,去和女神共享那一顿美好的晚餐,而这一切要多亏Gitcherry-pick😉

概念

git cherry-pick 命令允许将一个或多个特定的提交(commit)从某个分支应用到当前分支。与合并(merge)或变基(rebase)不同,cherry-pick 只会应用指定的提交,而不会涉及到整个分支的变更。这使得 cherry-pick 成为一种非常灵活的操作,适用于只需要某些修改而不是整个功能分支的场景。

作用

  • 选择特定提交:从其他分支挑选出单独的提交,而不必合并整个分支。
  • 灵活的操作:可以在多个分支间将某些提交传递过去,避免不必要的冲突或代码遗留。
  • 简化操作:避免合并或变基导致的复杂历史记录,适合对历史记录要求较高的项目。

正常用法

1. git cherry-pick 的基本语法

git cherry-pick <commit-hash>
  • <commit-hash> 是你希望应用的提交的哈希值。
  • git cherry-pick 会把指定提交的修改引入当前分支,并生成一个新的提交。

2. git cherry-pick 的操作步骤

  1. 确保在目标分支:首先,切换到你希望将提交应用到的目标分支(比如 mainfeature)。
git checkout main
  1. 选择需要的提交:找到你需要应用的提交的哈希值(可以通过 git log 查看)。
git log 分支名
  1. 执行cherry-pick:使用 git cherry-pick 命令选择特定的提交。
git cherry-pick <commit-hash>

还可以选择一次性挑选多个提交,这可以通过列出多个提交哈希值实现,或者通过指定一个提交范围。

// 假设需要挑选的提交哈希为 abc1234 和 def5678
git cherry-pick abc1234 def5678
// 或者使用范围挑选多个提交
git cherry-pick abc1234^..def5678
  1. 解决冲突(如果有):如果在应用提交时遇到冲突,Git 会暂停操作,提示你解决冲突。

image.png

解决完冲突后,需要标记为已解决并继续操作。

git add .
git cherry-pick --continue

如果在 cherry-pick 的过程中遇到某些提交无法合并,Git 会提示冲突并暂停操作。可以选择跳过当前提交,继续挑选后续的提交。

git cherry-pick --skip
  1. 推送到远程仓库:完成 cherry-pick 后,记得将变更推送到远程仓库。
git push origin main

应用场景

1. 误提交,用它救场

那天晚上,女神发来一条信息,邀请实习生小明一起吃晚饭。小明同学的心跳不由自主地加速,脑海中闪过无数种可能。 678ce223a496138907b7645026a5d00.jpg

小明忙着回女神信息, 结果手滑把本该提交到分支 b 的功能代码错提交到了分支 a。更糟的是,这个无关代码被好心的同事从分支 a 中删除了,而分支 a 上又进行了新的提交。

现在,需要修复小明的错误提交,有一个朴素的补救方案:找到误提交的代码片段逐个cv回来并提交到正确的分支,可想而知,只要代码片段足够多, 小明为了赶在和女神吃饭前完成任务,可能会把键盘敲出火花。

然而,学会cherry-pick的小明对此不屑一顾,并且用一行代码就完美解决了问题。

// 切换到目标分支 b
git checkout b

// 查看分支 a 的提交历史,找到正确的提交
git log a

// 假设小明的错误提交 SHA 为 abc1234,正确的修复提交 SHA 为 def5678
// 只挑选正确的修复提交应用到 b 分支
git cherry-pick def5678

// 如果存在冲突,解决冲突后继续 cherry-pick
git add .
git cherry-pick --continue

// 推送修复后的提交到远程仓库
git push origin b

2. 赶时间,代码急修

终于要到吃晚饭的时间了,项目的 main 分支已经发布到生产环境,但是小明同学在开发新功能时发现某个 bug 已经被修复并提交到了 feature 分支,而这个修复非常急需应用到 main 分支,不然一会和女神的晚饭就得泡汤了。此时,他就可以使用 git cherry-pick 将该 bug 修复的提交单独应用到 main 分支,而不必合并整个 feature-x 分支。

// 切换到 main 分支
git checkout main

// 查看 feature 分支上的提交历史,找到需要的提交哈希
git log feature

// 假设需要挑选的提交哈希为 abc1234
git cherry-pick abc1234

// 解决冲突(如果有),并完成 cherry-pick
git add .
git cherry-pick --continue

// 推送到远程仓库
git push origin main

3. 多协作,快速提取

就在此时,小明突然想起,目前他还在分支dev上开发一个新功能。而在另一个分支 feat 上,同事曾经提交了一个通用组件,这个组件正好可以在 dev 分支上使用。但是直接合并整个分支,除了通用组件外,其他的改动也会一并带过来,这样做会造成不必要的冲突,甚至影响当前任务的进度。 相信看到这里,大家也能和小明一样快速解决问题——git cherry-pick

git log feat
git checkout dev
git cherry-pick abc1234
git add .
git push origin dev

于是,小明同学的工作完成得飞快,晚餐的约定也如约而至。小明同学兴奋地坐在餐桌旁,心里满是期待。他的女神也如同阳光般灿烂,笑容甜美,仿佛整个世界都在她的笑声中闪耀。 在这个温馨的夜晚,他们不仅享受着美食,更享受着彼此的陪伴。小明感受到了git带给他的一种前所未有的幸福,仿佛整个世界都只剩下他们两个人。 d868ee82977eabf371994f7d2384c4e.jpggit cherry-pick 就像小明同学的魔法小工具,悄悄地帮他完成了一个又一个看似简单却又超级重要的任务✨ 这让他拥有了更多的时间,去见他心中那个特别的人 💖💖💖

tips:注意事项

  1. 避免滥用 cherry-pickgit cherry-pick 在使用时非常强大,但也需要小心。频繁地 cherry-pick 可能导致代码历史变得混乱,并且可能带来冲突和其他维护问题。
  2. 解决冲突时要小心:在 cherry-pick 过程中,如果发生冲突,Git 会暂停操作并要求手动解决冲突。解决冲突时要小心,确保解决后代码依然正常。
  3. 避免重复:如果你需要从一个分支选择多个提交,确保每个提交都是独立且不依赖于其他提交的,这样可以确保提交唯一性。