首页 » GIT » 正文

git简介、安装及基本使用

简介:

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

版本控制系统:能自动记录每次文件的改动,还可以让其他人协作编辑,这样就不用自己管理一堆类似的文件了,不需要把文件传来传去。如果想查看某次改动,只需要在系统里看一眼(文件更新日志)就可以了。

与svn的区别

svn是集中式的版本控制系统,git是分布式的版本控制系统。
集中式版本系统:

版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。集中式版本控制系统最大的毛病就是必须联网才能工作(举个例子:如果svn的服务器没有开机,是看不到代码更新日志的),如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

分布式版本控制系统:

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

安装git

[root@localhost tools]# git
-bash: /usr/bin/git: 没有那个文件或目录
[root@localhost tools]# yum install git
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirror.bit.edu.cn
* extras: mirror.bit.edu.cn
* updates: mirror.bit.edu.cn
正在解决依赖关系
–> 正在检查事务
—> 软件包 git.x86_64.0.1.8.3.1-4.el7 将被 安装
–> 正在处理依赖关系 perl-Git = 1.8.3.1-4.el7,它被软件包 git-1.8.3.1-4.el7.x86_64 需要
–> 正在处理依赖关系 perl(Git),它被软件包 git-1.8.3.1-4.el7.x86_64 需要
–> 正在检查事务
—> 软件包 perl-Git.noarch.0.1.8.3.1-4.el7 将被 安装
–> 解决依赖关系完成

依赖关系解决

======================================================================================================================================================
Package 架构 版本 源 大小
======================================================================================================================================================
正在安装:
git x86_64 1.8.3.1-4.el7 base 4.3 M
为依赖而安装:
perl-Git noarch 1.8.3.1-4.el7 base 52 k

事务概要
======================================================================================================================================================
安装 1 软件包 (+1 依赖软件包)

总下载量:4.4 M
安装大小:22 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): perl-Git-1.8.3.1-4.el7.noarch.rpm | 52 kB 00:00:00
(2/2): git-1.8.3.1-4.el7.x86_64.rpm | 4.3 MB 00:00:02
——————————————————————————————————————————————————
总计 1.7 MB/s | 4.4 MB 00:00:02
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : git-1.8.3.1-4.el7.x86_64 1/2
正在安装 : perl-Git-1.8.3.1-4.el7.noarch 2/2
验证中 : perl-Git-1.8.3.1-4.el7.noarch 1/2
验证中 : git-1.8.3.1-4.el7.x86_64 2/2

已安装:
git.x86_64 0:1.8.3.1-4.el7

作为依赖被安装:
perl-Git.noarch 0:1.8.3.1-4.el7

完毕!
[root@localhost tools]# git
usage: git [–version] [–help] [-c name=value]
[–exec-path[=]] [–html-path] [–man-path] [–info-path]
[-p|–paginate|–no-pager] [–no-replace-objects] [–bare]
[–git-dir=] [–work-tree=] [–namespace=]
[]

最常用的 git 命令有:
add 添加文件内容至索引
bisect 通过二分查找定位引入 bug 的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的 Git 版本库或重新初始化一个已存在的版本库
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前HEAD到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个GPG签名的 tag 对象

命令 ‘git help -a’ 和 ‘git help -g’ 显示可用的子命令和一些指南。参见
‘git help <命令>’ 或 ‘git help <指南>’ 来查看给定的子命令帮助或指南

创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

#cd /home/
#mkdir mazhenguo
#cd mazhenguo
#pwd
 /home/mazhenguo
//如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
#git init
初始化空的 Git 版本库于 /home/mazhenguo/.git/
//瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了,如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。不过,不建议你使用自己正在开发的公司项目来学习Git,否则造成的一切后果概不负责。
#
ls -ah
.  ..  .git
# pwd
/home/mazhenguo

把文件添加到版本库

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

使用Windows的童鞋要特别注意:

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:

set-utf8-notepad++

#cd /home/mazhenguo
#vim cs.txt
zheshiyigeceshiwenjian
:wq
#git add cs.txt //用命令git add告诉Git,把文件添加到仓库,执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
#
git commit -m “增加一个cs.txt文件” //用命令git commit告诉Git,把文件提交到仓库
[master(根提交) dbd389b] 增加一个cs.txt文件
Committer: root <root@localhost.localdomain>
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:
git config –global user.name “Your Name”
git config –global user.email you@example.com
设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
git commit –amend –reset-author
1 file changed, 1 insertion(+)
create mode 100644 cs.txt

 

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$git add file1.txt
$git add file2.txt file3.txt
$git commit -m "add 3 files."

 

