第三章 时光机穿梭

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恢复

你可能感兴趣的:(第三章 时光机穿梭)