先来看一张图
这张图基本列出了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)
步骤如下
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将3e6f075前的pick改为edit,然后保存退出,此时已经处于3e6f075
- 对代码进行修改,然后执行git add
- git commit –amend
- git rebase –continue
如果这次修改后后面的commit有冲突,git rebase continue的时候会要求处理冲突,处理完后再进行步骤3~5即可。
参考
https://www.stephenmarron.com/2017/02/git-data-transport-commands/