假设我的git log 如下:
commit 5511533dda6fee6982175fafca1f4bd5692e3d9c (HEAD -> trans, origin/trans)
Author: 暮晨 <362864550@qq.com>
Date: Tue Nov 13 23:57:05 2018 +0800
EX.is is not what it is
commit eff078c67243a71a5ef645ddadfdaef2f374eff1
Author: 暮晨 <362864550@qq.com>
Date: Sat Nov 10 23:22:19 2018 +0800
EX.Time for some hash brownies
commit eb69bff965ee57c5047afc4f615c10462c42566a
Author: 暮晨 <362864550@qq.com>
Date: Sat Nov 10 17:41:55 2018 +0800
EX.Strings can be tricky sometimes
我现在需要回到第一个commit eb69bff96 对文件进行修改。
那么需要进行如下操作:
-
将当前分支无关的工作状态进行暂存
git stash
-
将HEAD移动到需要修改的commit上
git rebase eb69bff96^ --interactive
-
找到需要修改的 commit ,将首行的
pick
改成edit
后保存 -
开始修改文件内容
-
将改动文件添加到残存
git add
-
追加改动到提交
git commit --amend
-
移动HEAD 回到最新的commit
git rebase --continue
-
恢复之前的工作状态
git stash pop
有什么用
最现实的用处是如果你不小心把密码等敏感信息上传了,需要删掉,但后面又已经有新的commit信息你又不希望丢掉的时候,这个方法就派上用场了。
我的使用场景则是在github上翻译文档,希望能保证每个commit都是原文和译文的对照,方便他人觉得译文有问题的时候能快速获取原文。
而译文的多次修改如果分开提commit的话会让寻找原文变得很麻烦。
缺点
被修改分支后的所有commit都会被重新提交一遍,此时master分支merge这个分支的话会出现commit重复的问题。所以也只能在没有其他分支的情况下在主分支干这事。