美文网首页Git使用Android开发经验谈Android开发
跟廖雪峰学Git 二 —— 基本操作

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

作者: GinkWang | 来源:发表于2017-11-24 22:15 被阅读32次

    一、查看仓库状态

    使用 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 <file>..." to update what will be committed)
          (use "git checkout -- <file>..." 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 <file>..." 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 <wang_gk@foxmail.com>
        Date:   Fri Nov 24 10:28:30 2017 +0800
        
            modify readme.txt
        
        commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
        Author: gink <wang_gk@foxmail.com>
        Date:   Thu Nov 23 16:55:51 2017 +0800
        
            add newfiles
        
        commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
        Author: gink <wang_gk@foxmail.com>
        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 <wang_gk@foxmail.com>
        Date:   Thu Nov 23 16:55:51 2017 +0800
        
            add newfiles
        
        commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
        Author: gink <wang_gk@foxmail.com>
        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 <wang_gk@foxmail.com>
        Date:   Fri Nov 24 10:28:30 2017 +0800
        
            modify readme.txt
        
        commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
        Author: gink <wang_gk@foxmail.com>
        Date:   Thu Nov 23 16:55:51 2017 +0800
        
            add newfiles
        
        commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
        Author: gink <wang_gk@foxmail.com>
        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 <file>..." 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 <file>..." to update what will be committed)
          (use "git checkout -- <file>..." 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 <file>..." to update what will be committed)
        #   (use "git checkout -- <file>..." 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 二 —— 基本操作

        本文链接:https://www.haomeiwen.com/subject/bnqqbxtx.html