跟廖雪峰学Git 二 —— 基本操作

一、查看仓库状态

使用 git status 命令查看当前仓库状态。

接下来我们操作测试一下。

首先,修改 GitSpace 目录下的 readme.txt 文件,在原有内容下,加入一句:

Git status handler.

保存后,关闭编辑器。然后在 git bash 中输入 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")

返回的信息告诉我们 readme.txt 文件被修改过了。

然后如果相知道修改的详细内容,可以用 git diff 命令查看。

    $ git diff
    diff --git a/readme.txt b/readme.txt
    index 9f7547c..082f801 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,4 @@
     Git is a version control system.
    -Git is free software.
    \ No newline at end of file
    +Git is free software.
    +
    +Git status handler.
    \ No newline at end of file

返回的详细信息为 readme.txt 文件新增了一行空的 line,和一句

Git status handler。

之后,我们再把修改过的内容提交。

提交的命令我们之前操作过:

    $ git add readme.txt
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
            modified:   readme.txt
    
    $ git commit -m "modify readme.txt"
    [master 6f06d48] modify readme.txt
     1 file changed, 3 insertions(+), 1 deletion(-)
     
    $ git status
    On branch master
    nothing to commit, working tree clean

add readme.txt 文件,然后运行 git status 命令,看到仓库信息为:将要提交修改的 readme.txt 文件。最后提交。再次运行 git status 命令,就显示没有内容待提交,此时工作目录是干净的(working tree clean)。

二、版本回退

在开发中,我们肯定会遇到这样的问题。出现了错误代码的提交要回退到某个指定的代码版本,然后在正确版本的代码上去规避问题。

那我们怎么知道要具体回退到哪一个版本呢?或者我们怎么能记得住哪个版本我们提交了哪些内容呢?

当然,我所提的这肯定不算啥大问题,所有的代码版本控制系统完成这件事都是小菜一碟。

在 Git 中,我们可以使用 git log 命令查看我们提交代码的历史记录:

    $ git log
    commit 6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master)
    Author: gink 
    Date:   Fri Nov 24 10:28:30 2017 +0800
    
        modify readme.txt
    
    commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
    Author: gink 
    Date:   Thu Nov 23 16:55:51 2017 +0800
    
        add newfiles
    
    commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
    Author: gink 
    Date:   Thu Nov 23 16:52:25 2017 +0800
    
        add readme file

使用 git log 命令可以查看最近三次提交记录,显示序列由近到远。如果嫌显示的内容太过繁杂,可以加上--pretty=oneline参数:

    $ git log --pretty=oneline
    6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master) modify readme.txt
    4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef add newfiles
    f4625e13ea1076da03dc32f66b6ad0f4c651a26c add readme file

在 Git 中,用 HEAD 表示当前版本,上一个版本用 HEAD^ 表示,上两个版本用 HEAD^^ 表示。如果往上的版本太多,比如上100个版本,那就用 HEAD~100 表示。

然后你看到的一长串字符串是每次提交的版本号(commit id),如果想要进行回退,就要用到这些版本号。

注:需要注明的是,Git 和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

好了,现在开始吃后悔药,进行版本回退吧。

版本回退可以使用 git reset 命令,我们试一下,将版本回退到 add newfiles 版本。

    $ git reset --hard HEAD^
    HEAD is now at 4ab5b56 add newfiles
    
    $ git log
    commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef (HEAD -> master)
    Author: gink 
    Date:   Thu Nov 23 16:55:51 2017 +0800
    
        add newfiles
    
    commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
    Author: gink 
    Date:   Thu Nov 23 16:52:25 2017 +0800
    
        add readme file

OK,现在已经把版本回退到了add newfiles 版本。原来的 modify readme.txt 已经找不到了。那现在想再把 modify readme.txt 版本还原回来怎么办?

可以,只要你找到 modify readme.txt 的版本号。拿到版本号之后,运行命令:

    $ git reset --hard 6f06d48783
    HEAD is now at 6f06d48 modify readme.txt
    
    $ git log
    commit 6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master)
    Author: gink 
    Date:   Fri Nov 24 10:28:30 2017 +0800
    
        modify readme.txt
    
    commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
    Author: gink 
    Date:   Thu Nov 23 16:55:51 2017 +0800
    
        add newfiles
    
    commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
    Author: gink 
    Date:   Thu Nov 23 16:52:25 2017 +0800
    
        add readme file

注:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

三、工作区和暂存区

直接上结论:

  • 工作区:就是在电脑上能看到的目录。比如 GitSpace 文件夹。
  • 暂存区:git add 的操作就是把需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改

四、管理修改

管理修改是 Git 有别于也是优于别的版本控制系统的特点。

为什么说Git管理的是修改,而不是文件呢?我们还是在代码中看。

还是打开 readme.txt ,在最后加一行内容:

Git modify

然后,将本次修改添加到暂存区:

    $ git add readme.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
            modified:   readme.txt

然后,先不提交,再去修改 readme.txt :

    Git is a version control system.
    Git is free software.
    
    Git status handler.
    Git modify on file.

然后,再去提交:

    $ git commit -m "git change"
    [master d0d8cc4] git change
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    $ 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 至管理修改的特点了。因为我们只把第一次的修改添加到暂存区了,第二次的修改没有添加进去,自然就提交不上。

想要把第二次修改,可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了。

五、撤销以及修改

有时候我们会不小心手抖写错了一些文档或者写了错误的代码。这时,我们通常的做法都是删除错误的书写,让文件恢复到上一个版本的状态。这时候输入 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 会告诉你,可以使用 git checkout -- file 命令来丢弃工作区的修改。

    $ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

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

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

总之,就是让这个文件回到最近一次git commitgit add时的状态。

在工作目录中,如果你手动或者使用 rm 命令删除一个文件之后,运行 git status 会看到 Git 中有删除记录。

这时候你有两个选择,一个是使用 git rm 命令将文件删除,并且 git commit

这样,文件就彻底从版本库中删除了。

另一种情况就是,你又想吃后悔药了。想还原已经删除的文件。

此时,运行:

    $ git checkout -- 删除的文档名

就可以从版本库中还原已经删除的文件。

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

参考

Git教程

跟廖雪峰学Git 二 —— 基本操作_第1张图片

你可能感兴趣的:(跟廖雪峰学Git 二 —— 基本操作)