• Git速成学习第二课:管理修改与删除文件


    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/

    • 管理修改

      首先我们需要明确,为什么说Git管理的是修改而不是文件呢?

      我们首先对于已有的readme.txt文件进行修改,比如加上一行内容:

    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes.

      然后添加:

    $ git add readme.txt
    $ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #       modified:   readme.txt
    #

      然后再修改readme.txt文件:

    $ cat readme.txt 
    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files

      提交:

    $ git commit -m "git tracks changes"
    [master 519219b] git tracks changes
     1 file changed, 1 insertion(+)

      提交后查看状态:

    $ 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
    
    no changes added to commit (use "git add" and/or "git commit -a")

      我们通过命令行结果显示发现第二次的修改没有提交?

      回顾操作过程:第一次修改 --> git add --> 第二次修改 --> git commit

      我们在前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改就被放入暂存区,准备提交。

      但是在工作区的第二次修改并没有放入暂存区。所以git commit只负责把暂存区的修改提交,也就是第一次的修改提交

      第二次的修改并不会被提交。

      当你用git diff HEAD -- readme.txt命令可以查看工作区和版本库离差最新版本的区别:

    $ git diff HEAD -- readme.txt 
    diff --git a/readme.txt b/readme.txt
    index 76d770f..a9c5755 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,4 +1,4 @@
     Git is a distributed version control system.
     Git is free software distributed under the GPL.
     Git has a mutable index called stage.
    -Git tracks changes.
    +Git tracks changes of files.

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

      你可以继续git addgit commit,也可以先git第二次的修改,再git commit,就相当于把两次修改合并后一块提交:

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

    • summary

      现在你应该理解了Git是如何跟踪修改的,每次修改,如果不用 add git到暂存区,那就不会加入到commit中。

      git diff filename:比较工作区和暂存区

      git diff HEAD -- filename:比较工作区和版本库的最新版本

      如果git diff输出空白就说明工作区是干净的(干净应该就是指与比较的区相同)

    • 撤销修改

      当你在文件中有的修改是错误的,但是你还是提交了。比如你在readme.txt中添加了:

    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.
    My stupid boss still prefers SVN.

      因为错误发现的很及时,你可以删掉最后一行,手动将文件恢复到上个版本的状态。如果用git status查看:

    $ 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
    
    no changes added to commit (use "git add" and/or "git commit -a")

      你会发现,Git告诉你,git checkout -- file可以丢弃工作区的修改:

    $ git checkout -- readme.txt

      这个命令的意思就是把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

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

      总之这个就是让文件回到最近的一次git commit或者git add时的状态。

      现在我们看看readme.txt的内容:

    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.

      文件果然恢复了。

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

      现在有这种可能,你不仅将文档写错,而且还git add到了暂存区:

    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.
    My stupid boss still prefers SVN.
    
    $ git add readme.txt

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

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

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

    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M    readme.txt

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

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

    $ 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

      还记得如何丢弃工作区的修改么?

    $ git checkout -- readme.txt
    
    $ git status
    On branch master
    nothing to commit, working tree clean

      现在你不但改错了东西,还从暂存区提交到了版本库。你可以回退到上一个版本,不过这是有条件的,就是你还没有把自己的本地版本库推送到远程。

      后面会学习到远程版本库,一旦你把错误内容提交到了远程版本库,那就GG了......

    • Summary
    1. 当你修改乱了某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
    2. 当你不但修改乱了某个文件的内容,还添加到了暂存区,想丢弃修改,分两步。
      • git reset HEAD <file>回到场景1
      • 第二步按照场景1操作
    3. 已经提交了不合适的修改到版本库,想要撤销本次提交,参考第一课,不过是前提没有推送到远程库
    • 删除文件

      在Git中删除也是一个修改操作,先新添加一个文件test.txtGit中并提交:

    $ git add test.txt
    
    $ git commit -m "add test.txt"
    [master b84166e] add test.txt
     1 file changed, 1 insertion(+)
     create mode 100644 test.txt

      一般情况下,你通常直接在文件管理器中把没用的文件删除,或者用rm命令删除:

    $ rm test.txt

      这个时候,git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立即告诉你那些文件被删除了:

    $ git status
    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 rm删除,并且用git commit

    $ git rm test.txt
    rm 'test.txt'
    
    $ git commit -m "remove test.txt"
    [master d46f35e] remove test.txt
     1 file changed, 1 deletion(-)
     delete mode 100644 test.txt

      现在文件就从版本库中被删除了

      /*先动手删除文件,然后使用git rm <file>和git add <file>的效果是一样的。*/

      另外一种情况是删除错误,因为版本库中还有呢,所以可以轻松把误删的文件恢复到最新的版本:

    $ git checkout -- test.txt

      git checkout 其实是用版本库里的版本替换工作区版本,无论工作区是修改还是删除,都可以一键还原。

      /*注意:从来没有被添加到版本库就删除的文件,是无法恢复的!!!*/

    • Summary:

      命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删的问题。

      但是要小心,你只能恢复文件到最新的版本,你会丢失最近一次提交后你修改的内容

    对你有帮助就支付宝请我喝可乐叭~~~

  • 相关阅读:
    更改已经签名的app中的内容
    POJ 1611 The Suspects
    hibernate session缓存
    男儿当自强
    图遍历的演示
    nginx源代码分析--事件模块 &amp; 琐碎
    多线程在python中的使用 thread
    机房收费 &amp; 廊院食堂
    the steps that may be taken to solve a feature selection problem:特征选择的步骤
    早绑定和迟绑定技术的通俗分析
  • 原文地址:https://www.cnblogs.com/baobaotql/p/11759951.html
Copyright © 2020-2023  润新知