【Git 篇】使用 git rebase 交互式合并提交

branch_xx 分支中: git log 显示:

js 复制代码
commit a3c3e1b6c5207b89bc9c16b78f30f4fe1c88d5a9
Author: Your Name <youremail@example.com>
Date:   Mon Jan 1 12:34:56 2025 +0000

    fix: issues

commit b9c3d7a9f93ab9d17e0239b91bc0930533e2d983
Author: Another Dev22 <anotherdev22@example.com>
Date:   Sun Dec 31 11:22:33 2024 +0000

    Fix issue 

commit 1s2w3dea9f93ab9d17e0239b91bc0930533e2d983
Author: liqiang <liqiang@example.com>
Date:   Sun Dec 30 10:22:33 2024 +0000

    chore: Replace the name

想把 " chore: Replace the name " 这个提交跟之前的提交一起 merge 到Develop 上, 有哪些办法?

将提交 chore: Replace the name1s2w3dea9f93ab9d17e0239b91bc0930533e2d983)和它之前的提交一起合并到 Develop 分支上,这可以通过几种方式实现。以下是几种方法:

方法 1:使用 git rebase 交互式合并提交

通过交互式 rebase,可以选择将提交合并成一个提交并推送到 Develop 分支上。

步骤:

  1. 切换到 branch_123 分支

    git checkout branch_123
    
  2. 启动交互式 rebase : 假设想将最后三个提交合并成一个提交,并推送到 Develop,可以执行:

    css 复制代码
    git rebase -i HEAD~3
  3. 选择合并提交: Git 会打开一个编辑器,列出最后三个提交:

    yaml 复制代码
    pick 1s2w3d chore: Replace the name
    pick b9c3d7a Fix issue
    pick a3c3e1b fix: sonar issues

    pick 改为 squash(或缩写为 s)在第二行和第三行:

    yaml 复制代码
    pick 1s2w3d chore: Replace the name
    squash b9c3d7a Fix issue
    squash a3c3e1b fix: sonar issues

    这样就将这三个提交合并成一个提交。

  4. 保存并退出编辑器: 这时 Git 会自动将这三个提交合并,并打开一个新的编辑器,允许你编辑合并后的提交消息。

  5. 确认提交信息并完成 rebase: 编辑合并后的提交消息,保存并退出编辑器,Git 会完成合并操作。

  6. 推送到 Develop 分支 : 可以使用 git push 将更改推送到远程的 branch_123,然后创建一个 PR 合并到 Develop

方法 2:使用 git merge 将单个提交合并到 Develop

如果不想将多个提交合并成一个提交,而是想只将 chore: Replace the name 这个提交合并到 Develop 分支,可以使用以下方法:

步骤:

  1. 切换到 Develop 分支

    git checkout Develop
    
  2. 通过 cherry-pick 提交 : 通过 git cherry-pick 将想合并的提交(例如 1s2w3dea9f93ab9d17e0239b91bc0930533e2d983)合并到 Develop 分支。

    git cherry-pick 1s2w3dea9f93ab9d17e0239b91bc0930533e2d983
    

    这样就只会把这个单独的提交合并到 Develop

  3. 推送更改: 合并完后,可以推送到远程仓库:

    perl 复制代码
    git push origin Develop

方法 3:使用 git resetgit commit 重新提交

如果希望完全重写提交的历史,可以使用 git resetgit commit 来重新提交你的更改。

步骤:

  1. 切换到 branch_123 分支

    git checkout branch_123
    
  2. 使用 git reset 软重置 : 使用 git reset --soft 来重置到 1s2w3dea9f93ab9d17e0239b91bc0930533e2d983 提交之前的状态,并将更改保留在暂存区。

    css 复制代码
    git reset --soft HEAD~1
  3. 重新提交 : 这时会将所有变更放回暂存区,可以通过 git commit 创建一个新的合并提交。

    sql 复制代码
    git commit -m "Merge chore: Replace the name and previous fixes"
  4. 将更改推送到 Develop : 最后,可以将更改推送到远程的 Develop 分支。

    perl 复制代码
    git push origin Develop

总结

  • 方法 1 :使用 git rebase -i 来交互式合并提交,这可以将多个提交合并为一个提交。
  • 方法 2 :使用 git cherry-pick 来单独选择并合并特定的提交。
  • 方法 3 :使用 git reset --softgit commit 来重新组织和提交更改。

在多部门以及跨国合作的项目中,涉及到多个开发人员和团队,合理管理和维护代码历史、确保代码合并和冲突处理的顺利进行是非常重要的。不同的方法有不同的适用场景,以下是对三种方法的具体建议:

1. 使用 git rebase -i 合并提交(推荐)

