注:本文翻译自这里
撤销“public”修改
场景:
你使用git push
将本地更改发布到github上,突然意识到这个commit有点问题,不能push上去,你需要撤销这个commit。
撤销:
git revert < sha >
译者注:sha是commit的hash至,通过git log命令可以查看到。
做了什么:
git revert
创建了一个与sha所代表的commit的“相反”的commit,这个新的commit会将sha commit所做的一切撤销。
修改最近一次commit message
场景:
如果你git commit -m "fixed bug #42"
,之后你意识到应该是git commit -m "fixed bug #41"
,这是该咋办。
撤销:
git commit –amend -m “fixed bug #41”
做了什么:
git commit --amend
仅仅改变了上一次commit的message,其他什么事儿也没干,可以放心使用。
撤销“local”修改
场景:
一只猫跳到你键盘上,破坏了你正在编辑的文件,正在编辑的内容乱了一塌糊涂,这是你想把文件恢复到上次commit的状态。
撤销:
git checkout – < bad file >
做了什么
git checkout
改变当前工作目录中的文件到指定状态。你可以指定分支名或者sha。如果没有指定,默认执行的是git checkout HEAD
。HEAD代表当前分支的最后一次commit。
重置本地修改
场景:
你已经在本地开发了一段时间了,有了几次本地commit,但是你感觉最近三次commit写的不好,想推倒重来,就像没有这三次commit。
重置commit:
git reset < last good sha>
orgit reset --hard < last good sha >
做了什么:
git reset
会将你的commit重置到指定的某个commit上,而之后的那些commit就想没有提交过一样。默认情况下,git还会为你保留这些commit,只不过对你来说透明感觉不到而已。如果你加上--hard
参数,git就真的把这些commit给“扔掉”了。
重做最近的撤销
场景:
你commit了几次,然后使用git checkout --hard
撤销了这几次commit。这是你又想重做这几次commit。后悔药还是有的。
重做:
git reflog
andgit reset
干了什么
git reflog
与git log
类似,都会列出commit记录,不同的是git log
只会列出正式生效的commit记录,不能列出HEAD在commit之间跳转的记录。
我们先通过git reflog
查找到被git checkout --hard
“抛弃”掉的那几次commit的sha值。然后通过git reset
恢复到想要的commit上去。
分支
场景:
commit了几次后发现错误地commit到了master分支上了,你只是想commit到feature分支上。
撤销:
git branch feature
然后git reset --hard origin/master
最后git checkout feature
译者注:origin/master这个特殊的名字代表着与远程仓库一致的那次提交。
做了什么:
首先,git branch feature
新建了一个feature分支,这个包涵了这几次commit。然后git reset --hard origin/master
将commit状态回滚到这几次commit之前,好了,master分支“干净”了。最后使用git checkout feature
切换到feature分支上,在这几次commit之上接着开发。