拓冰建站拓冰建站
首页 / 资讯中心 / 正文

first-contributions 项目 Git 分支实操:将提交移动到不同分支的完整指南

first-contributions 项目 Git 分支实操将提交移动到不同分支的完整指南【免费下载链接】first-contributions✨ Help beginners to contribute to open source projects项目地址: https://gitcode.com/gh_mirrors/fi/first-contributions在开源协作中把提交提交到了错误的分支是初学者最常犯的错误之一。本指南基于 first-contributions 仓库中docs/additional-material/git_workflow_scenarios/moving-a-commit-to-a-different-branch.md及其白俄罗斯语翻译版、简体中文翻译版系统讲解两种将提交移动到目标分支的完整操作流程。读完本文你将掌握git reset --soft、git stash、git branch等命令的组合用法能够在不丢失改动的前提下把误提交的更改安全迁移到正确分支。为什么需要移动提交误提交是分支协作的常见事故first-contributions 项目的主旨是帮助初学者完成第一次开源贡献而分支branch正是协作的基石。在why-using-branches.md中强调一条分支本质上是项目历史中的一个指针开发者应该按功能建分支one branch per feature这样才能互不干扰地并行开发。然而实际开发中难免发生如下场景你正在master或main分支上工作你完成了修改并执行了git commit提交之后你才猛然发现这些更改本应属于另一个功能分支。此时提交已经落在了错误的分支上需要把它搬走。本教程覆盖的正是这一场景的两种解法将最近的提交移动到已有的分支目标分支已经存在将最近的提交移动到新建的分支需要先创建目标分支。两个方案都以本地、未推送unpushed的提交为适用前提操作安全、可逆是 additional-material 索引 中推荐的进阶 Git 技巧之一。场景一将最近的提交移动到已有的分支这是最典型的误提交场景提交已落在master上而正确的功能分支例如name-of-the-correct-branch已经存在。步骤如下。完整命令序列# 1. 撤销最近一次提交但保留更改在工作区 git reset HEAD~ --soft # 2. 记录暂存当前工作目录的状态 git stash # 3. 切换到正确的分支 git checkout name-of-the-correct-branch # 4. 恢复最近一次暂存的更改 git stash pop # 5. 将更改加入暂存区也可以逐个添加文件 git add . # 6. 在新的分支上重新提交 git commit -m your message here执行完毕后你的更改就位于正确的分支上了。每条命令的作用与原理git reset HEAD~ --soft— 撤销最后一次提交但保留更改HEAD~表示当前分支最新提交的父提交即倒数第二个提交。--soft模式只移动分支指针不触碰暂存区和工作区因此被撤销提交里的全部更改依然可用。这里git reset的语义与仓库中 resetting-a-commit.md 的描述一致reset将仓库移回之前的提交点而--soft保证改动回到工作区而不是被丢弃。注意该命令中HEAD与~之间有无空格均可HEAD~与HEAD ~等价但建议按git reset HEAD~ --soft书写以免混淆。git stash— 记录当前目录状态git stash会把工作区中未提交的更改保存到栈中并让工作目录恢复干净。这一步是搬家前的必要准备Git 不允许在带有未提交更改的情况下随意切换分支而 stash 恰好解决了代码没写完、不想提交、但又必须切换分支的困境详见仓库中的 stashing-a-file.md。git checkout name-of-the-correct-branch— 切换到正确分支此时工作区已经干净可以安全地切换到目标分支。git stash pop— 恢复最近一次暂存的更改pop会把栈顶的暂存内容重新应用到当前工作区并从栈中删除该条记录与只应用不删除的git stash apply不同。根据 stashing-a-file.md 的说明stash 可以在不同分支间搬家在一个分支暂存、切到另一个分支后再恢复这正是本流程能成立的关键。如果目标分支上已有冲突性修改pop时 Git 会报告合并冲突需要手动解决。git add .— 暂存更改将恢复出来的更改加入暂存区。原文档特别注明或者尝试单独添加文件——若更改涉及多个文件更稳妥的做法是逐个git add file避免把无关文件一并提交。git commit -m your message here— 提交更改最后在正确的分支上以合适的提交信息重新完成提交。一个完整的操作示例# 当前位于 master 分支且刚提交了一个本应属于 feature/login 的更改 $ git log --oneline a1b2c3d Add login form validation # ← 误提交 # 步骤 1撤销提交但保留更改 $ git reset HEAD~ --soft # 步骤 2暂存更改 $ git stash Saved working directory and index state WIP on master: ... # 步骤 3切换到正确分支 $ git checkout feature/login Switched to branch feature/login # 步骤 4恢复暂存内容 $ git stash pop # 步骤 5暂存并提交 $ git add . $ git commit -m Add login form validation至此a1b2c3d对应的更改已完整迁移到feature/login而master上不再包含该提交。场景二将最近的提交移动到新建的分支当正确的分支尚不存在时无需先手动创建再执行场景一的流程可以直接利用分支是指向提交的指针这一特性让新分支接管现有的提交。完整命令序列# 1. 创建新分支保留当前分支上的所有提交 git branch newbranch # 2. 将当前分支回退 n 个提交 git reset --hard HEAD~n # 3. 切换到新创建的分支 git checkout newbranch原理拆解为什么这能把提交搬走git branch newbranch— 创建指向当前提交的新分支正如 why-using-branches.md 所讲分支只是指向特定提交的指针。git branch newbranch在当前HEAD指向的提交上创建一个新指针newbranch该分支因此拥有了当前分支上的全部提交而当前分支如master的指针保持不变。git reset --hard HEAD~n— 将当前分支回退 n 个提交HEAD~n表示当前分支往前数第 n 个提交HEAD~1等价于HEAD~。--hard模式会同时重置暂存区和工作区把这 n 个提交从当前分支的历史中彻底移除。原文档白俄罗斯语版特别提醒这些提交所包含的更改将完全从当前分支删除。值得注意的是--hard的破坏性语义在仓库中有多处印证undoing-a-commit.md 指出git reset --hard HEAD~2在回退分支指针的同时撤销所有更改并从项目历史中移除快照resetting-a-branch.md 则说明--hard会忽略所有已暂存或未暂存的更改。然而在本流程中删除发生在master一侧而提交对象本身仍然被newbranch引用着所以提交并没有真正丢失只是换了归属——这正是该方案的精妙之处。git checkout newbranch— 切换到新分支此时newbranch指向原提交所有被搬走的提交都在这个新分支上而原来的master分支则回到了 n 个提交之前的状态。一个完整的操作示例假设master上有 3 个本应属于新功能分支的提交需要全部搬走# 当前在 master最近 3 个提交都属于新功能 $ git log --oneline d4e5f6a feat: add settings page c3d4e5f feat: add user profile b2c3d4e feat: add dashboard a1b2c3d initial commit # 步骤 1创建新分支接管全部提交 $ git branch feature/settings # 步骤 2将 master 回退 3 个提交b2c3d4e 之后 $ git reset --hard HEAD~3 # 步骤 3切换到新分支 $ git checkout feature/settings # 现在 feature/settings 拥有 3 个功能提交master 回到 a1b2c3d⚠️ 重要警告未提交的更改会丢失原文档在本节末尾明确强调任何未包含在提交中的更改将会完全丢失LOST。因为git reset --hard会连同工作区一起重置如果你在执行--hard前还有未提交的修改这些修改将无法找回。因此在执行本方案前请务必先运行git status确认工作区干净或先用git stash保护未提交的更改。两种方案的对比与选择对比维度场景一已有分支场景二新建分支目标分支状态已存在不存在需创建核心命令reset --softstashcheckoutstash popbranchreset --hardcheckout对提交的处理撤销并重新提交提交哈希会改变提交对象被新分支接管哈希不变对未提交更改被stash保护安全--hard会直接丢弃有风险适用前提提交未推送、更改可重新提交提交未推送、工作区干净简单来说目标分支已存在用场景一更温和全程不丢数据需要新建分支用场景二更简洁但务必确认没有未提交的更改。两个方案的共同前提与延伸阅读仅适用于未推送的本地提交。如果误提交的内容已经git push到远端共享仓库reset --hard会改写历史并给其他协作者带来麻烦此时应改用仓库中 reverting-a-commit.md 讲解的git revert方案新增一个反向提交不改写历史。想深入了解reset三种模式--soft/ 默认 /--hard对暂存区和工作区的不同影响可阅读 undoing-a-commit.md 与 resetting-a-commit.md。stash 的完整机制apply、list、drop、branch等进阶用法见 stashing-a-file.md。移动完成后若需要删除残留的旧分支参考 removing-branch-from-your-repository.md。掌握将提交移动到不同分支这一技能等于掌握了分支协作中最实用的纠错手段。无论是继续参与 first-contributions 的开源贡献流程还是在日常项目中维护多分支开发这套命令组合都能让你在误提交后从容补救而不是慌乱地重做一遍。【免费下载链接】first-contributions✨ Help beginners to contribute to open source projects项目地址: https://gitcode.com/gh_mirrors/fi/first-contributions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门