能否将历史提交cherry pick至stash且不影响当前代码状态?
如何将指定Commit的变更存入Stash且不干扰当前代码状态
完全可行,以下是两种无需干扰当前代码状态的实现方法:
方法一:利用git cherry-pick -n + git stash push
这种方法通过将目标Commit的变更应用到工作区但不提交,再存入Stash:
- 第一步:确保当前工作区/暂存区处于干净状态(执行
git status验证,显示nothing to commit, working tree clean) - 第二步:执行
git cherry-pick -n <commit-hash1> <commit-hash2>,其中-n参数表示「仅应用变更,不自动生成新Commit」,可以同时指定多个目标Commit的哈希值 - 第三步:将这些变更存入Stash:
git stash push -m "自定义描述:比如来自Commit abc123、def456的变更" - 执行完后,工作区会自动恢复到操作前的干净状态,目标Commit的变更已被存入Stash
方法二:利用git diff生成补丁并应用后存入Stash
这种方法通过生成目标Commit的差异补丁,应用到暂存区后再存入Stash:
- 单个Commit的情况:
- 生成目标Commit与父Commit的差异补丁并应用到暂存区:
git diff <commit-hash>^ <commit-hash> | git apply --index - 存入Stash:
git stash push -m "来自Commit abc123的变更"
- 生成目标Commit与父Commit的差异补丁并应用到暂存区:
- 连续多个Commit的情况:
- 生成起始Commit到结束Commit的差异补丁并应用到暂存区:
git diff <起始commit-hash> <结束commit-hash> | git apply --index - 存入Stash:
git stash push -m "来自Commit abc123到def456的变更"
- 生成起始Commit到结束Commit的差异补丁并应用到暂存区:
注意事项
- 操作前务必保证工作区干净,避免现有变更与目标Commit的变更产生冲突
- 如果目标Commit之间存在依赖或冲突,
cherry-pick或git apply会提示冲突,需要手动解决冲突后再执行Stash操作 - 后续可以通过
git stash list查看所有保存的Stash,使用git stash apply stash@{n}(保留Stash)或git stash pop stash@{n}(移除Stash)将变更应用到任意分支
内容的提问来源于stack exchange,提问作者Karol Selak
相关产品推荐
相关产品推荐

