Advertisement

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

阅读量:

Git版本控制中,HEAD指针指向当前版本(最新提交),通过HEAD、HEAD^和HEAD~100等操作符可以回退至不同版本。回退至上一个版本可通过git reset --hard HEAD^实现,若找不到最新版本可使用git reflog查看历史记录并回退。版本冲突时,若本地与远程不一致,需使用git pull保持一致后再操作。强制push会导致远程版本归零本地版本,建议避免使用-f参数,以防止版本丢失。正确操作应使用git pull后直接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 'git@github.com: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米的路程中,远程分支还 indulged自己,先喝了一口水,又吃了一碗面。现在轮到本地分支出发了,正确的方法是 pull 远程分支,本地分支直接从100米之后的位置起跑,水和面都没浪费,也没有白跑。但是!如果 -f 强制push 了呢?那么本地分支又会把远程分支带回起点线,远程分支的这100米就浪费了,水和面也没留下痕迹。

在多人协作的场景中,这无疑是一种对他人工作造成了不必要的浪费的行为。由于你的版本较落后,在执行-f强制push操作后,其他用户推送的更新版本可能就浪费了,项目的最终状态将回归到你的本地版本。

我最近开始学习Git,廖雪峰老师的教程让我受益匪浅。我也希望能与大家分享我的学习经验。廖雪峰老师的官方网站

全部评论 (0)

还没有任何评论哟~