Skip to content

一、代码回退场景

1. 回退本地修改到git HEAD版本,也就是本地分支版本

  • 回退单个文件
    shell
        # 进入需要回退文件的目录
        cd '文件所在的目录'
        # 使用 `git checkout`  filename 就是需要回退的文件名称
        git checkout --filename
  • 回退全部文件
    shell
        # 进入需要回退文件的目录
        cd '文件所在的目录'
        # 使用 `git checkout`  filename 就是需要回退的文件名称
        git checkout --.
  • 注意:
    • git checkout -- .丢弃全部,也包括:新增的文件会被删除,删除的文件会恢复回来,修改的文件会恢复跟本地分支保持一样的版本,
    • git checkout只是回退到暂存区之前的代码版本,对之前保存在暂存区里的代码不会有任何的影响。对commit提交到本地分支的代码就更没影响了。
    • 如果之前压根都没有addcommit,那就是回到上次pull下来的代码版本。

2. 代码git add到暂存区,并未commit提交,需要回退

  • 回退指定文件
    shell
    git reset HEAD filename
  • 回退全部文件
    shell
    git reset HEAD .
  • 注意:
    • 这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化。
    • 如果需要回退跟本地分支一样的版本,只需要配合使用git checkout即可。
    • 示例: reset.png

3. git commit后,如何撤销commit

场景: 执行commit后,还没执行push时,想要撤销这次的commit,该怎么办?

  • 解决方案
    • 回到其中想要的某个版,修改、增加代码消失

    • 回到最新的一次提交,修改、增加代码消失

      shell
      git reset --hard HEAD^
    • 回到git add之前,此时修改,新增的代码都会保留,撤销git add操作

      shell
      git reset HEAD^ 
      # 或者
      git reset --mixed HEAD^

      commit-reset.png

      commit-mixed.png

    • 回到git add之后,此时修改、新增的代码都会保留,保留git add操作

      shell
      git reset --soft HEAD^

      commit-reset-soft.png

    • 参数详解

      • HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1 如果进行两次commit,想要都撤回,可以使用HEAD~2
      • git reset [<mode>] [<commit>]
        • mode
          • --soft: 不删除工作空间的改动代码,撤销commit,不撤销git add file
          • --hard: 删除工作空间的改动代码,撤销commit且撤销add,彻底还原到上一次提交的状态且无法找回。
          • --mixed: 不删除工作空间的改动代码,撤销commit,撤销git add file

4. git push把修改提交到远程仓库,

  • 使用git reset

      1. 查看需要回退提交的commit id
      shell
      git log
    • 回退
      shell
      git reset --hard commit_id
    • 强制提交一次,之前的提交就从远程仓库删除,慎重!!!
      shell
      git push origin HEAD --force
      commit-reset-push.pngcommit-reset-push-1.pngcommit-reset-push-2.png
  • 使用git revert

      1. 查看需要回退一次提交的commit id
      shell
      git log
      1. 撤销指定的版本,撤销也会作为一次提交进行保存
      shell
      git revert <commit_id>
      commit-revert-push.pngcommit-revert-push-1.pngcommit-revert-push-2.png

5. git merge后,后悔了如何回退

场景:今天将feature分支的代码merge到develop分支后,后悔了,因为feature分支的功能还没有全部开发完成, 在feature分支上commit是可以的,但是这之后又把它merge到了develop分支这就不合适了。

  • 解决方案
    • 第一步:git checkout branch_name到要恢复的那个分支上
      shell
      git checkout develop
    • 第二步:git reflog查出要回退到merge前的版本号
      shell
      git reflog
    • git reset --hard [版本号]就回退到merge前的代码状态了
      shell
      git reset --hard f82cfd2

Released under the MIT License.