参考博文:廖雪峰Git教程

1. 管理修改

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

你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对README.txt做一个修改,比如加一行内容:

  1. [root@mini05 zhangtest]# cat README.md
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes. # 添加的内容
  9. [root@mini05 zhangtest]# git add README.md
  10. [root@mini05 zhangtest]# git status
  11. # On branch master
  12. # Your branch is ahead of 'origin/master' by commits.
  13. # (use "git push" to publish your local commits)
  14. #
  15. # Changes to be committed:
  16. # (use "git reset HEAD <file>..." to unstage)
  17. #
  18. # modified: README.md
  19. #

然后,再修改readme.txt:

  1. [root@mini05 zhangtest]# cat README.md
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes of files. # 之前行字符串,换为了这个

之后提交:

  1. [root@mini05 zhangtest]# git commit -m "git tracks changes"
  2. [master b293c46] git tracks changes
  3. file changed, insertion(+)

提交后,再看看状态:

  1. [root@mini05 zhangtest]# git status
  2. # On branch master
  3. # Your branch is ahead of 'origin/master' by commits.
  4. # (use "git push" to publish your local commits)
  5. #
  6. # Changes not staged for commit:
  7. # (use "git add <file>..." to update what will be committed)
  8. # (use "git checkout -- <file>..." to discard changes in working directory)
  9. #
  10. # modified: README.md
  11. #
  12. no changes added to commit (use "git add" and/or "git commit -a")

怎么第二次的修改没有被提交?

别激动,我们回顾一下操作过程:

第一次修改 -> git add -> 第二次修改 -> git commit ,中间缺少了一个git add

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

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

  1. [root@mini05 zhangtest]# git diff HEAD -- README.md
  2. diff --git a/README.md b/README.md
  3. index 8de2e69..3b892c6
  4. --- a/README.md
  5. +++ b/README.md
  6. @@ -, +, @@ Git is a distributed version control system.
  7. Git is free software.
  8.  
  9. -Git tracks changes.
  10. +Git tracks changes of files.

可见,第二次修改确实没有被提交。

那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:

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

2. 撤销修改

2.1. 场景1

当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

添加了如下信息:

  1. [root@mini05 zhangtest]# cat README.md
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes of files.
  9. aabbccdd # 添加的信息

查看状态信息

  1. [root@mini05 zhangtest]# git status
  2. # On branch master
  3. # Your branch is ahead of 'origin/master' by commits.
  4. # (use "git push" to publish your local commits)
  5. #
  6. # Changes not staged for commit:
  7. # (use "git add <file>..." to update what will be committed)
  8. # (use "git checkout -- <file>..." to discard changes in working directory)
  9. #
  10. # modified: README.md
  11. #
  12. no changes added to commit (use "git add" and/or "git commit -a")

丢弃工作区的修改并再次查看信息

  1. [root@mini05 zhangtest]# git checkout -- README.md # 丢弃工作区的修改
  2. [root@mini05 zhangtest]# cat README.md
  3. # zhangtest
  4. zhangtest
  5. 张三
  6. Git is a distributed version control system.
  7. Git is free software.
  8.  
  9. Git tracks changes.
  10. [root@mini05 zhangtest]# git status
  11. # On branch master
  12. # Your branch is ahead of 'origin/master' by commits.
  13. # (use "git push" to publish your local commits)
  14. #
  15. nothing to commit, working directory clean

说明:这里有两种情况

一种是README.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是README.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

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

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

2.2. 场景2

你不但写了一些废话,还git add到暂存区了。

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

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

增加信息并添加到暂存区

  1. [root@mini05 zhangtest]# cat README.md
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes.
  9. aabbccdd # 添加的信息
  10. [root@mini05 zhangtest]# git add README.md # 添加到暂存区

查看状态信息

  1. [root@mini05 zhangtest]# git status
  2. # On branch master
  3. # Your branch is ahead of 'origin/master' by commits.
  4. # (use "git push" to publish your local commits)
  5. #
  6. # Changes to be committed:
  7. # (use "git reset HEAD <file>..." to unstage)
  8. #
  9. # modified: README.md
  10. #

回到最新版本

  1. [root@mini05 zhangtest]# git reset HEAD README.md
  2. Unstaged changes after reset:
  3. M README.md

再次查看状态信息

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

  1. [root@mini05 zhangtest]# git status
  2. # On branch master
  3. # Your branch is ahead of 'origin/master' by commits.
  4. # (use "git push" to publish your local commits)
  5. #
  6. # Changes not staged for commit:
  7. # (use "git add <file>..." to update what will be committed)
  8. # (use "git checkout -- <file>..." to discard changes in working directory)
  9. #
  10. # modified: README.md
  11. #
  12. no changes added to commit (use "git add" and/or "git commit -a")

丢弃工作区的修改

  1. [root@mini05 zhangtest]# git checkout -- README.md
  2. [root@mini05 zhangtest]# git status
  3. # On branch master
  4. # Your branch is ahead of 'origin/master' by commits.
  5. # (use "git push" to publish your local commits)
  6. #
  7. nothing to commit, working directory clean
  8. [root@mini05 zhangtest]# cat README.md
  9. # zhangtest
  10. zhangtest
  11. 张三
  12. Git is a distributed version control system.
  13. Git is free software.
  14.  
  15. Git tracks changes.

说明:

现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。一旦你提交推送到远程版本库,你就真的惨了……

2.3. 小结

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

3. 删除文件

3.1. 删除文件

