初识Git
目前市面上流行的版本控制系统有最初的CVS,到后来广为人知的SVN,再到现在逐渐流行起来的Git。笔者不才,对第一种根本没用过,对SVN也只是到了会用的程度,但对Git确实充满了好感,理由无他,就是简单。
从2005年Linus(Linux之父)迫于种种压力开始开发并用不到3个月的时间开发出Git并被使用至今,作为一个版本控制系统而言,Git确实已经渐渐被人们所接受了,最好的例子就是Github了吧- -。
Git和SVN一样有一个远程仓库,这个很好理解,就是内网或者外网有个Git服务器作为代码托管的机器,另外他还有个本地仓库,这个很关键,我们修改的代码都是先提交到本地仓库,然后才会推送给远程仓库,请先理解这一点,这个和SVN有些许的不同(笔者是这么认为的)。
Git安装
Ubuntu系统请运行如下命令进行安装
直接运行$ sudo apt-get install git
中文支持
天朝用户比较关心的问题有:是否可以再提交说明中使用中文?是否可以使用中文文件或目录名称?是否可以使用中文……?简单滴说,可以再提交说明中使用中文,至于用中文来命名文件、目录和引用,只有在使用utf-8字符集的环境下才可以,Git在utf-8字符集下表现良好,如下设置:$ git config --global core.quotepath false
Git使用
Git配置
$ git --version
检查Git版本,请确认版本是1.5.6+,并及时升级
Git的配置变量是一次性操作,配置会在全局文件(用户主目录下的.gitconfig)或系统文件(/etc/gitconfig)中做永久记录。
告诉Git当前用户的姓名和邮箱地址,配置的用户名和邮箱地址将在版本库提交时用到(请不要照抄下面的代码,你的领导可不认识笔者是哪位)
$ git config --global user.name "Wolfy"
$ git config --global user.email java_wolfy@163.com
设置一些Git常用命令的别名,例如输入
git ci
相当于git commit
命令那么简单
$ git config --system alias.st status
$ git config --system.alias.ci commit
$ git config --system.alias.co checkout
$ git config --system.alias.br branch
在Git中开启颜色显示
$ git config --global color.ui true
Git应用
创建一个新的版本库名为“DEMO版本库”,这个版本库将贯穿全文,我们的版本库目录为/home/myworkspace
$ cd /home/myworkspace
$ mkdir demo
$ cd demo
$ git init
这样一个空的“DEMO版本库”就创建完了,如果Git版本是1.6.5+,可以输入目录名称完成创建
$ cd /home/mywordspace
$ git init demo
$ cd demo
git commit
提交版本库
在demo文件夹中能看到Git已经创建了隐藏目录.git
,这个目录就是Git版本库(就是之前提到的本地仓库,repository),而/home/myworkspace
则被称为工作区,下面我们为工作区加点料
$ echo "Hello world." > welcome.txt
将新文件添加到暂存区(stage或者index)中
$ git add welcome.txt
这里开始要注意了,Git和大部分其他版本控制系统一样,都需要进行一次提交操作,对于Git来说就是执行git commit
命令。在提交过程中需要输入提交说明,这个要求对于Git来说是强制性的,不像其他很多版本控制系统(比如SVN)那样接受空白的提交说明。当Git提交时,如果不在命令行提供提交说明(使用-m
参数),Git会自动打开一个编辑器,要求在其中输入提交说明,输入完毕后保存退出。下面进行提交版本库,使用了-m
参数进行提交说明
$ git commit -m "init"
笔者的话:以上命令都可以在不联网状态下进行,千万记住要妥善安全有意的保管好你的.git
文件夹,否则你的版本就out of control了。
⚠️注意:切忌使用git commit -a
,git commit -a
代表直接将工作区的所有改动提交到版本库,从而跳过了git add
的步骤,确实这十分的“便捷”,但相对的没有利用到暂存区的用途:对提交内容进行控制的能力。
git status
查看状态
继续修改welcome.txt中的内容:
echo "Nice to meet you!" >> welcome.txt
查看差异:
$ git diff
diff --git a/welcome.txt b/welcome.txt
index 18249f3..c9df2f7 100644
--- a/welcome.txt
+++ b/welcome.txt
@@ -1 +1,2 @@
Hello world.
+Nice to meet you!`
查看本地文件状态:
$ git status -s
M welcome.txt
其中红色“M”意为Modified表示文件已被更改。接下来将已经修改的文件添加到暂存区中:
$ git add welcome.txt
再次查看本地文件状态:
$ git status -s
M welcome.txt
发现“M”的位置靠前了并且变成了绿色,这代表被更改的本地文件已经被添加到暂存区中,我们继续更改welcome.txt文件:
echo "Bye-bye." >> welcome.txt
再次查看本地文件状态:
$ git status -s
MM welcome.txt
不难发现出现了两个M,而这两个M的颜色为前绿后红,这代表本地文件和暂存区中的文件相比又是被更改过的,我们再次将本地改动添加到暂存区中:
$ git add welcome.txt
再来查看下状态:
$ git status -s
M welcome.txt
我们看到状态又变为了之前绿色M的那种状态,最后我们将所有改动提交到本地版本库:
$ git commit -m "Modified file twice"
[master 10b347d] Modified file twice
1 file changed, 2 insertions(+)
回头再来看看状态:
$ git status -s
已经不会有任何内容显示了,因为你的本地文件已经和本地版本库之间没有任何差异了。
git diff
差异魔法
为了体现差异,执行以下命令:
$ mkdir -p a/b/c
$ echo "Hello." > a/b/c/hello.txt
$ git add .
$ echo "Bye-bye." >> a/b/c/hello.txt
查看状态:
$ git status -s
AM a/b/c/hello.txt
工作区和暂存区比较
$ git diff
diff --git a/a/b/c/hello.txt b/a/b/c/hello.txt
index 18832d3..01063dc 100644
--- a/a/b/c/hello.txt
+++ b/a/b/c/hello.txt
@@ -1 +1,2 @@
Hello.
+Bye-bye.
暂存区和HEAD比较
$ git diff --cached
diff --git a/a/b/c/hello.txt b/a/b/c/hello.txt
new file mode 100644
index 0000000..18832d3
--- /dev/null
+++ b/a/b/c/hello.txt
@@ -0,0 +1 @@
+Hello.
工作区和HEAD比较
$ git diff HEAD
diff --git a/a/b/c/hello.txt b/a/b/c/hello.txt
new file mode 100644
index 0000000..01063dc
--- /dev/null
+++ b/a/b/c/hello.txt
@@ -0,0 +1,2 @@
+Hello.
+Bye-bye.
git reset
重置命令
git reset
作用是将版本库HEAD指向的目录树重置暂存区,保持版本库和暂存区一致,工作区不受影响。git reset
不加任何命令等同于git reset HEAD
命令。如果想让HEAD指向的目录是也一并重置工作区,请使用git reset --hard
命令。
⚠️注意:git reset --hard
命令使用之后工作区做的所有修改都会消失!。
git checkout
检出命令
git checkout
命令是将暂存区中的文件覆盖工作区中的文件,使用$ git checkout -- filename
命令直接覆盖工作区的filename对应文件,工作区中对filename的所有修改将“付之一炬”。
git rm
删除命令
想撤销已经添加到暂存区的文件不想让它提交到版本库中怎么办?git rm --cached <path>
拯救你!
git pull
和git push
远程仓库操作
我们已经有了本地仓库,那我们应该也有个远程仓库来托管我们的代码,以免自己机器崩溃(笔者喜欢乱倒腾,机器经常崩溃)或者出于一些原因导致代码丢失(熊孩子给你捣乱),
将本地仓库与远程仓库进行绑定,并将版本库中的代码推送:
$ git remote add origin <url>
$ git push -u origin master
至此,我们的本地仓库已经和远程仓库关联并进行了同步。
如果小组中有其他成员对这个项目也进行了提交到远程仓库的操作修改了代码,我们需要对本地代码进行同步该怎么办?
$ git pull
就是这么简单,此时你的工作区和版本库中的代码已经和远程仓库中的代码进行了同步。
笔者的话:一般我们的开发过程中,会先进行远程代码的同步,将本地代码更新到最新版本之后进行后续开发,版本库的提交,推送到远程仓库中。
git clone
克隆命令
本篇最后介绍克隆命令,顾名思义就是对代码进行克隆了。远程仓库中已经有了项目,而你本地并没有该项目的任何代码,于是你只需要执行git clone <url>
,这样项目就会出现在你本地目录中,进入该项目你会发现已经有了版本库,而不需要你再另外去初始化了。
至此基础篇已经完结,主要交代一些Git日常比较常用的命令和一些简单的使用Git进行代码托管的流程。相信只需要上面这些命令,日常的代码开发托管已经不成问题了,接下来的进阶篇会针对Git中的某些命令进行剖析,深入了解它的工作原理有助于读者更加清晰了解Git的使用。