Git操作:如何将暂存的本地变更应用到最新HEAD提交commit 2?
把Git Stash变更应用到最新Commit的正确姿势
嘿,先帮你澄清一个误区:你觉得git stash apply会让你回到commit 1的旧状态,其实是误解啦!Git只是把你存在stash里、基于commit 1的修改,尝试合并到当前HEAD指向的commit 2上。你产生错觉,大概率是因为stash里的修改和同事的commit 2有重叠,Git提示冲突后,你误以为回到了过去。
下面给你两种靠谱的操作方式,按需选择:
方式一:直接应用Stash(最简单)
这是最常用的办法,Git会自动处理合并逻辑:
- 先确认当前在master分支,且HEAD确实在commit 2上——跑个
git log --oneline就能看到顶部的commit是2的信息。 - 执行命令:
要是你存了多个stash,就指定编号,比如第一个stash用git stash applygit stash apply stash@{0} - 如果碰到冲突,Git会在冲突文件里用
<<<<<<<、=======、>>>>>>>标记冲突内容。你手动修改这些文件,把冲突解决后,用git add <冲突文件名>告诉Git冲突搞定了,之后就能正常提交你的变更啦。
要是你想应用完stash就直接删掉它(避免以后不小心重复应用),把apply换成pop就行:git stash pop,功能完全一样,只是会自动移除已应用的stash记录。
方式二:把Stash转成Commit再合并(适合需要留痕的场景)
如果你担心直接合并冲突不好处理,或者想把stash里的变更做成一个独立的commit再合并到最新分支,可以这么玩:
- 基于当前的commit 2建个临时分支:
(git checkout -b temp-stash-branch HEADHEAD就是当前的commit 2,也可以直接写commit 2的哈希值) - 把stash应用到这个临时分支:
git stash apply - 解决完冲突后,把变更提交成一个正式commit:
git add . git commit -m "还原我之前存到stash的本地修改" - 切回master分支,把临时分支的commit合并过来:
git checkout master git merge temp-stash-branch - 最后删掉临时分支就行:
git branch -d temp-stash-branch
关于Cherry Pick的误区
你提到想用cherry pick,其实这个思路不对哦!Cherry Pick是用来复制已经存在的正式commit到当前分支的,而你的stash只是暂存的工作区/暂存区修改,并不是一个commit,所以cherry pick根本没法直接操作stash里的内容,别在这上面浪费时间啦~
内容的提问来源于stack exchange,提问作者Jia Mu
相关产品推荐
相关产品推荐