小结:
现在总结一下今天学的两点内容:
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
第一步:使用命令git add <file>,注意,可反复多次使用,添加多个文件;
第二步:使用命令git commit,完成。

修改文件

#cd /home/mazhenguo
#vim cs.txt
nihao
zheshiyigeceshiwenjian
:wq
#
git status //时刻掌握仓库当前的状态
位于分支 master
尚未暂存以备提交的变更:
(使用 “git add <file>…” 更新要提交的内容)
(使用 “git checkout — <file>…” 丢弃工作区的改动)
修改:      cs.txt
修改尚未加入提交(使用 “git add” 和/或 “git commit -a”)
#git diff  //查看difference

diff –git a/cs.txt b/cs.txt
index eddbc23..45fb615 100644
— a/cs.txt
+++ b/cs.txt
@@ -1 +1,2 @@
+nihao
zheshiyigeceshiwenjian
#
git add cs.txt
#git status
  #位于分支 master
  # 要提交的变更:
  #   (使用 “git reset HEAD <file>…” 撤出暂存区)
  #
  # 修改:      cs.txt
  #
#
git commit -m “add nihao”
[master 76d5f00] add nihao
Committer: root <root@localhost.localdomain>
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:
git config –global user.name “Your Name”
git config –global user.email you@example.com
设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
git commit –amend –reset-author
1 file changed, 1 insertion(+)

#git status
   # 位于分支 master
无文件要提交,干净的工作区

小结:
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

版本回退

#git log

commit 76d5f006c4410ac617fe16ba63d517267361961b

Author: root <root@localhost.localdomain>
Date:   Wed Jul 8 14:29:37 2015 +0800
add nihao

commit dbd389ba7cee3c61cda3c6ede86d9d60d89b0f64
Author: root <root@localhost.localdomain>
Date:   Wed Jul 8 12:33:35 2015 +0800
增加一个cs.txt文件

git log命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是add nihao,最早的一次是增加一个cs.txt文件。 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数: 

#git log –pretty=oneline
76d5f006c4410ac617fe16ba63d517267361961b add nihao
dbd389ba7cee3c61cda3c6ede86d9d60d89b0f64 增加一个cs.txt文件

需要友情提示的是,你看到的一大串类似76d5f...1961b的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

git-log-timeline

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“增加一个cs.txt文件”的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交76d5f...1961b(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
现在,我们要把当前版本“nihao”回退到上一个版本“增加一个cs.txt文件”,就可以使用git reset命令:

#cd /home/mazhenguo
#git reset --hard HEAD^

HEAD 现在位于 76d5f00 add 增加一个cs.txt文件
#
cat cs.txt
zheshiyigeceshiwenjian

果然。

如果版本纪录过多的话,还可以继续回退到上一个版本,不过且慢,然我们用git log再看看现在版本库的状态:

#git log
commit dbd389ba7cee3c61cda3c6ede86d9d60d89b0f64

Author: root <root@localhost.localdomain>

Date:   Wed Jul 8 12:33:35 2015 +0800

    增加一个cs.txt文件

最新的那个版本已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,怎么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add nihao的commit id是76d5f006c44...,于是就可以指定回到未来的某个版本:

#git reset –hard 76d5f006c44  //版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

HEAD 现在位于 76d5f00 add nihao
#
cat cs.txt
nihao
zheshiyigeceshiwenjian
果然,我的最新版本的文件又回来啦。。。。

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到add nihao版本时,再想恢复到”增加一个cs.txt文件”,就必须找到”增加一个cs.txt文件”的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
#git reflog
76d5f00 HEAD@{0}: reset: moving to HEAD^
56bd772 HEAD@{1}: commit: add hello
76d5f00 HEAD@{2}: commit: add nihao
dbd389b HEAD@{3}: commit (initial): 增加一个cs.txt文件

第三行显示的 76d5f00就是我们需要的commit id。

小结

现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

 

 

 

 

 

 

 

发表评论