Git如何修改一个过去的Commit

假设我的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 对文件进行修改。

那么需要进行如下操作:

  1. 将当前分支无关的工作状态进行暂存

     git stash
    
  2. 将HEAD移动到需要修改的commit上

     git rebase eb69bff96^ --interactive
    
  3. 找到需要修改的 commit ,将首行的 pick 改成 edit 后保存

  4. 开始修改文件内容

  5. 将改动文件添加到残存

     git add
    
  6. 追加改动到提交

     git commit --amend
    
  7. 移动HEAD 回到最新的commit

     git rebase --continue
    
  8. 恢复之前的工作状态

     git stash pop
    

有什么用

最现实的用处是如果你不小心把密码等敏感信息上传了,需要删掉,但后面又已经有新的commit信息你又不希望丢掉的时候,这个方法就派上用场了。

我的使用场景则是在github上翻译文档,希望能保证每个commit都是原文和译文的对照,方便他人觉得译文有问题的时候能快速获取原文。

而译文的多次修改如果分开提commit的话会让寻找原文变得很麻烦。

缺点

被修改分支后的所有commit都会被重新提交一遍,此时master分支merge这个分支的话会出现commit重复的问题。所以也只能在没有其他分支的情况下在主分支干这事。

posted @ 2018-11-14 00:38  暮晨  阅读(4235)  评论(0编辑  收藏  举报

Aaron Swartz was and will always be a hero