如何将已被回退的历史commit改动重新导入当前HEAD的worktree?
方案1:使用git cherry-pick无提交模式(最推荐)
- 第一步找到你要恢复的旧commit哈希值,记为
<OLD_COMMIT_HASH> - 执行命令:
git cherry-pick -n <OLD_COMMIT_HASH>- 参数
-n(等价于--no-commit)的作用是仅将该commit的改动应用到当前工作区和暂存区,不会自动生成新提交
- 参数
- 如果你希望改动完全处于未暂存的已修改状态(方便逐文件检查修改),再执行一次
git reset即可,此时运行git status就会看到所有改动都是未暂存的修改状态 - 如果应用过程中出现冲突,按照提示解决冲突即可,冲突解决后不需要执行
cherry-pick --continue,直接处理改动即可
方案2:使用git diff + git apply组合
如果不想使用cherry-pick,也可以通过导出补丁的方式应用改动:
- 导出旧commit的改动补丁:
git diff <OLD_COMMIT_HASH>^ <OLD_COMMIT_HASH> > old_commit.patch - 将补丁应用到当前工作区:
git apply old_commit.patch - 如果存在冲突,命令行将直接提示冲突位置,手动修正即可,应用完成后所有改动默认都是未暂存的已修改状态
- 验证完成后可以删除临时补丁文件:
rm old_commit.patch
注意事项
- 两种方案都不会自动生成新commit,你可以在改动完全检查修复完成后,再手动执行
git add、git commit提交新的修复版本 - 冲突解决时如果某个文件改动冲突太多不想保留,直接执行
git checkout HEAD -- <冲突文件名>就能恢复该文件到当前HEAD的状态,丢弃该文件的旧commit改动
内容的提问来源于stack exchange,提问作者Eljay
相关产品推荐
相关产品推荐

