使用Magit修改历史提交
年中的时候搞了个比特币套利的bot,后来工作比较忙,没时间维护,想着放到 GitHub
上开源了吧,也许会有帮助。
结果忘记了个大事情,测试代码里有我的 key pair。大意了,整个repo删掉了。但是问题 来了,怎么才能修改一个历史上的 commit 呢。
修改当前Commit
熟悉 Git 的同学应该对这个都会比较熟悉,直接用 git commit --amend 就搞定了,
新的提交会被加到最近(也就是 HEAD)里。如果用 Magit 的话,好像是更简单了,只
需要 c a 就可以。
修改历史 Commit
而对我来说事情并非如此。
7e57bf60 * origin/coinex fcoindiff origin/fcoindiff change some exchange structure more general
df7857ef * implement coinex api
7941ccc4 * v0.01 master origin/master orderbook basic works
efebf494 * main function
25cd968e * time window
250a4e0c * simple order book manager
e79f35fa * implement fcoin api
4c3917c8 * first commit
需要修改的 commit 为倒数第二个,Magit 中也没有提供一个直接的命令来做这个操作。
所以这个操作需要多个步骤:
- 将这个历史的
commit放置到HEAD - 修改
HEAD - 将
HEAD放回。
这个时候就需要 rebase 帮忙了。在 Magit 中, r m 启动 edit a commit 之后
C-c C-c 选中需要改的 commit, 之后 git 就会完成 rewind 操作将历史中的这个
commit 放在head 上,此时 status 中给出:
Rebasing master onto test~5
pick 7941ccc4 orderbook basic works
pick efebf494 main function
pick 25cd968e time window
pick 250a4e0c simple order book manager
stop e79f35fa implement fcoin api
onto 4c3917c8 first commit
之后更改需要更改的文件,c a 提交打现在的 HEAD 实际上也就是 e79f35fa 中,然
后 r r 执行 rebase --continue 如果没有冲突的话就搞定了。
另外一种修复方式
上面说的这种操作稍微复杂一些,但是好处在于可以彻底删除 git 中留存的信息。如果
只是需要对某个历史修复做修改而非要彻底删除,可以使用 git 中的 git commit
--fixup A 操作,对应到 Magit 中为 c f。此命令会将改动生成一个新的 commit
添加到代码树中。
Magit Rocks
Magit 真是个好东西