第三章 时光机穿梭

1. 版本回退

修改之前readme.txt的内容,运行git status命令查看结果

$ git status

On branch master

Changes not staged for commit:

  (use "git add ..." to update what will be committed)

  (use "git checkout -- ..." to discard changes in working directory)


    modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git status命令可以时刻掌握仓库当前状态。以上结果表明,teadme.txt已经被改动了,但还没有准备提交的修改。

如何查看修改内容呢,使用git diff命令查看

$ git diff readme.txt

diff --git a/readme.txt b/readme.txt

index 46d49bf..9247db6 100644

--- a/readme.txt

+++ b/readme.txt@@ -1,2 +1,2 @@

-Git is a version control system.

+Git is a distributed version control system.

 Git is free software.

Git diff(查看difference),了解到修改详情后,需要重新提交文件到仓库

$ git add readme.txt

$ git commit -m "add distributed"

[master e475afc] add distributed

 1 file changed, 1 insertion(+), 1 deletion(-)

提交后查看仓库状态:

$ git status

On branch master

nothing to commit, working tree clean

总结:

Git status查看文件是否被修改,查看仓库状态。

Git diff查看修改内容。


2. 版本回退

在Git中,我们可以用git log命令查看版本历史纪录:

$ git log

commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)

Author: Michael Liao

Date:   Fri May 18 21:06:15 2018 +0800


    append GPL


commit e475afc93c209a690c39c13a46716e8fa000c366

Author: Michael Liao

Date:   Fri May 18 21:03:36 2018 +0800


    add distributed


commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0

Author: Michael Liao

Date:   Fri May 18 20:59:18 2018 +0800


    wrote a readme file

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

$ git log --pretty=oneline

c585e4a6ae21136fddf3fe6e447aa8427b31fc78 (HEAD -> master) recommit

1f60bf7e092fd94c9445d2a0743654e6603ad30e recommit

9b6fa8aef3e22b607e03d8c0821e24f1581465b6 there is 4 files

29b5091840a99a2cd7bf5681bd9c66ff704b0d58 wrote a readme file

提示:前面那一串数字是commit id的版本号。

每次提交一个新版本,实际上Git就会把他们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚的看到时间线。

如何将文件回退到上一个版本呢?

首先,git得需要知道版本号。在git中,用HEAD表示当前版本,上一个就是HEAD^,上上一个就是HEAD^^,上上上一个就是HEAD^^^,往上100个版本HEAD~100。

现在要回退到上一个版本,就可以用git reset命令

student30@CN01VRIAPC30 MINGW64 /g/learngit (master)

$ git reset --hard HEAD^

HEAD is now at 9b6fa8a there is 4 files

如果想回溯到转换之前的版本呢?

那得找到那一串数字的号码,然后通过reset版本号就可以了。

$ git reset --hard c585e4a6ae21136fddf3fe6e447aa8427b31fc78

HEAD is now at c585e4a recommit

如果版本号丢失了,找不到怎么办呢?

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

student30@CN01VRIAPC30 MINGW64 /g/learngit (master)

$ git reflog

c585e4a (HEAD -> master) HEAD@{0}: reset: moving to c585e4a6ae21136fddf3fe6e447aa8427b31fc78

9b6fa8a HEAD@{1}: reset: moving to HEAD^

1f60bf7 HEAD@{2}: reset: moving to HEAD^

c585e4a (HEAD -> master) HEAD@{3}: commit: recommit

1f60bf7 HEAD@{4}: commit: recommit

9b6fa8a HEAD@{5}: commit: there is 4 files

29b5091 HEAD@{6}: commit (initial): wrote a readme file


总结:

HEAD指向的版本就是当前版本,因此可以用命令git reset --hard commit_id来版本穿梭

穿梭前,用git log查看提交历史,确定回到哪个版本

要重返穿梭前,可以采用git reflog查看命令历史,以便找到回到的版本


3. 工作区和暂存区

工作区(working directory),就是电脑里能看到的目录,比如learngit文件夹就是一个工作区。

版本库(Repository),工作区中一个隐藏目录.git,这个不算工作区,他是Git的版本库。

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

之前往git版本库中添加文件时是分两步执行的:

第一步git add添加文件,实际上是把文件修改添加到暂存区;

第二步使用git commit提交更改,实际是把暂存区内容提交到当前分支。

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


4. 管理修改

Git比其他版本控制器优秀的一大原因是,Git跟踪的是修改记录而并非文件。

每次修改,如果不用git add到暂存区,那就不会加入到commit中。


5.撤销修改

当修改了文件后,查看当前status你会发现,Git告诉你,git checkout --file可以丢弃工作取得修改:

$ git checkout -- readme.txt

以上命令意为,把readme.txt文件在工作区的修改全部撤销,有两种情况:

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

2. readme.txt已经添加到暂存区后,又做了修改,现在撤销修改就回到添加到暂存区后的状态。

如果已经把readme.txt加入暂存区怎么办?

1.用命令git reset HEAD 可以把暂存区的修改撤销(unstage),重新放回工作区。

$ git reset HEAD readme.txt

Unstaged changes after reset:

M    readme.txt

2. 然后用checkout丢弃工作区的修改

$ git checkout -- readme.txt


$ git status

On branch master

nothing to commit, working tree clean

总结:

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

2. 当你不仅该乱了内容,还添加到了暂存区时,还想丢弃修改。有两步:

1. 用命令git reset HEAD , 就回到了场景一

2. 用命令git checkout -- file恢复

3.已经提交了不合适的修改到版本库时,想要撤销本次提交,只能版本回退,前提是没有推送到远程库。


6. 删除文件

利用rm file可以删除文件。

删除后用git commit确认删除,误删用git checkout恢复

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容