git教程2(版本回退、管理修改、删除文件)——廖雪峰老师

原教程网址:https://www.liaoxuefeng.com/

时光机穿梭

目录

  • 时光机穿梭
  • 目录
    • 版本回退
    • 工作区和暂存区
    • 管理修改
    • 撤销修改
    • 删除文件

首先进入 learngit目录
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第1张图片

修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
Git is free software.

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第2张图片
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第3张图片

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第4张图片

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,
提交修改和提交新文件是一样的两步,第一步是git add:
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第5张图片
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第6张图片
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第7张图片

git add readme.txt
git commit -m "add distributed"

git status
git diff

1 版本回退

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第8张图片

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

commit 命令 相当于保存一个快照

现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第9张图片
当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

git log

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第10张图片
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第11张图片

这里写图片描述

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“add distributed”的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第12张图片

最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164…,于是就可以指定回到未来的某个版本:

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第13张图片
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第14张图片

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset –hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。

Git提供了一个命令git reflog用来记录你的每一次命令:

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第15张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第16张图片

2 工作区和暂存区

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第17张图片
版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第18张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第19张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第20张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第21张图片

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第22张图片

3 管理修改

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

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

为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对readme.txt做一个修改,比如加一行内容:
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第23张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第24张图片

你看,我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第25张图片

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

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第26张图片

4 撤销修改

自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行:
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第27张图片
在你准备提交前,一杯咖啡起了作用,你猛然发现了“stupid boss”可能会让你丢掉这个月的奖金!

既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。如果用git status查看一下:

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第28张图片

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

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第29张图片

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第30张图片

现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把“stupid boss”提交推送到远程版本库,你就真的惨了……

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

5 删除文件

git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第31张图片
git教程2(版本回退、管理修改、删除文件)——廖雪峰老师_第32张图片

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

你可能感兴趣的:(git教程)