GIT系列指撤销修改

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

工作区,暂存区,版本库

工作区:就是指当前的目录,比如我们创建的learnGit目录
暂存区:通过git add 命令将文件添加到暂存区。
版本库:就是指创建仓库时自动生成的那个.git目录,也是强烈建议不要乱动的目录。
git中的文件必须先添加到暂存区,然后才能添加到版本库。

重新创建一个文件Hello.java,随便写点内容比如

hello java
复制代码

然后再修改下readme文件,添加一行

添加 hello.java 文件 
复制代码

然后查看下仓库状态

git status
复制代码

显示结果:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

      modified:   readme.txt

      Untracked files:
  (use "git add <file>..." to include in what will be committed)

      Hello.java

no changes added to commit (use "git add" and/or "git commit -a")

复制代码

说明readme.txt被修改了,而hello.java还没有被添加到仓库。
然后我们将这两个文件添加到暂存区

git add readme.txt
git add Hello.java
复制代码

你也可以使用下面的命令将当前文件夹下的所有文件都添加到暂存区
git add --all

再查看下状态显示结果:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

      new file:   Hello.java
      modified:   readme.txt

复制代码

然后再用commit命令添加到版本库
git commit -m "添加Hello.java文件"
再查看下状态显示结果为

On branch master
nothing to commit, working tree clean

复制代码

撤销修改

仅仅是修改了工作区,并没有add到暂存区

我们对Hello.java做一些修改,如下:

public class Hello{
    public static void main(String[] args){
 
    }
}

复制代码

如果这个时候我们需要回到上一个版本,当然,你可以手动的修改Hello.java文件。
但是要是万一你哪里再记错了,就尴尬了。
查看一下状态

git status
复制代码
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   Hello.java

no changes added to commit (use "git add" and/or "git commit -a")
复制代码

git告诉你说,使用 git checkout -- ... 可以放弃当前工作区的修改。试一下,

git checkout Hello.java 
复制代码

查看下Hello.java 文件,是不是恢复了。

不仅仅修改了工作区,而且还add到了暂存区。

我们对Hello.java再次做一些修改,如下:

public class Hello{
    public static void main(String[] args){
 
    }
}

复制代码

然后add到暂存区

git add Hello.java
复制代码

查看一下状态

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   Hello.java

复制代码

git告诉你说,使用 git reset HEAD ... 可以撤销缓存。然后我们尝试一下

git reset HEAD Hello.java
复制代码

运行结果

Unstaged changes after reset:
M	Hello.java

复制代码

查看一下状态

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   Hello.java

no changes added to commit (use "git add" and/or "git commit -a")

复制代码

是不是又回到第一种的状态了。

不仅仅修改了工作区,还add到了暂存区,而且手贱的我还commit到了版本库。

如果你目前还没有推送到远程仓库,还有的救,还记得上面说的时光倒流么。不记得的可以翻一翻。

git reset --hard HEAD^
复制代码

这样就回到了第二种情况。

文件删除

在仓库里新建一个文件,然后添加到版本库

git add test.txt
git commit -m "add test.txt"
复制代码

然后我们将这个文件删除掉。

rm test.txt
复制代码

查看一下状态

On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

复制代码

git 检测到有文件被删除了,git告诉你有两种方式
1. git rm ... :从版本库删除文件,并重新commit
2. 撤销删除操作,test.txt将被恢复。

使用下面的命令从版本库删除文件。

git rm test.txt
git commit -m "remove test.txt"
复制代码

小结:通过以上的学习我们已经可以熟练的操作本地的git仓库了。