成为git砖家(9): rebase进阶: 拆分commit为多个

问题描述

当一次性 git add 了多个修改点, 并且快速的执行了 git commit 后, 你觉得有点懊恼: 明明可以独立为两次或多次 commit, 揉在一块导致历史记录不太清晰。

比如我在 nn1 这个练手项目中, 最近一次 commit, 增加了三个函数:

  • evaluate()
  • test_softmax()
  • accuracy()

git commit 后我后悔了,想要拆解为3次 commit,每次一个函数。

我们知道,对于已经存在的多个commit如果要合并起来,那么 rebase 是相当简单的。拆分 commit 呢? 也是可以用 rebase 来做的,用到的是 edit 这个动作。随后恢复暂存区,重新按需add和commit代码。

具体操作

  1. 备份现有代码到新的分支
    这一步是防止 git 操作失误。 其实熟练了可以省略,因为后续修改如果中途不满意可以 git rebase --abort
bash 复制代码
git checkout backup
  1. rebase到需要修改的commit的前一次commit

例如我最近一次 commit 需要被拆分, 它是 HEAD; 它的上一次commit用 HEAD~ 来表示:

bash 复制代码
git rebase -i HEAD~
  1. 把 edit 改为 pick
bash 复制代码
pick f29f90e 理解argmax; 理解accuracy

改为

bash 复制代码
edit f29f90e 理解argmax; 理解accuracy
  1. 恢复整个git工作区到文件已经修改了、尚未 git add 的状态

    复制代码
        --mixed
            Resets the index but not the working tree (i.e., the changed
            files are preserved but not marked for commit) and reports what
            has not been updated. This is the default action.
bash 复制代码
git reset HEAD~
  1. 手动添加文件中的一部分
    可以使用 git add -p xxx_file, 也可以用 vscode 图形界面操作, 选中代码区域后右键选择 Staging Selected Ranges
  1. 执行 git status 查看内容

确实生效了,增加了一个新的 commit "理解 argmax":

  1. 重复 git add, git commit 动作, 直到满意

  2. 执行 git commit --continue, 来告诉 git 你完成了 rebase 操作

  3. 最终查看效果

相关推荐
承渊政道6 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
Doro再努力6 小时前
【Linux操作系统12】Git版本控制与GDB调试:从入门到实践
linux·运维·服务器·git·vim
摇滚侠9 小时前
MAC IDEA GIT 提交区显示了几个不存在的目录
git·idea
城东10 小时前
Git使用[远程仓库远端的head比本地和提交的head旧,其他人拉不到最新代码]
git·head·远程仓库远端·比本地和提交的head旧·其他人拉不到最新代码
何中应19 小时前
使用SSH地址拉取远程仓库代码报下面的错误
git
何中应19 小时前
Git本地仓库命令补充
git
sun00770020 小时前
执行repo sync -c -d -j4以后,提交未git push的代码看不到了。要怎么恢复?
git
胖虎11 天前
Git 一个本地仓库同时推送到两个远程仓库(详细教程)
git·多远程仓库·双远程仓库·git双远程·git备份
春日见1 天前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
stevenzqzq2 天前
git 常用操作
大数据·git