概述

我们已经成功的添加了一个 readme.txt文件 , 现在是时候 继续工作了 , 于是 我们开始尝试一下 Git给我们所带来的便利下面修改read.txt 改成如下内容

为了尝试 Git 给我们带来的便利 这是 第一次修改 !

现在运行 git  status 查看 暂存去的状态 .

 xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

上面的命令告诉我们 readme.txt 已经被修改了 , 但是没有修改的内容 , 如果想查看修改的内容的话 需要用 git diff 查看修改的内容

xpower@xpower-CW65S:~/learngit$ git diff
diff --git a/readme.txt b/readme.txt
index 8fd42a5..fa79f95
--- a/readme.txt
+++ b/readme.txt
@@ -, + @@
-git is version control systen.
-git is free software
-
+为了尝试 Git 给我们带来的便利 这是 第一次修改 !

git diff 顾名思义就是查看 difference , 显示的格式正式 Unix 通用的 diff 格式 , 可以从上面的命令输出看到我们将 原文内容修改了 .

下面我们就开始将暂存去区的内容 , 转移到工作区 .

xpower@xpower-CW65S:~/learngit$ git commit -a

这时候会出来 VIM 编译器 用于输入 这次修改的注释

 xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
无文件要提交,干净的工作区

版本回退

现在再将文件修改

 为了尝试 Git 给我们带来的便利 这是 第二次修改 !

然后查看一下 暂存区 状态

xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

像这样 , 你不断的对文件进行修改 , 然后不断的提交修改到版本库里面 , 就好比玩RPG游戏的时候 , 每次通过一个关卡的时候就会自动把游戏状态存盘 , 如果某一关没过去 , 你还可以读取前一关的状态 . 有些时候打Boss  前你会手动存盘 以便万一失败 可以从最近的地方重新开始 . Git也是一样 , 当你觉得文件修改到了一定的程度的时候你可以 " 保存一个快照 "这个快照在Git中被称为 commit . 一但你的文件弄坏了 , 就可以从最近的一个 commit 回复 , 然后继续工作 , 而不是把几个月的工作成果全部丢失 .

现在我们回复一下 readme.txt文件一共有几个版本被提交到了 Git仓库里面

版本 1 :

 Git is a version control system.
Git is free software.

版本 2 :

为了尝试 Git 给我们带来的便利 这是 第一次修改 !

版本 3 :

为了尝试 Git 给我们带来的便利 这是 第二次修改 !

当然了 在实际工作当中 , 我们脑子里面怎么可能记得一个几千行的文件每次都修改了什么内容

这时候就可以使用 版本控制里面的 git log

 xpower@xpower-CW65S:~/learngit$ git log
commit 2d8b618e4a5ef0cb501d5b4f06fd92651b811c8a
Author: xpower <@qq.com>
Date: Sun Aug :: + 这是我进行的第二次修改为了尝试版本退回 commit a57e93105963a9060cd6ce6d3ddf62ec3fbd9397
Author: xpower <@qq.com>
Date: Sun Aug :: + 这修改 是我为了测试 而作的 commit 75cc461de80b076dc9b229442c78034bea4458e8
Author: xpower <@qq.com>
Date: Sun Aug :: + wrote a readme file

好了 我们现在将 文件退回 上一个版本

首先 Git 必须知道当前的版本是那个版本 , 在Git 当中 , 用 HEAD 表示当前版本 , 也就是最新提交的.  2d8b618e4a5ef0cb501d5b4f06fd92651b811c8a 上一个版本就是 HEAD^ 上上一个就是HEAD^^ 当然如果要上一百个版本的话 咋办 ? 写一百个 ^ ? 所以我们 写成这样 HEAD~100

现在我们将版本退回到上一个版本 .

xpower@xpower-CW65S:~/learngit$ git reset --hard HEAD^
HEAD 现在位于 a57e931 这修改 是我为了测试 而作的

上次我们所写的注释也会一并输出 .  --hard 是干啥的呢 ? 这个后面再说 .

看看 readme.txt 的内容是不是    改变了

        果真回到了我们第一次修改的内容 ,

现在 查看一下记录

xpower@xpower-CW65S:~/learngit$ git log
commit a57e93105963a9060cd6ce6d3ddf62ec3fbd9397
Author: xpower <@qq.com>
Date: Sun Aug :: + 这修改 是我为了测试 而作的 commit 75cc461de80b076dc9b229442c78034bea4458e8
Author: xpower <@qq.com>
Date: Sun Aug :: + wrote a readme file

现在版本库已经看不到第二次修改了 , 但是你有发现原来删除的就是最好的 怎么办 ?

办法就是根据该版本的版本号来退回该版本 . 如果你的终端期间没有关闭 , 那么往上翻 , 找到你想到达的版本 , 用   git reset --hard 版本号 退回       如果终端关闭了怎么办 ? 你可以使用 git refgitlog 来查看你的名词命令

 xpower@xpower-CW65S:~/learngit$ git reflog
a57e931 HEAD@{}: reset: moving to HEAD^
2d8b618 HEAD@{}: commit: 这是我进行的第二次修改为了尝试版本退回
a57e931 HEAD@{}: commit: 这修改 是我为了测试 而作的
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^^
2b2b62f HEAD@{}: commit: understand how stage works
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: commit: append GPL
294198b HEAD@{}: commit: add distributed
75cc461 HEAD@{}: commit (initial): wrote a readme file

