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用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删的问题。

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

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

Git速成学习第二课:管理修改与删除文件的更多相关文章

  1. Git速成学习第一课:创建版本库与版本回退

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 我太困了0.0精神点再写...... /*我来啦!以后会陆续更新自己的学习笔记*/ Git是分布 ...

  2. GIT 管理修改、删除文件

    管理修改 现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就 ...

  3. Git速成学习第五课:分支管理策略

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 通常合并分支时,如果可能用Fast forward模式,但是在这种模式下,删除分支后,会丢掉分支 ...

  4. Git速成学习第六课:Bug分支

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 当你接到一个修复代码为101的任务的时候,很自然的你想创建一个分支issue-101来修复它,但 ...

  5. Git速成学习第三课:创建与合并分支

    本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ...

  6. Git速成学习第四课:解决冲突

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 我们继续练习,准备新的feature1分支. $ git checkout -b feature ...

  7. Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD

    原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...

  8. Git管理修改、撤销修改、删除文件

    什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. a.管理修改 对于提交修改, ...

  9. 第二课 --- git的(管理修改和撤销修改、删除文件)

    读取文本内容: cat readme.txt 查看工作区与脚本库里面的区别: git diff HEAD -- readme.txt 丢弃工作区的修改内容: git checkout -- readm ...

随机推荐

  1. Ellipsis对象

    Ellipsis对象. 写作 : ‘…’ 中文解释:省略 该对象bool测试是为真 用途: 1.用来省略代码,作用类似于pass的一种替代方案,这是python的’TBD’(未确定内容). def f ...

  2. MySQL之InnoDB索引面试学习笔记

    写在前面 想要做好后台开发,终究是绕不过索引这一关的.先问自己一个问题,InnoDB为什么选择B+树作为默认索引结构.本文主要参考MySQL索引背后的数据结构及算法原理和剖析Mysql的InnoDB索 ...

  3. FireFox版本大于36.0,Yslow不能正常使用解决方案

    Yslow暂时不支持firefox 36.0及以上版本你可以使用它的书签版本.访问这里 http://yslow.org/mobile/把页面最后的那个 Desktop Bookmarklet Ins ...

  4. 父元素设置固定宽度并设置overflow:scroll,如何让子元素撑开父元素

    <div class="a"> <div class="b"> <div class="c">内容内容, ...

  5. [Codevs] 矩形面积求并

    http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...

  6. error while loading shared libraries: libmysqlclient.so.20 问题小结

    问题:安装完成sysbench之后,查看sysbench版本号时出现下面问题.这种报错很常见, [root@zero01 sysbench]# /usr/local/sysbench/bin/sysb ...

  7. prometheus简单监控Linux,mysql,nginx

    prometheus安装 下载安装 #官网下载 解压即可使用 https://prometheus.io/download/ #docker 方式安装 sudo docker run -n prome ...

  8. DUILib学习笔记---消息处理

    WIN32下窗口消息循环 MSG msg = { 0 }; while( ::GetMessage(&msg, NULL, 0, 0) ) { ::TranslateMessage(& ...

  9. codeforces#1234F. Yet Another Substring Reverse(子集dp)

    题目链接: https://codeforces.com/contest/1234/problem/F 题意: 给出一个只包含前20个小写字母的字符串,一次操作可以让一段字符颠倒顺序 最多一次这样的操 ...

  10. ArcGIS超级工具SPTOOLS-SHP转数据库,批量数据库转数据库,栅格彩色转黑白

    1.1  SHP转数据库 把一个文件夹的数据,转到数据库,或者另一个文件夹,不含字文件夹 1.2  批量数据库转数据库 把一个文件夹下GDB或者MDB,转到另一个文件夹为MDB,GDB,并实现版本的转 ...