git 的 版本问题,以及idea中使用 git版本回滚操作,以及git版本和idea代码历史记录的区别

第一个问题:这里我们讨论版本是哪里的版本
工作区(暂存区),这里是我们写代码的地方,可以说这与git的分支(指针),本地库和远程库没有什么关系,

但是是有一点,在这几种情况下,分支合并,拉代码,推代码(都叫分支合并吧),版本回退等情况,都会更新工作区的内容的

但是真正我们的操作,都是git的本质,即 本地库远程库,以及head指针和分支指针

第二个问题:为什么idea的历史记录在 git中没有用
因为 git的 版本,是永远存在的,什么时刻都可以找到的,所以我们控制版本的话,得用git控制,不能依赖于idea历史记录

下面开始具体的 git版本回滚问题

在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验)。这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措。而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行版本回退。

对于版本的回退,我们经常会用到两个命令:

  • git reset
  • git revert

那这两个命令有何区别呢?先不急,我们后文详细介绍。

git reset

假如我们的系统现在有如下几个提交:

其中:A 和 B 是正常提交,而 C 和 D 是错误提交。现在,我们想把 C 和 D 回退掉。而此时,HEAD 指针指向 D 提交(5lk4er)。我们只需将 HEAD 指针移动到 B 提交(a0fvf8),就可以达到目的。

只要有 git 基础的朋友,一定会想到 git reset 命令。完整命令如下:

git reset --hard a0fvf8

命令运行之后,HEAD 指针就会移动到 B 提交下,如下图示:

而这个时候,远程仓库的 HEAD 指针依然不变,仍在 D 提交上。所以,如果直接使用 git push 命令的话,将无法将更改推到远程仓库。此时,只能使用 -f 选项将提交强制推到远程仓库:

git push -f

采用这种方式回退代码的弊端显而易见,那就是会使 HEAD 指针往回移动,从而会失去之后的提交信息。将来如果突然发现,C 和 D 是多么绝妙的想法,可它们已经早就消失在历史的长河里了。

而且,有些公司(比如良许的公司)明令禁止使用 git reset 命令去回退代码,原因与上述一样。所以,我们需要找到一个命令,既可以回退代码,又可以保存错误的提交。这时,git revert命令就派上用场了。

git revert

git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。

使用 git revert 命令来实现上述例子的话,我们可以这样做:先 revert D,再 revert C (有多个提交需要回退的话需要由新到旧进行 revert):

git revert 5lk4er
git revert 76sdeb

这里会生成两个新有提交:D’ 和 C’,如下图示:

这里只有两个提交需要 revert,我们可以一个个回退。但如果有几十个呢?一个个回退肯定效率太低而且容易出错。我们可以使用以下方法进行批量回退:

  • 【自动提交commit】
git revert OLDER_COMMIT^..NEWER_COMMIT

 
 
  • 【自己提交commit】
git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

  
  

推荐使用【自己提交commit】

这时,错误的提交 C 和 D 依然保留,将来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后移动的,可以直接使用 git push 命令推送到远程仓库里。而这种做法,正是企业所鼓励的。

我们再举个更难一点的例子。

假如现在有三个提交,但很不巧的是,那个错误的提交刚好位于中间。如下图示:

这时,直接使用 git reset 命令将 HEAD 指针重置到 A 提交显然是不行的,因为 C 提交是正确的,需要保留的。先把 C 提交 及 B 提交全部回退,再使用 cherry-pick 命令将 C 提交重新再生成一个新的提交 C’’,这样就实现了将 B提交回退的需求。完整的过程如下:

通过以上对比可以发现,git reset 与 git revert 最大的差别就在于,git reset 会失去后面的提交,而 git revert 是通过反做的方式重新创建一个新的提交,而保留原有的提交。在企业里,应尽量使用 git revert 命令,能不用 git reset 命令尽量不用。

举例

假如git commit 链是

A -> B -> C -> D

 
 

如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revert

git revert B^..D

 
 

这样就把B,C,D都给revert了,变成:

A-> B ->C -> D -> D'-> C' -> B'

 
 

    用法就是:

    git revert OLDER_COMMIT^..NEWER_COMMIT
    
     
     

    如果我们想把这三个revert不自动生成三个新的commit,而是用一个commit完成,可以这样:

    git revert -n OLDER_COMMIT^..NEWER_COMMIT
    git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
    
     
     
    • 如下示例

    当前绿色的commit ID:27ac0fc51e99f292b7677baecc3ef7fb0ccb38d0

    HEAD -> main, origin/main     commitID: 298eae0c28e57ad6224d4c0bc76665d97602603d
    ...
    add d     commitID: 27ac0fc51e99f292b7677baecc3ef7fb0ccb38d0
    add c     commitID: 6dabf4344d4aed95b1e3bb8b0d2b56046d66f37e
    
     
     
    • 回滚到add c
    git revert -n 27ac0fc51e99f292b7677baecc3ef7fb0ccb38d0^.. 298eae0c28e57ad6224d4c0bc76665d97602603d
    

    git cm -m “revert to add c”

    git diff 6dabf4344d4aed95b1e3bb8b0d2b56046d66f37e // 为null 说明回滚成功

    reset与revert的区别

    • git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
      在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为- git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
    • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

    注意,使用 git reset的话,特别你回退的版本已经push了,那么本地仓库此时的版本 一定比 远程仓库的版本低的,push的话,得强力push,强力push的话,需要在 终端 输入一段代码

    还有注意,git revert 是指 选中一个历史版本然后将他commit出去,所以都是有一个commit操作的,所以在idea操作的时候,通常你选中某个历史版本后,revert都会弹出一个commit操作的,你commit即可,而且还可能出现代码冲突,但是这是 revert的代码冲突,不用你处理冲突,直接merge即可

    idea中版本回退的使用

    一.先说结论

    针对任何一个代码记录都进行Revert Commit操作:
    ①不管此记录是commit未push,还是已经push过;
    ②不管此记录之后有没有其他的多次commit或push’记录
    总之都会生成一个新的Revert "xxx"记录,接下来你想commit就commit,想push就push。

    二.操作步骤

    1.我有三个记录

    在这里插入图片描述

    这三个记录可以是只commit未push,也可以是push过,无所谓。

    2.随便选择一个进行Revert Commit,我选择"test1"

    在这里插入图片描述

    3.点击Revert Commit立刻弹框如图

    在这里插入图片描述

    4.然后你点击Commit按钮,记录窗口会立即显示一个新的记录

    在这里插入图片描述

    5.这会你push就行

    在这里插入图片描述

    </article>
    
    • 0
      点赞
    • 2
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值