找到版本号之后 , git reset --hard 2d8b618 让 HEAD 指向该版本

工作区和暂存区的概念

  工作区(Working Dire)

就是电脑里面的那个目录 , 例如我电脑里面的 learngit 这就是一个工作区

  版本库(Repository)

工作区有一个隐藏目录 .git (在之前我们已经说过了.) 这个不是工作区 , 而是Git的版本库 .

Git的版本库里面 存储了很多东西 , 其中最为重要的就是成为 stage (或者index)的暂存区 , 还有Git为我们自动创建的第一个分支 master (注意这里所说), 以及指向master的一个指针叫做HEAD.
前面我们曾经说过将文件添加到 GIt 版本库里面的时候 , 我们分两步执行

第一步  : 用 git add 把文件添加进去 , 实际上就是把文件修改添加到暂存区 .
第二步  : 用 git commit 提交更改 , 实际上就是将暂存区的内容 提交到当前分支.

因为我们创建版本库的时候 , Git 自动为我们创建一个 Master 分支  , 所以现在 , git commit 就是往 master分支上提交更改 .

Git ~ 回到过去 , 进入未来 ~ Git的更多相关文章

  1. GIT入门笔记(8)-- 查看历史提交记录/根据版本号回到过去或未来

    在Git中,用HEAD表示当前版本,也就是最新的提交版本, 上一个版本就是HEAD^, 上上一个版本就是HEAD^^, 往上100个版本写100个^比较容易数不过来,所以写成HEAD~100. Git ...

  2. [Git] 009 逆转未来

    1. 想逆转未来,得先知道时间线 1.1 git log 1.2 git log --oneline 此命令的显示结果比 git log 简洁 1.3 git reflog 此命令显示的记录比前两者完 ...

  3. Git详解之一 Git实战

    Git详解之一 Git实战 入门 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章 ...

  4. linux Git版本控制学习与Git服务器搭建

    来源地址 要随时掌握工作区的状态,使用git status命令. 如果git status告诉你有文件被修改过,用git diff可以查看修改内容. 初始化一个Git仓库,使用git init命令. ...

  5. git学习------>写给 Git 初学者的7个建议

    PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...

  6. 工具系列 | git checkout 可替换命令 git switch 和 git restore

    前言 git checkout 这个命令承担了太多职责,既被用来切换分支,又被用来恢复工作区文件,对用户造成了很大的认知负担. Git社区发布了Git的新版本2.23.在该版本中,有一个特性非常引人瞩 ...

  7. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  8. git diff 生成patch, git apply patch 打补丁方法说明,以及分支管理的简单操作。

    git diff 简易操作说明 先git log 查看commit ID, 记录你想要打的补丁的ID 比如说: git log commit 4ff35d800fa62123a28b7bda2a04e ...

  9. git: fatal: Not a git repository (or any of the parent directories): .git

    在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...

  10. 深入理解git,从研究git目录开始

    转发学习的啦. 似乎很少有人在读某个git快速教程的时候会说:“这个关于git的快速教程太酷了!读完了用起git来超级舒服,并且我一点也不怕自己会破坏什么东西.” 对git的初学者来说,刚接触git时 ...

随机推荐

  1. 正确理解Spring AOP中的Around advice

    Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before ad ...

  2. 初学java之StringBuffer类的常用方法

    import java.text.*; public class Gxjun { public static void main(String atgs[]) { StringBuffer str= ...

  3. 20145236 《Java程序设计》实验五实验报告

    20145236 实验五 Java网络编程 实验内容 1.运行TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TC ...

  4. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  5. Swing——JFrame

    1.定义 相对于AWT(hevay weight component),Swing(hevay weight component)是轻量化的组件.Swing由纯Java Code 所写,解决了Java ...

  6. Java多线程-新特征-锁(下)

    在上文中提到了Lock接口以及对象,使用它,很优雅的控制了竞争资源的安全访问,但是这种锁不区分读写,称这种锁为普通锁.为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控 ...

  7. 生JS实现jQuery的ready方法呢?下面是其中之一的做法:

    function ready(fn){ if(document.addEventListener){      //标准浏览器 document.addEventListener('DOMConten ...

  8. 有关C#中使用if else和try catch的问题及效率问题

    本来if esle 是流程控制 try catch是异常处理,本身其实是没有可比性的,但是开发过程中有的人很容易混用,而且两者有的时候效果似乎一样,所以我还是用了个简单的测试来简单的比较下. 不多说, ...

  9. POJ 1012 Joseph 推导,暴力,约瑟夫环,打表 难度:2

    http://poj.org/problem?id=1012 答案以954ms飘过,不过这道题可以轻松用打表过 思路:如果我们把每个人位于数组中的原始编号记为绝对编号,每次循环过后相对于绝对编号为0的 ...

  10. 编码为multipart/form-data自定义类型(包括文件)如何自动绑定到webapi的action的参数里

    application/x-www-form-urlencoded与 multipart/form-data: Fom表单中如果没有type=file的控件,用默认的application/x-www ...