概述

我们已经成功的添加了一个 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. Runner站立会议之个人会议(冲刺二)

    2016.5.23 今天开会确定了接下来的目标,完成收集相关数据任务 明天要寻找类型对应的按钮图标 遇到的问题:数据中男女生,有无恋爱,区域限制均可能导致计划部分有出入 2016.5.24 今天查询相 ...

  2. memset,memcpy,memcmp用法

    void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...

  3. 读《程序员的SQL金典》[1]--基础数据检索

    前言 <程序员的SQL金典>这本书是杨中科老师的,拜读了一下,简单做了读书笔记供以后翻阅.仅供学习分享,要想细读的话推荐购买原版呀! 这次读书的时候用了新的办法把看书计划进行了量化,虽然简 ...

  4. mvc学习记录

    1.关于mvc中的session在controller中传递 在用mvc开发新项目的时候,不久就遇到一个头大的问题,session在controller中传递居然出现空值,但明明一开始就赋值了,通过度 ...

  5. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  6. javascript 倒计时获取验证码

    var wait=60;function reSendCode(id) { var obj = $("#"+id); if (wait == 0) { obj.attr(" ...

  7. dancing link模板

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  8. ionic build --release android

    ionic bulid android ionic build --release android keytool -genkey -v -keystore demo.keystore -alias ...

  9. string.format

    string.Format("{0:#,0}", c.num), //千分号,有小数就保留2位小数 string.Format("{0:N2}", c.amou ...

  10. LIS-Program E

    最大上升子序列 Description The world financial crisis is quite a subject. Some people are more relaxed whil ...