适用场景:

  • 清理提交历史 :当希望合并多个提交(例如解决不同问题的提交)并保持干净的历史记录时,git rebase -i 是一种非常有效的方法。它允许你选择性地合并提交,避免了无关的杂乱历史。
  • 团队合作时需要保持清晰的提交记录:在跨国合作中,各个开发人员的代码提交可能会被不同的团队成员查看,保持简洁明了的提交历史有助于减少混淆,尤其是在回溯查找问题时。
  • 避免冗余的合并提交git rebase -i 可以将多个提交合并成一个提交,避免了多次合并产生的复杂历史。

优点:

  • 提交历史清晰,避免了不必要的合并提交。
  • 有助于维护简洁且整洁的 Git 历史,便于后续审查和追溯。

缺点:

  • 如果在多人协作环境中,进行 rebase 可能会导致需要强制推送(--force),这可能会影响其他开发者的工作。
  • 需要小心操作,尤其是在已经推送到远程仓库的情况下,可能会导致冲突。

建议:

  • 如果你希望保持整洁的提交历史并且与团队达成一致,使用 git rebase -i 是一个理想的选择。建议在团队内建立使用 rebase 的规范,避免多人同时对同一提交进行 rebase 操作,从而导致冲突。

2. 使用 git cherry-pick 合并特定提交(适合)

适用场景:

  • 选择性地合并某个特定提交git cherry-pick 适用于从其他分支中选择一个提交,并将它合并到当前分支。这对于从多个开发人员的工作中选择特定的功能或修复非常有用。
  • 处理单个提交 :如果你仅仅想合并一个单独的提交,而不希望合并其他提交(例如只想保留 chore: Replace the name 这个提交),cherry-pick 是一个合适的选择。
  • 跨团队的功能回溯或修复 :当某个团队需要回溯并引入另一个团队的修复时,git cherry-pick 非常有用,它避免了合并整个分支带来的潜在冲突。

优点:

  • 可以精确地选择合并哪些提交。
  • 适用于跨分支、跨团队的需求,能够单独处理特定的变更。

缺点:

  • 如果不小心,可能会造成提交记录中重复的内容,尤其是在多个 cherry-pick 时,容易导致复杂的历史。
  • 在跨国团队合作中,cherry-pick 操作如果没有明确记录,可能导致相同的功能被多次合并。

建议:

  • git cherry-pick 是在跨国合作时非常实用的工具,特别是在你只需要从其他分支引入一个特定的修复或功能时。
  • 使用时应确保团队之间有良好的沟通,避免重复合并相同的提交,建议在操作后同步记录。

3. 使用 git reset --softgit commit 来重新提交(不太推荐)

适用场景:

  • 临时调整提交历史git reset --soft 可以用来临时调整提交历史,保留工作区的更改,但这种操作更多适用于本地开发环境。
  • 修正提交并重新提交 :当你需要撤销某个提交,但希望保留这些变更并重新组织后提交时,可以使用 git reset。但这通常是在本地开发中比较常见,在跨国团队合作中,不推荐频繁使用。

优点:

  • 适用于修正错误的提交,允许你在提交之前调整变更。
  • 保留了本地的修改和变更,可以自由重构提交内容。

缺点:

  • 如果已经将提交推送到远程仓库,git reset 会导致历史不同步,可能需要强制推送,这在团队协作中可能会引发问题。
  • 容易导致团队成员之间的冲突,特别是当多个开发者都在相同的基础上工作时。

建议:

  • 不推荐 在跨国合作项目中使用 git reset 来修改提交历史,除非是在本地开发环境进行临时操作。团队中的成员应避免使用 reset 后再推送到远程,因为它会更改提交历史,可能影响其他人的工作。
  • 如果必须使用,确保团队成员已经协商一致,并且理解可能带来的风险。

总结建议

对于跨国合作项目,推荐使用 git rebase -igit cherry-pick,具体选择依据以下情况:

  • 如果你希望保持历史简洁、整洁,避免冗余提交,推荐使用 git rebase -i,特别是在修复历史提交时。
  • 如果你只想合并特定的提交,且不需要合并其他提交或更改历史,推荐使用 git cherry-pick
  • git reset --soft 用于本地调整提交并重新提交,但在跨国合作中应尽量避免,因为它可能会导致同步问题。
相关推荐
小华同学ai3 小时前
GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢
vue.js·elementui·github·echarts
几度春风里10 小时前
Git代码管理工具 — 5 GitHub远程仓库
git·github
我码玄黄12 小时前
Gridstack.js:打造响应式仪表盘的利器
前端·javascript·github·开源软件
玩电脑的辣条哥13 小时前
如何将自己本地项目开源到github上?
大模型·github·api·ollama
缘友一世1 天前
.gitignore配置忽略out目录
git·idea
草梅友仁1 天前
程序员和非程序员都该学的 AI 自编程入门指南 | 2025 年第 3 周草梅周报
开源·github·aigc
想努力找到前端实习的呆呆鸟1 天前
学习笔记 使用git工具管理自己的项目代码
git·后端
小豆豆儿1 天前
【PyCharm】连接 Git
git·elasticsearch·pycharm
小白也有IT梦1 天前
Git 版本控制:.gitignore 文件完全指南
git·github