暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文搞懂Git 版本回退

程序员恰恰 2024-03-09
128



1、工作区的代码想撤销
2、add到暂存区的代码想撤销
3、提交到本地仓库的代码想撤销
4、远程仓库的代码想要撤销
本文将分享两种方式,一种是通过git命令的方式解决以上问题,一种通过IDEA集成的按钮操作。
1、基于git命令
1.1 工作区的代码想撤销
代码初始化如下:新建了一个Hello类,代码只有一行hello world!
然后我新增了一行“ hello world!代码”(没有add),此时我想撤回到最开始的样子(当然你Ctrl+Z也能撤退,那假设你已经写了1000行呢)
解决方法如下:使用命令git chectouk -- 已经变化的部分
 git checkout -- com/qiaqia/Hello.java
效果如下:发现新写的代码已经撤退了。
1.2 add 到暂存区的代码想撤销
将代码恢复到最初状态,新增一行代码,并add,此时使用git status命令查看状态显示:Changes to be committed(待提交),此时我想撤退代码到工作区。
解决办法:使用 git reset HEAD 命令来解决。
 git reset HEAD
此时代码已经从暂存区撤回到工作区,只用再执行1.1步骤即可回退到初始化的样子。
1.3 提交到本地仓库的代码想撤销

此时我新增了一行代码,执行了add 和commit ,这时候我我想撤退。
这种情况我们可以使用git reset --hard <版本号> 命令来实现版本回退。
该命令中的版本号有几种不同的写法
1、使用 HEAD^ 来描述版本,一个 ^ 表示前一个版本,两个 ^^ 表示前两个版本,以此类推。
2、使用数字来代替 ^,比如说前 20 个版本可以写作 HEAD~20
3、直接写版本号,表示跳转到某一个版本处。我们每次提交成功后,都会生成一个哈希码作为版本号,我们不用全部输入,只需要输入前面几个字符即可,就能识别出来。

首先通过 git log 查看当前提交日志:
通过 git reset HEAD^^ 可以向前回退两个版本:
通过git reset --hard HEAD~1可以往前回退一次提交。
使用版本号回退:首先先通过 git log 查看当前提交日志,发现最后一次(倒数第二次)提交的版本号是 079d0d367abc19332b3bf6ad7190b218701dce62,
利用 git reset --hard 079d0d367abc19332b3bf6ad7190b218701dce62 命令回到回退之前的状态.
使用“git push -f”强制提交更改
此时如果使用“git push ”会报错,因为我们本地的库HEAD指向的版本比远程的要旧:所以我们使用“git push -f”强制提交上去就行了
细心的同学会问:为啥是--hard是啥意思,其实还有--soft ,--mixed

补充知识:git reset --soft ,git reset --mixed,git reset --hard,他们的区别?

1、git reset --soft(推荐) :这个命令将会重置 HEAD 指针到指定的提交,但是会保留暂存区和工作目录的修改。意思是:之前提交的改动会被放回到暂存区(绿色),(撤销了commit,你可以重新commit它们)。

2、git reset --mixed :这个命令将会重置 HEAD 指针到指定的提交,并且会重置暂存区,但是会保留工作目录的修改。意思是:之前提交的改动会被放回到工作目录(红色),不会被放入暂存区(撤销了add,和commit两个动作)。

3、git reset --hard :这个命令将会重置 HEAD 指针到指定的提交,并且会重置暂存区和工作目录,使它们与指定的提交完全一致。这意味着之前提交的改动会被彻底删除(撤销并且不保留,暂存区也没有)。

发现第二次提交没了,就是你新写的代码彻底没了。

原理图:加入当前版本是V4,git reset --hard则会将指针直接指向V3,舍弃V4

需要特别小心使用 --hard 选项,因为它真的会永久性地删除未提交的修改。


1.4 远程仓库撤销


  1.4.1:方式1

如果代码提交到远程仓库了,想要撤销,那就如 1.3 小节所讲,先在本地仓库撤销,然后 push 到远程仓库即可。

 1.4.2:使用git revert 版本号撤退


假设你现在版本号是V3,你想回退到V3,git revert的效果是保留v4,基于v3的"反做"生成了V5版本。

适用场景:如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法.


语法:

    git revert  commit-id

    演示:此时"第2次提交"已经提交add和commit 但是没有push,此时我想撤退.
    注意:这里选择的是最后一个。


    选择之前提交记录的会有冲突这是因为Git会尝试将更改从历史提交中还原到当前分支,并且如果这些更改与当前代码存在冲突,就会导致冲突的发生,需要手动解决冲突(后面有演示)


    1、查看提交历史:首先,可以使用以下命令查看最近的提交历史,找到你想要撤销的提交的哈希值:git log
    idea 小技巧:快速复制版本号,不用查看git log了
    2、执行撤销操作:使用 git revert <commit_hash> 命令来撤销指定的提交。例如,如果要撤销提交哈希为 cbf1f59d70614b 的提交,可以运行以下命令:
    然后按"i"进入编辑模式,编辑新的commit 信息"第3次提交",保存退出。

    3、推送撤销的更改:如果你需要将撤销的更改推送到远程仓库,可以使用 git push 命令将新的撤销提交推送至远程仓库。

    二、基于iDEA
    1、工作区的代码想撤销或者add到暂存区的代码想撤销
    也就是说,无论有没有执行 git add 命令,只要没有 commit,都可以通过这个按钮撤销修改。

    2、提交到本地仓库的代码想撤销

    方式1:撤销提交(Undo Commit)

    这个操作只能在最近一次提交上使用,不能在其他提交上使用,最近一次 commit 上,右键单击,如下图:

    注意:勾选设为active
    此时最后一次commit已经没有了,本地的修改相当于变成了已 add 但是未 commit 的状态,你可以继续撤退,或者继续commit
    此时,git status 已经变成 add .状态
    方式2:恢复提交(Revert Commit)
    此时"第2次提交"已经push,只用(在最后一次提交记录上)点击还原提交即可。

    第2次提交”的代码已经撤回了。同时生成了一次提交记录。

    注意:上面的操作是选择最后一次,如果选择更早的版本会发生冲突,这是因为Git会尝试将更改从历史提交中还原到当前分支,并且如果这些更改与当前代码存在冲突,就会导致冲突的发生。

    演示:此时我想回滚到第一次提交。

    选择还原提交(git  revert )

    弹窗,让我们解决冲突

    已经解决完的冲突

    编辑要基于第一次提交生成的commit messgae,点击提交

    此时完成了回退,并且基于第一次提交生成了一个新的历史记录。

    方式3选择前一个版本,右键,选择“将当前分支重置到此处”

    选择:关于这几个选的的解释,我们在文章中已经解释过了。保留的意思是,回退到之前的,并保存此时状态是为commit ,等待push,一般不选这个。

    此时代码已经撤退了,你可以继续撤退,或者修改后再次commit、push

    其实这个弹框我们还能用另外一种方式:

    这里依然可以选择,软、硬、混合模式

    4、远程仓库的代码想要撤销


    跟步骤三一样,先在本地仓库撤销,撤销完成后,重新修改代码,最后再 force push 就行了。


    文章转载自程序员恰恰,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论