git后悔药

Creative Commons
本作品采用知识共享署名

本文记录一些git下的撤销和修改历史操作。

先来看一张图

这张图基本列出了git添加和提交的撤销操作和git各个区的关系,看这个图有助于理解之后个各个命令。

修改最近一笔commit

CASE 1: 撤销git add,修改任然保留再工作区(workspace)
git reset HEAD
git reset HEAD –

CASE 2: 撤销git add,不保留修改,代码和上一次提交一致
git checkout .
git checkout –

CASE 3: 撤销 commit 到stage区(撤销了git commit动作,保留了git add和工作区修改)
git reset –soft

CASE 4: 撤销 commit 到工作区(撤销了git add和git commit动作,保留了工作区修改)
git reset –mixed

CASE 5: 回退版本库(撤销,git commit,回到上一个版本)
git reset –hard

CASE 6: 修改最后一笔commit(如果只修改commit log,不用执行git add)
git add .
git commit –amend

CASE 7: 撤销git reset(找回commit)
git reflog
找到被reset的commit记录对应的hash值
git reset –hard

修改历史commit

例如,下面有4笔提交,只想改3e6f075这一笔怎么办

4404139 (HEAD -> zephyr_master_match) modify test
a0d4e6c debug ov7725
3e6f075 Remove DATA_SEMC sync with zephyr master
dbd5fe7 (origin/master, origin/HEAD, master) Sync v2.4.0 (#31)
7bf10b0 add mp3 decoder (#28)

步骤如下

  1. git rebase -i HEAD~4
    会看到如下内容

    pick dbd5fe7 Sync v2.4.0 (#31)
    pick 3e6f075 Remove DATA_SEMC sync with zephyr master
    pick a0d4e6c debug ov7725
    pick 4404139 modify test

  2. 将3e6f075前的pick改为edit,然后保存退出,此时已经处于3e6f075

  3. 对代码进行修改,然后执行git add
  4. git commit –amend
  5. git rebase –continue

如果这次修改后后面的commit有冲突,git rebase continue的时候会要求处理冲突,处理完后再进行步骤3~5即可。

参考

https://www.stephenmarron.com/2017/02/git-data-transport-commands/