zoukankan      html  css  js  c++  java
  • Git 学习笔记<本地版本库的管理> (二)

    今天来记录一下关于版本库的创建与管理的笔记。

    版本库是什么?

    版本库可以理解为一个仓库(一个可以被git管理的目录),里面文件的修改删除都可以被追踪,并且每个版本都会保存以便还原(仅仅保存修改或删除的文件),于是可以认为保存了各种不同的版本,所以叫版本库。

    如何管理?

    Git给你提供各种不同的指令来管理版本库。

    1.创建:

    选择一个地方创建一个新文件夹,然后进入这个文件夹(windows中不要出现中文路径)

    $mkdir LEARNER   //当前目录下新建文件夹

    $cd LEARNER //进入此文件夹

    如果你不知道当前目录在哪 可以输入 $pwd 便会显示完整路径

    接下来 $git init 这时这个文件夹就可以被git管理了,当然设置一个已有文件的目录也是可以的.

    2.添加文件到版本库:

    如第一章所说,本地端存在工作区,版本库.

    你手动在文件夹创建的所有文件其实是存在于工作区,你还必须上传到版本库的暂存区,然后在提交给正式的版本库.暂存区的存在便于你一次提交多个文件,这样版本库的代码保持完整性随时可以运行.

    还有一个问题就是, git只能追踪诸如TXT文件、网页、代码的变动(包括第几行的变化),图片、视频等虽然可以管理但不知道哪里变化。而且,word文档也是无法追踪变化的

    建议使用UTF-8编码来保存文件。此时不要用windows的记事本来编辑文本,因为记事本保存UTF-8时会在开头加一个 0xefbbbf(十六进制)的字符。可能会有一些意想不到的错误。应该下载别的文本编辑器,比如 PSPad

    接下来来添加文件。

    创建一个hello.txt文件

    /*Hello, I'm Hanson Green.*/
    /*Wish You Can Learn Something From Here.*/

    保存于git管理的目录下(子目录也可以)。

    ① 在Git Bash 中输入$git add hello.txt (没有显示即成功),此时文件存于暂存区。

    ② 继续输入$git commit -m "add hello.txt"  这时文件便提交给仓库。 后面的 -m "content" 是用来保存本次提交有关备注的。一定要填,这对工作是必要的。 

    1 file changed, 2 insertions(+) 告诉你 改变了一个文件,增加了两行。

    这样便提交了文件。你可以一次add多个文件一次性提交。

    3.查看工作区的状态

    接下来对hello.txt进行更改

    /*Hello, I'm Hanson Chan.*/
    /*Wish You Can Learn Something From Here.*/

    然后再输入  $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:   hello.txt
      
    no changes added to commit (use "git add" and/or "git commit -a")

    它告诉你 有改变没有被提交。有提示两种解决办法:使用 git add <file> 来添加将被提交的文件;使用 git checkout --<file> 来丢弃改变(此方法下面提到)。

    然后提示被修改的文件是 hello.txt。 是不是很人性化?那接下来想查看修改的地方怎么办呢。

    输入 $git diff

    复制代码
    $ git diff
    diff --git a/hello.txt b/hello.txt
    index faa367f..761d254 100644
    --- a/hello.txt
    +++ b/hello.txt
    @@ -1,2 +1,2 @@
    -/*Hello, I'm Hanson Green.*/
    +/*Hello, I'm Hanson Chan.*/
     /*Wish You Can Learn Something From Here.*/
     No newline at end of file
    复制代码

    便可以查看到更改的地方。

    输入 $git add hello.txt

    然后再查看状态 $git status

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   hello.txt

    On branch master 是在分支master,之后会说到。

    然后 $git commit -m "change my name"   成功提交

    之后输入$git status 就会提示工作区是干净的 没有需要提交的东西。

    4.版本回退与管理

    首先我们再在文件中添加一行 

    /*I Want To Change This File*/ 

    然后进行add 和 commit -m "some change" (一定要输入备注)

    我们如何知道前几次提交的记录呢?当然是有办法的。

    输入 $git log   (Git log后面可以加-3 , -3的意思是只显示两个commit,如果想显示5个,就-5。不指定的话,git log会从该commit一直往后显示。)

    复制代码
    
    

      $ git log


      commit b160e923d62a6568233d4278551893bd00c3e1c0
      Author: 大大大大大沐魇 <imyijie@vip.qq.com>
      Date: Wed Aug 6 11:37:08 2014 +0800

    
    

          some change

    
    commit f5842ba282aec415f1cebe5899ec413ce74fc681
    Author: 大大大大大沐魇 <imyijie@vip.qq.com>
    Date:   Wed Aug 6 11:11:47 2014 +0800
    
        change my name
    
    commit cf6f342e99cbe0650c6f6272583497a60326e47a
    Author: 大大大大大沐魇 <imyijie@vip.qq.com>
    Date:   Wed Aug 6 10:53:18 2014 +0800
    
        add hello.txt
    复制代码

    所有信息都记录在案。commit就是对应的版本号了。如果觉得太多,输入 $ git log --pretty=oneline 就只会显示commit 和 备注了。

    然后你发现这次更改有错误但已经提交到本地库了,想回退到上一个版本怎么办?

    方法①:

    输入 $git reset --hard HEAD^ 

    HEAD即为当前分支(也可以直接写分支名称,比如现在的master。这个概念以后讲。)

    后面的 ^ 表示上一个版本 。^^表示上两个,等同于 ~2  即  $git reset --hard HEAD~2


    那--hard 参数又是什么意思呢? 其实还有 --soft 和 --mixed 选项

           --mixed 这个是默认的选项。如git reset [--mixed] master^。它的作用仅是重置分支状态到master^, 但是却不改变任何工作文件的内容。即,从master^到master的所有文件变化都保留了,但是master^到master之间的所有commit日志都被清除了, 而且,发生变化的文件内容也没有通过git add标识,如果您要重新commit,还需要对变化的文件做一次git add。 这样,commit后,就得到了一份非常干净的提交记录。 (回退了暂存区和仓库中的内容) 
           --soft相当于做了git reset –mixed,后,又对变化的文件做了git add。如果用了该选项, 就可以直接commit了。(回退了仓库中的内容) 
           --hard这个命令就会导致所有信息的回退, 包括文件内容。 一般只有在重置废弃代码时,才用它。 执行后,文件内容也无法恢复回来了。(回退了工作目录、暂存区和仓库中的内容) 

     或者 知道了版本号的话 比如 change my name 那个commit_id 是 f5842ba282aec415f1cebe5899ec413ce74fc681

     执行 $git reset f5842ba2  可以直接回退到这个版本 , 不必输入完全 可以通过前几个字母找到这个commit即可。

    另外 上述引用中说--hard 无法恢复回来也是有个例外的。也就是当你还没有关闭命令行时,可以向上翻到那个版本号 执行 $git reset commit_id(你找到的版本号) 即可。

    而且...使用$git reflog 可以查到你所有的操作记录,也可以查到原来的commit _id

    方法②:

    输入 $ git revert commit_id


    这个也是可以回到原来的版本,但是这时候是形成一个新的记录,而不是往回退。

    -------------------------------

    这两个方法的区别就是:reset 是往回退,那个版本之后的记录会从仓库中消失(根据你选择的模式是否存在于工作区或者暂存区)。而 revert 相当于是一个新版本,不过与你指定的版本号的文件一样。

     ------------------------------

    5.撤销你在工作区或者暂存区的修改

    还记得3中的工作区里修改后查看状态吗?

    没错,就是使用 $git checkout -- file 即可 撤销工作区的修改到最后一次 git add 或者commit的时候。(file是文件名)

    还记得add修改文件之后查看状态吗?

    就是使用 $git reset HEAD file    然后暂存区的文件就会回退到工作区。再执行丢弃工作区修改的代码即可(就在上面两行)。

    6.删除文件

    使用$rm file  可以删除工作区的文件(如果你删错了可以用$git checkout -- file ),然后再输入 $git rm file 和$git commit -m "remove file" 就会从版本库中删除了。

  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/ainubis/p/3990285.html
Copyright © 2011-2022 走看看