添加文件并提交

  1. [root@mini05 zhangtest]# echo "" > aaa.txt
  2. [root@mini05 zhangtest]# git add aaa.txt
  3. [root@mini05 zhangtest]# git commit -m "add aaa.txt"
  4. [master 6d0226b] add aaa.txt
  5. file changed, insertion(+)
  6. create mode aaa.txt

本地删除文件并查看状态

  1. [root@mini05 zhangtest]# rm -f aaa.txt # 本地删除
  2. [root@mini05 zhangtest]# git status
  3. # On branch master
  4. # Your branch is ahead of 'origin/master' by commits.
  5. # (use "git push" to publish your local commits)
  6. #
  7. # Changes not staged for commit:
  8. # (use "git add/rm <file>..." to update what will be committed)
  9. # (use "git checkout -- <file>..." to discard changes in working directory)
  10. #
  11. # deleted: aaa.txt
  12. #
  13. no changes added to commit (use "git add" and/or "git commit -a")

git 删除文件并查看状态

  1. [root@mini05 zhangtest]# git rm aaa.txt
  2. rm 'aaa.txt'
  3. [root@mini05 zhangtest]# git commit -m "del aaa.txt"
  4. [master c795cfc] del aaa.txt
  5. file changed, deletion(-)
  6. delete mode aaa.txt
  7. [root@mini05 zhangtest]# git status
  8. # On branch master
  9. # Your branch is ahead of 'origin/master' by commits.
  10. # (use "git push" to publish your local commits)
  11. #
  12. nothing to commit, working directory clean

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

3.2. 误删恢复

如果误删除本地文件了,但是没有删除版本库中的,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本.

  1. [root@mini05 zhangtest]# git checkout -- aaa.txt

  

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

3.3. 小结

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

GitHub-版本管理的更多相关文章

  1. Mac系统下,在android studio中使用Github版本管理

    1.下载并安装github客户端http://git-scm.com/download/ 2.打开android studio,测试github是否使用ok 点击"test",如果 ...

  2. Github版本管理以及git使用

    1.git客户端编译安装 同步系统时间服务器 ntpdate cn.ntp.org.cn 安装依赖包: [root@baolin ~]# yum install epel-release -y [ro ...

  3. 如何把SAP WebIDE里的Web项目同Github仓库连接起来

    我们在SAP WebIDE里进行UI5应用开发时,当然也希望能将开发的代码纳入到github版本管理中去. 步骤其实非常简单. 右键点击WebIDE里UI5应用,git->Initialize ...

  4. git命令与协同开发

    一 git命令 1.简单命令 git init # 初始化 (建立git 版本相关文件关系都放这里) git config --global user.email "you@example. ...

  5. 开源 ERP 系统 GoodERP

    如果你有一个苹果,我也有一个苹果,彼此交换后,你我还是一人一个苹果,但是如果你有一个想法,我有一个想法,彼此交换后,你我就都有两个想法,三个人呢?一百个人呢? 使用openobject框架 重写全部功 ...

  6. 搜刮一些开源项目的APP

    iOS完整App资源收集 <iOS完整app资源收集>  <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...

  7. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程

    一.目前流行的源程序版本管理软件和项目管理软件有Microsoft TFS.GitHub.SVN.Coding等. 二.各有什么优缺点 三.在GitHub注册账户的过程 Microsoft TFS的优 ...

  8. 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。

    问题一:上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?(以下内容为网上查询所得) Microsoft TFS(Team Foundation Server): 优点: ...

  9. 源代码版本管理与项目管理软件的认识与github的注册

    源代码版本管理软件: 主要有:svn,cvs,hg,git,VSS 这些工具主要是一种记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.Perforce,StarTeam)- ...

  10. 源程序版本管理软件和项目管理软件,Github注册流程

    目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点: Microsoft TFS: 优点: tfs核心的,是对敏捷,msf,cmm ...

随机推荐

  1. Response.Redirect()和Response.RedirectPermanent()区别

    备注:这里我用到了Response.RedirectPermanent()用于做301跳转, 如:我希望访问网站的url访问地址为:http://m.shop/abc.html ,用户输入的访问地址: ...

  2. 快速搭建一个Quartz定时任务【转载,好文 ,值得收藏,亲身试用 效果不错】

    Quartz.NET 入门 概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔 ...

  3. c# 使用迭代器来创建可枚举类型

    class Program { public IEnumerator<string> GetEnumerator() { IEnumerable<string> my = Bl ...

  4. spring_01概念及案例

    1.什么是IOC? IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContex ...

  5. 月薪25K的90后程序员,他们都经历了什么?

    如果说薪资是检验一家公司对程序员认可的标准,那么年纪轻轻就能达到月薪 25K,一定程度上说明了公司对他创造的价值的认可. 深访10+ 名月薪25K的程序员,发现他们最常见的三种成长途径是…… 在公司发 ...

  6. 判断文本是否溢出/hover显示全部

    前言 在工作中我们经常会遇到,文字过多,需要用省略号,并且鼠标hover的时候 还需要 显示全部的文字的需求. 正文 文字过多需要用省略号的实现:上代码啦 .ellipsis { width: 100 ...

  7. Python importlib 动态加载模块

    # 创建一个 src 文件夹,里面有一个 commons.py 文件,内容如下 def add(): print("add ....") # 创建一个 app.py 文件,内容如下 ...

  8. PHP7.27: Cookie and Session

    <?php // 有的浏览器不支持Cookie,这要考虑的 $cFile="count.txt"; $acctime=time(); if(file_exists($cFil ...

  9. JS ES6中的箭头函数(Arrow Functions)使用

    转载这篇ES6的箭头函数方便自己查阅. ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 基础语法 (参数1, 参数2, …, 参数N) => ...

  10. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...