为了能让博客更灵动、更有趣,特在此设立了一个广告位~

Git 版本控制学习 stash 与cherry-pick的妙用

8次阅读
没有评论

共计 1884 个字符,预计需要花费 5 分钟才能阅读完成。

看一个工作场景:我一次性开发了多个部分。

基于 feature/share-all 分支开发了「分享功能」(包含:分享按钮开发 + 分享面板样式优化 + 分享数据逻辑),已提 PR 但审核者反馈「代码量太大,拆分审核」。
你需要先把「仅分享面板样式优化」的少量修改(对应提交 ID:8a9b7c6)拆分出来单独提 PR,剩余修改保留在 feature/share-all 分支后续提交。

已知,三个部分我们都在开发完毕后 分别执行了 git add . 以及git commit -m “feat: xxx” 这三个提交各自有一个 commit id。

我们会这样操作

 git checkout main   // 切换到主分支
git pull origin main    // 先拉取远程仓库 main 分支最新的代码 这是保险起见,先同步一下

git status   // 查看是否有未提交的记录
git stash save "暂存工作区代码到 stash 栈 先处理其他分支代码"

git branch -b feature/share-panel-style  // 创建并切换到新的分支 名叫 feature/share-panel-style 
git cherry-pick 8a9b7c6       // 将指定 commit 记录复制到当前分支下 不包括该 commit 的上下文内容  这确保 我们只想要在当前分支下只保留 [ 分享面板样式优化] 相关的代码  
// 然后我们进行
git push -u origin feature/share-panel-style   // 推送该 代码变更 并且 令远程仓库与当前仓库的分支建立追踪

git checkout main
git stash apply / pop  // 选择 apply 或者 pop 看需求

我们这里主要使用了 git stash 以及 git cherry-pick 两个进阶的 git 能力

先说 stash

stash 在当前 git 仓库下 是一个全局的 栈结构 ,它主要解决 用以 存储我们还没提交的代码,但我们现在急需处理其他分支的代码。

栈结构,那么我们每次 git stash save 都会按顺序将代码记录 压入栈,每个记录都有一个 id 作为标识。

我们在 main 分支下 正在开发代码,但现在需要处理其他分支的代码,我们将工作区代码先压入一个全局的 stash 栈,然后切换其他分支 进行其他处理。

当我们处理完毕 再回到 main 分支,再通过 git stash pop /apply 将栈顶刚才我们暂存的代码拿出来到工作区继续开发。

这里要选择使用 pop 和 apply,区别在于,pop 会将代码拿回工作区 但会删除该记录,意味着拿出来以后 栈里面就没有了

而 apply 时,会将代码拿回工作区,但栈里还有该记录,当你切换其他分支 仍然可以使用 git stash apply 将某代码记录 拿出来放在工作区,这 实现了代码的复用

我们想查看栈里面有哪些代码记录 可以使用 git stash list

stash@{0}: On feature/B: feature/B:修改 file3.ts
stash@{1}: On feature/A: feature/A:修改 file2.ts
stash@{2}: On main: main:修改 file1.ts

我们也可以通过 git stash apply stash@{n} 的方式指定某个代码记录的 id 将其拿回工作区,而 不会因为 stash 是栈结构的原因 存在”只能先进后厨“的限制

stash 是全局的,不跟任何分支有关联,而只和「你当前在哪个分支执行 pop」有关。

所以 可以代码复用 特别方便。

再说 cherry-pick

我们使用 git cherry-pick commit_id 的方式 将该次 commit 的代码记录直接复制,前提是我们已经切换到了一个分支下。而且 仅仅复制该次 commit 对应的修改过的 代码。这保证 我们 提交记录非常干净。

因为在这个场景中,我们只想在新的分支,把 某次提交的代码拿过来 单独进行 pr(pull request)

举例来说,代码仓库有 masterfeature两个分支。


    a - b - c - d   Master
         \
           e - f - g Feature

现在将提交 f 应用到 master 分支。


# 切换到 master 分支
$ git checkout master

# Cherry pick 操作
$ git cherry-pick f

上面的操作完成以后,代码库就变成了下面的样子。


    a - b - c - d - f   Master
         \
           e - f - g Feature

它也支持同时转移多个 commit 对应的代码

git cherry-pick <HashA> <HashB>

好,现在我们讲清楚了 git stash 与 cherry-pick 的一些用法

关于这两个功能命令,其还有其他的参数 可自行查阅使用。

我们学习东西在学明白其主要用途 那么其更多的参数当然也可以 触类旁通的使用和学习!

正文完
文章二维码
post-qrcode
 0
xyblog
版权声明:本站原创文章,由 xyblog 于2026-02-05发表,共计1884字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
这是全站底部广告位