Git是现在应用非常广泛的一个版本控制工具,具体介绍可查看wiki。
Git和Subversion有本质上的区别,SVN属于以主服务器为核心的架构体系,当主服务器不可用时,SVN的功能也同样不可用。而Git属于分布式架构体系,并没有主服务器这一说,每个Branch都可以单独工作。
本文介绍Git的使用,测试环境为CentOS 7.0。
1.安装
在系统中直接执行“git”指令,如果已安装会有相关帮助信息显示,未安装则自行安装。通常git是默认安装的。
在使用之前,需要先设置两个参数user.name和user.email。
#git config --global user.name "yourname"
#git config --global user.email "email@example.com"
当然,如果在安装完成后不设置这两个参数的话,在后面的使用中也必须得设置,因为这两个参数不设置就无法commit。
global参数指定了这个配置应用于这个系统中的所有Git Repository,当然不同的Repository也可以用不同的名称和邮箱。
2.建立Repository
使用Git建立Repository是简单且快捷的,如下所示就建立了一个空的Git Repository。
[root@localhost ~]# mkdir gittest
[root@localhost ~]# cd gittest/
[root@localhost gittest]# git init
初始化空的 Git 版本库于 /root/gittest/.git/
[root@localhost gittest]# ls -a
. .. .git
[root@localhost gittest]#
新建的Repository中只有一个隐藏的“.git”目录,这个目录中存放了关于版本控制的各种信息,简单说就是“不要动它!”,否则Repository可能发生错误。
3.Repository操作–添加文件
Git的操作有许多种,先从最基本的***添加文件***开始。
[root@localhost gittest]# echo "git is free software" > test1
[root@localhost gittest]# echo "github is free" > test2
[root@localhost gittest]# ls
test1 test2
[root@localhost gittest]# git add test1
[root@localhost gittest]# git add test2
[root@localhost gittest]# git commit -m "add file test1 and test2"
[master(根提交) 7eefb00] add file test1 and test2
2 files changed, 2 insertions(+)
create mode 100644 test1
create mode 100644 test2
[root@localhost gittest]#
如上所示,先创建了2个文件test1和test2,当然是在刚刚创建的Git Repository目录gittest下创建的,然后使用“git add filename”将文件添加到暂存区,然后使用“git commit”来进行提交。
“git add”添加的文件并不是将文件进行提交,而是将文件先存入了暂存区中,它可以分多次将多个不同的文件添加到暂存区中。而“git commit”则是将之前所有的“git add”操作添加到暂存区中的文件进行提交,“-m”参数设置提交时的说明信息。
当一个文件没有通过“git add”添加到暂存区中时,执行“git commit”不会将它提交。
**在这里说一下暂存区的概念:**在Git中使用“git add”对修改内容进行操作的时候,其实是更新了一个改动的索引,这个索引通常就存放于Repository目录下的“.git”中,这里面保存了每次使用“git add”添加进来的内容修改,在执行“git commit”时一次性的将暂存区中的修改信息进行提交,同时清空暂存区。
4.推送本地分支到远程
git push origin feature_branch:feature_branch
feature_branch:feature_branch
前面的是“本地准备推送到远端的分支名称”, 冒号后面的是“推送到远端之后的分支名称,如果在远端不存在,则会创建”。
5.Repository操作–查看状态
使用git status可以查看Repository当前的状态,下面分别展示Repository中无修改时与有修改时执行git status的结果。
[root@localhost gittest]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost gittest]# echo "hello,world" >> test1
[root@localhost gittest]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: test1
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@localhost gittest]#
在commit之前可以使用git diff来查看修改的内容,与Linux系统当中的diff指令类似:
[root@localhost gittest]# git diff test1
diff --git a/test1 b/test1
index bc77194..89ea52c 100644
--- a/test1
+++ b/test1
@@ -1 +1,2 @@
git is free software
+hello,world
[root@localhost gittest]#
使用"git add"和"git commit”对刚刚的修改进行提交。
6.Repository操作–版本回退
使用git log可以查看到Repository每次的提交信息:
[root@localhost gittest]# git log
commit 267deb42916099aff3d389eba66af074d360916e
Author: LiangJL <yca20150002@163.com>
Date: Mon Mar 14 22:14:52 2016 +0800
add 'hello,world'
commit 7eefb000ff4b6fca94773b353c52f4ad2ac3c719
Author: LiangJL <yca20150002@163.com>
Date: Mon Mar 14 21:38:16 2016 +0800
add file test1 and test2
[root@localhost gittest]#
可以看到当前的Repository中共做了2次提交,提交时的注释信息分别是“add file test1 and test2"和“add ‘hello,world’”。
Author中的信息是首节中设置的user.name和user.email信息。
commit+一串字串是更新的版本ID,在SVN中称之为版本号的东西就是它,当然,在使用的时候并不需要全都输入进去,通常只需要输入前几位(一般是前7位)就可以操作了。
在Git中表示当前版本使用的是HEAD,表示上一个版本则用HEAD,表示上上个版本则用HEAD^,表示第N个则可以用HEAD~N。
当然也可以用commit ID来进行操作,这样操作时更加准确。
将gittest回退到上一个版本(即第一个版本):
[root@localhost gittest]# cat test1
git is free software
hello,world
[root@localhost gittest]# git reset --hard HEAD^
HEAD 现在位于 7eefb00 add file test1 and test2
[root@localhost gittest]# cat test1
git is free software
[root@localhost gittest]#
可以看到回退后,在第2个版本中向test1文件添加的“hello,world”信息已经消失了。
当然推荐是使用版本号来操作:
[root@localhost gittest]# git reflog
7eefb00 HEAD@{0}: reset: moving to HEAD^
267deb4 HEAD@{1}: commit: add 'hello,world'
7eefb00 HEAD@{2}: commit (initial): add file test1 and test2
[root@localhost gittest]# git reset --hard 267deb4
HEAD 现在位于 267deb4 add 'hello,world'
[root@localhost gittest]# cat test1
git is free software
hello,world
[root@localhost gittest]#
git reflog的作用是显示出每次提交的修改信息,同样显示的还有commit ID,然后使用指定的commit ID来进行操作回退,可以看到test1文件在版本2中添加的“hello,world”信息又出现了,版本已经恢复到版本2的状态。
7.Repository操作–撤销修改
如果对修改不满意,可以使用git checkout指令来进行撤销:
[root@localhost gittest]# echo "this a new line" >> test2
[root@localhost gittest]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: test2
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@localhost gittest]# git checkout -- test2
[root@localhost gittest]#
[root@localhost gittest]# cat test2
github is free
[root@localhost gittest]#
从上可以看出对test2进行了操作,然后使用git checkout进行了撤销操作,test2的内容还是原版本库的内容。
这里有两点需要注意的地方:
1、对没有进行git add操作的修改进行撤销操作,会恢复到原本版本库时的状态;
2、对进行了git add操作之后,又做了修改的操作进行撤销,会恢复到git add后的状态,即添加到存储区之后的状态。
当有的修改已经添加到了暂存区,但此时又想进行撤销,则通过如下操作进行:
1、git reset HEAD filename
2、git checkout – filename
8.Repository操作–删除文件
在Repository中可以删除不需要的文件,删除也分不同的情况:
1、误删除了某个文件,此时可以用git checkout – filename将误删的文件更新回来;
2、确实想删除Repository中的某个文件,分两步进行,第一步执行“git rm filename”,第二步执行“git commit”进行提交。
**注意:**即使用第2种方法删除了Repository中的某个文件,这个文件仍然是可以恢复的,使用前面讲到的“版本回退”操作。