今天来记录一下关于版本库的创建与管理的笔记。
版本库是什么?
版本库可以理解为一个仓库(一个可以被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" 就会从版本库中删除了。