Git概念

在说操作之前,先说明下Git工作区暂存区版本库的概念。

这是菜鸟教程的图

  • 工作区:就是在电脑里能看到的目录
  • 暂存区:英文叫 stage 或 index,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引index
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库.
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的 一个新的对象中,而该对象的ID被记录在暂存区的文件索引中.
  • 当执行提交操作git commit时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新. 即 master 指向的目录树就是提交时暂存区的目录树.

撤销修改

撤销修改分为以下几种情况:

​ 1.已经push推送到远程仓库

​ 2.已经commit提交到版本库

​ 3.已经add提交到暂存区

​ 4.暂未提交到暂存区,所有修改都在工作区


​ 1.如果push远程仓库了,并且没有远程仓库的管理权限,那就放弃吧.

  1. 第一步

    1
    git reset --hard 版本号 //本地回退到指定的版本
  2. 第二步

    1
    git push -f origin dev //将远程仓库的也回退到指定版本

​ 2.已经使用commit提交到了版本库.

因为已经产生了新的提交,所以撤销修改可以使用git reset --hard HEAD^来回退到上一个版本,从而达到撤销修改的效果.

1
2
git reset --hard HEAD^ //撤销之前的commit,并且舍弃之前的commit修改
git reset --soft HEAD^ //撤销之前的commit,并且保留之前的commit修改

​ 3.已经使用add提交到暂存区,但是没有使用commit提交到版本库.

因为已经提交到暂存区了,所以撤销修改需要先将提交到暂存区的修改拿回到工作区.

1
git reset HEAD <file>

命令git reset HEAD <file>可以把暂存区的修改撤销掉,重新放回工作区 注意该命令和回退版本的命令的区别

这样所有的修改就回到了工作区,丢弃工作区的修改只需执行以下命令:

1
git checkout -- <file> //使用 git restore <file> 的效果一样

命令git checkout -- <file>会将工作区的修改撤回到最后一次git addgit commit时的状态.

​ 4.文件修改都在工作区,没有提交到暂存区.

丢弃工作区的修改只需要执行一下命令:

1
git checkout -- <file> //使用 git restore <file> 的效果一样

命令 git checkout -- <file> 会将工作区的修改撤回到最后一次git addgit commit时的状态

有两种情况:

一种是file自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态;
另一种是file已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态.

文件删除

文件删除其实也是一个修改动作,当使用rm命令或者通过鼠标右击删除文件时,工作区就产生了修改.

这时候有两种选择:

1.确实要从版本库中删除该文件,使用命令git rm <file>然后使用git commit进行提交. 工作区删除文件,后然后使用git add <file>的效果和直接使用git rm <file>的效果是一样的.

2.另一种情况是删除错了,这时候只要使用git checkout -- <file>即可把误删的文件恢复到最新版本,最后一次提交后修改的内容会丢失. 从来没有被添加到版本库就被删除的文件,是无法恢复的!