版本管理控制工具两大优点:
1.团队协作开发
2.版本管理
允许可以很容易对产品的版本进行任意回滚
常用版本管理工具
1.VSS-- Visual Source Safe
2.CVS--Concurrent Versions System
3.SVN --CollabNet Subversion
4.BitKeeper
5.GIT
git安装
Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行
版本库创建
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
步骤:
1.在一个自定义的磁盘下创建一个空目录
$ mkdir git_trainning
$ cd git_trainning
2.初始化git
$ git init
此时git仓库就建好了,此时的仓库是一个空的仓库。
当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
将文件添加到文本库
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外
而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的
步骤:
1.编写一个first_git_file.txt文件【一定要放到git_trainning目录下(子目录也行)】
$ vim first_git_file.txt #文本内容 first time using git, excited! 第一次用git哈哈
2.用命令git add 告诉git,把文件添加git暂存区
$ git add first_git_file.txt
执行上面的命令,没有任何提示,说明添加成功。
3.用命令git commit 告诉git,把文件从暂存区提交到仓库。
$ git commit -m "commit my first git file"
你在往git库里提交代码时,你需要告诉git你是谁,这样git就会纪录下来是谁改的代码,其实就是为了日后查询方便,你只需要提供一个名字和邮件地址就可以。
你可以通过git config --global --edit修改
-m
后面输入的是本次提交的说明,
为什么Git添加文件需要add
,commit
一共两步呢?
因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件。
如:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
代码回滚
1.代码修改并提交:
代码修改后执行代码:
$ git add . # . 代表把当前目录下所有改动的文件都提交到代码库
提交后我们可以查看仓库当前的状态:
$ git status
当记不清上次是怎么修改时,我们可以通过命令来查看:
$ git diff first_git_file.txt diff --git a/first_git_file.txt b/first_git_file.txt index 2d13c2c..248d853 100644 --- a/first_git_file.txt +++ b/first_git_file.txt @@ -1,3 +1,4 @@ -first time using git, excited! +First time using git, excited! update ... insert line here... 第一次用git哈哈 +insert line again haha...
输出中+号显示的就是修改或新增的内容,-号显示的就是去掉或被修改的内容
2.代码回滚
实际工作中,代码经过很多次修改后,版本控制系统有命令可以告诉我们历史记录。
在Git中,我们用git log
命令查看:
$ git log
$ git log --pretty=oneline
git log
命令显示从最近到最远的提交日志
回滚到指定的版本号:
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
从当前版本回退到之前的版本要使用到git reset 命令。
#返回到上一个版本
$ git reset --hard HEAD^
此时用git log再查看版本库的状态时最新的那个版本已经找不到了。
此时你还想找到最新的那个版本的话可以通过HEAD指向版本号来找回最新的版本。
#当命令行关闭找不到版本号时可通过此操作来找到
$ git reflog
工作区和暂存区
工作区里有一个隐藏目录 .git,这个不算工作区,而是Git的版本库。
版本库里有称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
撤销修改
分两种情况:
1.还在工作区的情况
删掉最后一行,手动把文件恢复到上一个版本的状态。
如果用git status
查看一下:
1 git status 2 3 On branch master 4 Changes not staged for commit: 5 (use "git add <file>..." to update what will be committed) 6 (use "git checkout -- <file>..." to discard changes in working directory) 7 8 modified: readme.md 9 10 no changes added to commit (use "git add" and/or "git commit -a")
git checkout -- file
可以丢弃工作区的修改。
2.还在暂存区的情况
git add
到暂存区。庆幸的是,在commit
之前,你发现了这个问题。用git status
查看一下,修改只是添加到了暂存区,还没有提交
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.md
用命令git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.md
Unstaged changes after reset:
M readme.md
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
再用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.md # no changes added to commit (use "git add" and/or "git commit -a")
丢弃工作区的修改
$ git checkout -- readme.md
命令git checkout -- readme.md
意思就是,把readme.md
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.md
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.md
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
删除操作
一般情况下,通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了:
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: test.txt no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,
一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
:
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test" [master 03df00a] remove test 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
GitHub(远程仓库)