人的状态总有低落的时候, 平时很谨慎的人也有可能出错, 在git使用时, 如果不小心推送到了错误分支. 这种情况如何处理呢 ?
reset 毁尸灭迹法
使用git reset
来抹除刚才的stupid操作, 强制推送后不让别人"发现". 但是前提是那个分支还没其他人推代码上去, 不然还是会被发现, 而且会把别人的commit删掉, 所以请谨慎使用 (适合分支只有一个人用的情况) :
实操:
假设有以下的commit :
commit 116aac11f0ee0a155837f0d6a68931fe405a6ed4 |
然后被推送到 remote server:
$ git push --set-upstream origin niko_blog_test |
推送后查看服务器的 git commit log:
然后到了我们的主题, 清除掉remote上面的错误 commit 116aac11f0ee0a155837f0d6a68931fe405a6ed4
, 如下:
$ git reset --hard f000b1ac4bf9dbd57d107895f349f448a3af05cc |
这时再查看服务器上的commit log, 可以发现116aac11f0ee0a155837f0d6a68931fe405a6ed4
的commit已经被删除了:
一个高级用法: 删除最后一个commit
假设有一个在mathnet
的remote的分支master, 当前指向dd61ab32
的commit, 可以这样做:
$ git push mathnet +dd61ab32^:master
其中, x^
表示the parent of x
+
表示a forced non-fastforward push
不过, 我还是喜欢前一个做法, 更适用一点.
revert 警示后人法
使用 git revert
建立新的commit来回滚, 假设现在服务器和本地的 git log
是:
commit ceaa73fd804aefc406f6384c9c0fffaedafbcb79 |
其中ceaa73fd804aefc406f6384c9c0fffaedafbcb79
是要revert的错误commit.
$ git revert ceaa73fd804aefc406f6384c9c0fffaedafbcb79 |
此时的gitlog :
|
可见, 多了一个commit, 文本修改如下 ( 正确reverted ) , 此时再推上remote server即可.
参考
http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html