[Git] 本地代码库和远程同步

一 前言

这本来不是一个很严重的问题, 有很多办法可以处理, 但是对于Git新手来说, 会觉得非常可怕, 因为不知道怎么恢复之前的状态, 不知道当前状态上传上去会造成什么影响, 最怕的是影响到master之类的主分支, 然后把别人的工作搞丢, 那就完蛋了.

我刚开始接触Git的时候, 上级给了一份详细的文档让我按照步骤上传代码, 前面的更新本地master, 创建分支都没有什么问题, 但是好死不死我在修改本地分支内容之前忘记先把本地状态push到远端了, 因为本地需要rebase master, 然后通过push和远端同步, 如果不做这一步, 分支就会混乱, 于是我想把本地更新的东西移除掉, 然后再push. 由于不知道做了哪些更改, 就直接用了reset指令恢复之前的状态, 结果越搞越乱, 最后本地分支的log乱七八糟的, 我只好跟上级说, 能不能帮我解决这个问题, 上级过来看了以后, 一通上下翻飞操作就给我解决了, 我看了非常羡慕, 暗暗下决心我也要拥有这项技术.

二 Git上的各种恢复方式

我还是使用自己的代码仓库gitee来举例.

2.1 丢弃本地分支,从远端同步

这个部分就是解决我之前说的问题, 就是我本地什么都不要了, 只要和远程完全一致就可以, 最狠的办法是重新找一个文件夹, 然后用git clone拉一次, 这样你的本地和远程就绝对完全一致了, 但是这个方法代价太大, 而且完整的git仓库动辄几个G甚至十几个G, 耗时太长, 以下有一些简单的方法可以参考.

2.1.1 丢弃在本地的所有改动和提交, 获取服务器上的最新版本

指令一 切换到你的分支
git checkout your_branch
在这里插入图片描述

指令二 从远程拉取所有数据
git fetch origin
在这里插入图片描述

指令三 以远程分支为范本, 强制恢复本地分支
git reset --hard origin/remoteBranchName
在这里插入图片描述

2.1.2 仅删除本地分支, 然后拉取远程分支

指令1 切换到master:
git checkout master
在这里插入图片描述

指令2 删除本地分支:
git branch -D 本地分支
在这里插入图片描述

指令3 创建基于远程分支的本地分支
git checkout -b 本地分支 origin/远程分支
在这里插入图片描述

其中, 本地分支和远程分支不一定要同名,使用
git branch -vv
来对比本地分支和远程分支的对应关系
在这里插入图片描述

其中左边的是本地分支名, 右边的origin/之后的就是远程分支名

使用
git log -1
查看commit ID和远程是否一致,一致则没有问题
本地ID:
在这里插入图片描述

远程ID:
在这里插入图片描述

前7位一致即可.

git branch -r
查看远端分支有哪些
在这里插入图片描述

2.2 如果commit了后悔

因为git是以commit ID为核心的版本管理工具, 所以commit操作就显得非常重要, 我们在判断一个版本是否最新时, 也会按照commit ID去确认, 然后如果操作有问题, 也需要通过commit ID去恢复, 所以补充一下这一块的内容.

参考
https://blog.csdn.net/qq_34238798/article/details/108003838

2.2.1 回退版本

git reset --hard HEAD
回退/撤销。回退到最近一次的COMMIT版本上(即 【当前版本/撤销到倒数第1个COMMIT版本】);将工作区、暂存区和HEAD保持一致。

git reset --hard HEAD~1
或 git reset --hard HEAD^
回退/撤销。回退到上一次的COMMIT版本上(即 【上一版本/撤销到倒数第2个COMMIT版本】);将工作区、暂存区和HEAD保持一致。

git reset --hard HEAD~2
或 git reset --hard HEAD^^
回退/撤销。回退到上上次的COMMIT版本上(即 【上上版本/撤销到倒数第3个COMMIT版本】);将工作区、暂存区和HEAD保持一致。

git reset --hard HEAD~99
或 git reset --hard HEAD(99个’^’)
回退/撤销。回退到上上次的COMMIT版本上(即 【撤销到倒数第100个COMMIT版本】);将工作区、暂存区和HEAD保持一致。

–hard删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。
这一步操作可以代替撤销本地修改,不管有没有commit,都可以用它恢复到老版本

git reset --soft HEAD~1
–soft 不删除工作空间改动代码,撤销commit,不撤销git add .
用soft,然后把原文件放回去,再add一次

–mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

这些问题不大, 自己试试即可, 懒得截图了.

撤销add
git reset HEAD .

撤销文件修改
git checkout .

2.3 如果reset后悔

reset虽然是一条很好用的指令, 但是随意reset也会导致一些麻烦的问题, 比如我一开始说的, 我用reset回退了太多版本, 导致找不到后面的版本了, 于是搞乱了本地, 如果这时候上传代码, 很可能会把别人的工作也弄丢, 所以如果想恢复reset的操作, 可以参考下面的代码.

git reflog -5
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
例如执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid
在这里插入图片描述

git reset --hard xxxxxx
选择一条你想恢复的即可
在这里插入图片描述

2.4 master回退版本(慎用!慎用!慎用!)

在master执行相同的reset命令即可
git reset --hard XXXXX
git push -f

不多解释了, 希望大家不要有机会用上这个命令.

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值