首页 > 代码库 > Git 学习笔记<本地版本库的管理> (二)

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 diffdiff --git a/hello.txt b/hello.txtindex 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 statusOn branch masterChanges 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 f5842ba282aec415f1cebe5899ec413ce74fc681Author: 大大大大大沐魇 <imyijie@vip.qq.com>Date:   Wed Aug 6 11:11:47 2014 +0800    change my namecommit cf6f342e99cbe0650c6f6272583497a60326e47aAuthor: 大大大大大沐魇 <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" 就会从版本库中删除了。

Git 学习笔记<本地版本库的管理> (二)