Git入门——版本回退'reset'与reset后的'push报错'

在Git中,HEAD指向当前版本,也就是最新的提交3a6d4df…(注意.大家的commit肯定都不一样)
用HEAD不同组合来表示不同的版本
HEAD^就是表示上一个版本
HEAD^^就是表示上上一个版本
HEAD~100就是往上100个版本

回退至上一个版本:
  git reset --hard HEAD^

回退之后后悔了?原来最新的版本已经看不到了!
若想再返回原来那个最新的版本,办法还是有的:

1.
只要上面的命令行窗口还没有被关掉,
你可以向上翻到找找有没有那个最新版本的commit,
于是就可以指定回到那个本已消失的版本了(版本号没必要写全,但是不可太少)
git reset –hard (commit版本号)

2.
若没找到,也可以试试git reflog,也可以查看以前的commit(查看历史记录)
再进行1.的步骤.

注意,reset切换后,push,若是报错,如下:

! [rejected]
master -> master (non-fast-forward) error: failed to push some refs to '[email protected]:PisecesPeng/usegit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

(可以使用 git pull + 远程名+ 分支名操作,使得远程与本地之间保持一致)

若是想直接强制推送,可以加上 -f 参数强制push

ps.
这个错误是因为本地与远程的版本(文件)不相同,你可以先 pull 本地即可.
若是直接强制推送的话,那么之前对远程进行的操作与修改的版本将会消失(以你本地的版本为基准).
且注意,这种消失是不可以进行版本回退的,因为你会发现远程的版本已经和你本地版本一样了.

举个例子就是,
你和你(时空混乱 >_< )进行一场比赛,本地你还在起点线慢悠悠,远程你已经出发跑了100米。
在这100米过程中,远程你喝了一瓶水,吃了一碗面。
现在本地你要开跑了,正确做法是pull远程你本地你直接从100米之后起跑,水和面都没浪费,也没有白跑。
但是!如果 -f 强制push了呢?那么远程你又被本地你强制变回起点线了,远程你的这个100米就白跑了,水和面都没留下痕迹…

所以,若是多人协作之中,这是对他人工作的浪费,因为由于你的版本落后,-f强制push之后,他人推送更新的多个版本可能就要白费了,项目又变为了你本地的版本。


我的Git入门学习,廖雪峰老师的教程帮助了我很多;
也希望能和大家分享一下;
廖雪峰老师的官方网站

你可能感兴趣的:(Git)