Git如何仅暂存部分未提交变更?分支回传场景实操问询
嘿,这个场景我简直太熟悉了!很多时候在master分支做大型开发时,突然发现有些紧急修复得先回退到bugfix分支,又不想打乱当前master的进度。我给你分享两种靠谱的方法,保证你的master分支原封不动,还能精准把需要的变更提交到bugfix分支。
方法一:用Stash+交互式Patch应用(推荐,步骤更简洁)
这是我平时最常用的方法,能快速精准地挑选要转移的变更:
步骤1:临时暂存master的所有未完成变更
先把你在master上的所有修改(包括工作区和暂存区)都临时存起来,让master回到干净状态,方便后续切换分支:git stash push -m "master未完成的重大变更"加个备注是为了之后能快速识别这个stash,避免和其他stash混淆。
步骤2:切换到bugfix分支
切到你要提交backport内容的分支,如果是远程分支记得先拉最新版本:git checkout bugfix # 可选:拉取远程最新的bugfix分支 git pull origin bugfix步骤3:交互式选择要backport的变更
现在从刚才的stash里只提取需要的部分变更到bugfix分支,用patch模式实现精准选择:git stash show -p stash@{0} | git apply --patch执行后Git会逐个显示变更的代码块(hunk),并给出选项:
y:应用这个代码块n:跳过这个代码块s:把大的代码块拆成更小的部分再选择(适合精细调整)q:直接退出,不再处理后续内容
跟着提示选完,你需要的变更就会出现在bugfix分支的工作区里。
步骤4:提交到bugfix分支
把选中的变更暂存并提交,记得写清晰的commit信息:git add . # 也可以指定具体文件,比如git add src/utils.js git commit -m "backport: 修复XX问题的核心逻辑"步骤5:回到master并恢复原变更
切回master分支,然后把之前暂存的所有变更恢复,完全回到你操作前的状态:git checkout master git stash popgit stash pop会把stash里的内容恢复到当前分支,同时移除这个stash,完美还原你的工作现场。
方法二:直接在master分支暂存部分变更再转移
如果你不想用stash,也可以直接在master分支操作,适合习惯手动管理暂存区的同学:
步骤1:交互式暂存需要backport的内容
用git add -p命令,手动选择要暂存的变更:git add -p同样会逐个显示代码块让你选择是否暂存,选完后,这些内容会进入暂存区,剩下的变更留在工作区。
步骤2:暂存工作区的剩余变更
用--keep-index参数把工作区未暂存的变更存到stash,同时保留暂存区的内容:git stash push --keep-index -m "master未暂存的剩余变更"步骤3:创建临时提交(方便转移)
为了把暂存区的内容转移到bugfix分支,先在master做一个临时提交:git commit -m "temp: 待backport的变更"步骤4:切换到bugfix分支并转移临时提交
切到bugfix分支,用cherry-pick把刚才的临时提交拿过来:git checkout bugfix # 用git log --oneline找到临时提交的哈希值,比如abc123 git cherry-pick abc123步骤5:回到master,撤销临时提交
切回master,撤销刚才的临时提交,让暂存区恢复到之前的状态:git checkout master git reset HEAD~1步骤6:恢复工作区的剩余变更
把之前stash的未暂存变更恢复,回到最初的工作状态:git stash pop
一些小提醒
- 操作前记得用
git status确认当前分支的状态,避免误操作; - 如果在patch应用或cherry-pick时出现冲突,Git会提示你解决,解决后用
git add标记冲突已解决,再继续后续步骤; - 第一种方法步骤更少,出错概率更低,更推荐新手使用。
内容的提问来源于stack exchange,提问作者Bill

