管理修改、撤销修改git checkout -- 、删除文件git rm (七)

时间:2024-05-22 15:02:02

                                                      管理修改

目前你完全掌握了暂存区的概念,接下来,我们讨论一下为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

为什么说Git管理的是修改,而不是文件呢?我们接着实践,第一步,对index.html做一个修改,比如加一行内容,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

然后,添加(git add 命令),如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

接着,再一次修改文件 index.html ,如下:(第二次修改)

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

再接下来,直接提交(命令:git commit -m <message> ),如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

那么,提交之后,查看版本库目前的状态(命令 git status),如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

由图可知,第二次修改并没有被提交,以上的整个操作过程如下:

第一次修改- ->  git add - -> 第二次修改 - -> git commit ;

前面讲了,Git管理的是修改,当你用 git add 命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit   只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

提交后,用 git diff HEAD --  index.html  命令可以查看工作区和版本库里面最新版本的区别:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

由图上可知,第二次修改并没有被提交。

那怎么提交第二次修改呢?

第1:你可以连续接着两次修改后,一并使用命令 git add,再 git commit。如:第一次修改-->第二次修改--> git add --> git commit ;

第2:在第二次修改后,再次使用命令git add ,再 git commit 。如 第一次修改--> git add --> 第二次修改--> git add --> git commit ;

小结:

总而言之:每次修改,都必须要先使用添加命令 git add ,接着使用提交命令 git commit


                                                     撤销修改

第一种情况:只是修改,没有 git add 。

在紧急的工作中,难免会出现以下的错误,你在 index.html 中 添加了一行,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

在你准备提交前,猛然发现了stupid boss可能会让你丢掉这个月的奖金!既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。 如果用命令 git status 查看一下,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

由上图发现,Git会告诉你,在use第二行  git checkout -- <file>  可以在工作区撤销修改;

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

命令  git checkout -- index.html 意思就是,把index.html文件在工作区的修改全部撤销。这里撤销修改有两种情况:

第1:index.html 文件在工作区修改后,还没有git add 添加到暂存区,现在,撤销修改就回到工作区当时的状态;

第2:index.html 文件在工作区修改后,并且git add添加到暂存区,又作了修改;现在,撤销修改就回到添加到暂存区后的状态。

接下来,看看index.html 的文件内容,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

文件内容复原了。

命令git checkout -- file中的--很重要,没有--,就变成了“切换到另一个分支”的命令,在后面分支管理中会再次遇到git checkout命令。

 

第二种情况:修改后,在 git add 了。

现在假定是凌晨3点,你不但写了一些胡话,还  git add  到暂存区了,如下:(使用命令 cat

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

庆幸的是,在 git  commit  之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

由上可知:Git 告诉我们,用命令 git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

再用 git status 查看一下,现在暂存区是干净的,工作区有修改,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

由上图发现,Git会告诉你,在use第二行  git checkout -- <file>  可以在工作区撤销修改;

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

那么现在,撤销了修改,index.html文件 的最后一行没有了, 回到最初的样子;

 

第三种情况:

现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?

操作过程:修改文件 -->  git  add  -->  git commit

在第五篇有提到 :返回上一次修改的版本  git reset --hard commit-id(版本号) ,可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程仓库。

小结:

  1. 当你改乱了工作区某个文件的内容,想直接撤销工作区修改时,可以使用命令 git checkout -- <file>
  2. 不但改乱了工作区某个文件的内容,还添加到了暂存区时,想撤销修改,操作如下:

                    分两步:① 先 git reset HEAD <file> ,②接着使用命令 git checkout -- <file>

     3. 不但改乱了工作区某个文件的内容,还添加到了暂存区时,并且还提交 git commit 了。

          想撤销本次提交,只能使用命令 git reset --hard commit-id ,直接回退到上一个版本;前提是没有推送到远程库。


                                                    删除文件

在Git中,删除也是一个修改操作,实战一下,先添加一个新文件app.js到Git并且提交,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

一般情况下,①可以直接在文件夹下手动删除该文件,② 可以在命令窗口中输入命令 rm 删除,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

小提示:先手动删除文件,然后使用 git rm <file>git add <file> 效果是一样的。

 这时,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了(图上)。

现在有两个选择:一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit,如下:

管理修改、撤销修改git checkout -- <file>、删除文件git rm <file>(七)

另一个情况是:删错了文件,别忘了,删除也是修改操作,那么既然删错了,那就执行撤销操作,如下:

$ git checkout -- app2.js

命令 git checkout -- <file>  ,无论工作区是修改还是删除,都可以“一键还原”。

小结:

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删, 但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。


转自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ;