Git的介绍及基础命令
Git介绍
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,所以,工作的时候就不需要联网了,因为版本库都是在自己的电脑 上。现在每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
主要有如下特点:
- 版本控制
- 分布式
- 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端
git相比于svn功能更加的强大,命令也很多。本篇博客将详细介绍一些常用命令的使用操作。
Git和SVN的对比
1.git是分布式的,svn是集中式的。(最核心)
2.git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
3.git可离线完成大部分操作,svn则不能。
4.git有着更优雅的分支和合并实现。
5.git有着更强的撤销修改和修改历史版本的能力
6.git速度更快,效率更高。
基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。
Git几个概念
一. 工作目录
工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
二. 暂存区域
是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。
三. Git 仓库目录
是Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
Git工作流程
基本的 Git 工作流程如下:
在工作目录中修改文件 > 暂存文件,将文件的快照放入暂存区域 > 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。如果作了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
Git的安装
第一种安装方式:yum进行安装
[root@ken ~]# yum install git -y
第二种安装方式:编译安装
第一步:上传安装包并解压
[root@ken ~]# rz
[root@ken ~]# ls | grep git
git-v2.7.4.zip
[root@ken ~]# unzip git-v2.7.4.zip
第二步:安装依赖
[root@ken git-2.7.4]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y
第三步:进入解压下目录下并执行编译
[root@ken git-2.7.4]# make prefix=/usr/local/git all
[root@ken git-2.7.4]# make prefix=/usr/local/git install
第四步:导入二进制程序
[root@ken git-2.7.4]# rm -rf /usr/bin/git
[root@ken git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git
[root@ken git-2.7.4]# git --version
git version 2.7.4
git常用选项介绍
[root@ken html]# git
add Add file contents to the index
bisect Find by binary search the change that introduced a bug
branch List, create, or delete branches
checkout Checkout a branch or paths to the working tree
clone Clone a repository into a new directory
commit Record changes to the repository
diff Show changes between commits, commit and working tree, etc
fetch Download objects and refs from another repository
grep Print lines matching a pattern
init Create an empty Git repository or reinitialize an existing one
log Show commit logs
merge Join two or more development histories together
mv Move or rename a file, a directory, or a symlink
pull Fetch from and merge with another repository or a local branch
push Update remote refs along with associated objects
rebase Forward-port local commits to the updated upstream head
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the index
show Show various types of objects
status Show the working tree status
tag Create, list, delete or verify a tag object signed with GPG
演示1:简单基础演示
第一步:创建一个目录,并进入
[root@ken ~]# mkdir /kenken
[root@ken ~]# cd /kenken
第二步:初始化目录
[root@ken kenken]# git init
第三步:创建一个测试文件
[root@ken kenken]# echo "this is ken">>a.tt
第四步:提交
[root@ken kenken]# git add a.tt
[root@ken kenken]# git commit -m "v1"
第五步:查看
[root@ken kenken]# git log
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
第六步:往测试文件里面追加数据
[root@ken kenken]# echo "new data" >>a.tt
第七步:提交
[root@ken kenken]# git add a.tt
[root@ken kenken]# git commit -m "v2"
第八步:再次查看
[root@ken kenken]# git log
commit d1f52146b390c95c614e8ae7acc922da0f7e2d0d
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:34:11 2018 +0800
v2
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
第九步:恢复到第v1版本
[root@ken kenken]# git reset --hard HEAD~1
HEAD is now at 15370fe v1
[root@ken kenken]# git log
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
第十步:恢复到v2版本
[root@ken kenken]# git reflog #首先使用git reflog可以查看commit值
15370fe HEAD@{0}: reset: moving to HEAD~1
d1f5214 HEAD@{1}: commit: v2
15370fe HEAD@{2}: reset: moving to HEAD~1
22d39cb HEAD@{3}: commit: v2
15370fe HEAD@{4}: commit (initial): v1
[root@ken kenken]# git reset --hard d1f5214 #恢复的时候指定conmit值
HEAD is now at d1f5214 v2
[root@ken kenken]# git log #查看发现已经恢复到v2版本
commit d1f52146b390c95c614e8ae7acc922da0f7e2d0d
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:34:11 2018 +0800
v2
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
演示2:撤销工作区的内容
第一步:创建一个文件
[root@ken kenken]# echo "test1">>e.tt
[root@ken kenken]# echo "test2">>e.tt
第二步:把这个文件添加到缓存区
[root@ken kenken]# git add e.tt
第三步:在文件追加内容
在包含.git的目录中,只要当前目录下的文件有修改都会自动进入工作区(该文件必须被commit过,否则无法追踪)
所以下面当往文件e.tt中添加test3的时候。e.tt这个文件就进入到了工作区了
1.文件进入工作区:包含.git隐藏文件的目录中,文件修改就会自动进入
2.文件进入缓存区:git add .
3.文件进入仓库:git commit -m ‘v1’
[root@ken kenken]# echo "test3">>e.tt
第四步:查看工作区
[root@ken kenken]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: e.tt
#
# 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: e.tt
#
第五步:撤销工作区的内容
使用命令git checkout — filename即可进行回滚
[root@ken kenken]# git checkout -- e.tt #数据回滚
[root@ken kenken]# git status #查看状态
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: e.tt
#
[root@ken kenken]# cat e.tt #查看文件内容,发现test3内容已经没有了
test1
test2
演示3:撤销缓存区的内容
第一步:创建文件并进行提交
[root@ken kenken]# echo "1111">k.tt
[root@ken kenken]# git add k.tt
[root@ken kenken]# git commit -m "k.tt"
[root@ken kenken]# git log
commit c5f46907ce0dfd6722b091fa7a7053ff48507ace
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:42:30 2018 +0800
k.tt
第二步:修改文件并加入到缓存区中
第一步一定要提交,才能看到效果
[root@ken kenken]# echo "222">>k.tt
[root@ken kenken]# echo "333">>k.tt
[root@ken kenken]# git add k.tt
[root@ken kenken]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: k.tt
#
第三步:缓存区进行回退
[root@ken kenken]# git reset HEAD k.tt
Unstaged changes after reset:
M k.tt
第四步:缓存区进行回退
[root@ken kenken]# 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: k.tt
#
no changes added to commit (use "git add" and/or "git commit -a")
第五步:工作区进行回滚
其实现在就已经回到了演示2中了
回退完成之后可以发现之前写的222和333 已经没有了
[root@ken kenken]# git checkout -- k.tt
[root@ken kenken]# git status
# On branch master
nothing to commit, working directory clean
[root@ken kenken]# cat k.tt
1111
演示4:撤销仓库中的内容
第一步:查看历史版本
我们现在处于k.tt中,现在希望回到v3中
[root@ken kenken]# git log
commit c5f46907ce0dfd6722b091fa7a7053ff48507ace
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:42:30 2018 +0800
k.tt
commit ec9c03a48c816aa08fdd2216effdd2f124f1b4e3
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:40:07 2018 +0800
v4
commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:28:11 2018 +0800
v3
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
第二步:查看所需要回滚的版本的commit值
通过上面我们可以看到v3的commit值为1334466fd86ba0ba4ec95147809d71cb21345e95
第三步:执行回滚操作
commit值没有必要全部写出来,只要写一部分就可以了
[root@ken kenken]# git reset --hard 1334466f
第四步:查看版本状态
现在我们处于v3版本之中
[root@ken kenken]# git log
commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:28:11 2018 +0800
v3
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
第五步:回退到v4版本中
我们知道回退版本需要用到commit值
但是现在通过git log已经看不到v4的commit值了,现在怎么办呐?
可以通过git reflog查看所有的历史操作找到v4前面的值即可
[root@ken kenken]# git reflog
1334466 HEAD@{0}: reset: moving to 1334466f
c5f4690 HEAD@{1}: commit: k.tt
ec9c03a HEAD@{2}: commit: v4
1334466 HEAD@{3}: commit: v3
15370fe HEAD@{4}: reset: moving to HEAD~1
d1f5214 HEAD@{5}: reset: moving to d1f5214
15370fe HEAD@{6}: reset: moving to HEAD~1
d1f5214 HEAD@{7}: commit: v2
15370fe HEAD@{8}: reset: moving to HEAD~1
22d39cb HEAD@{9}: commit: v2
15370fe HEAD@{10}: commit (initial): v1
第六步:回滚到v4版本
[root@ken kenken]# git reset --hard ec9c03a
HEAD is now at ec9c03a v4
[root@ken kenken]# git log
commit ec9c03a48c816aa08fdd2216effdd2f124f1b4e3
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:40:07 2018 +0800
v4
commit 1334466fd86ba0ba4ec95147809d71cb21345e95
Author: ken <1614833@qq.com>
Date: Tue Nov 20 12:28:11 2018 +0800
v3
commit 15370fed2791ba4c978018f840caed22fd38221f
Author: ken <1614833@qq.com>
Date: Tue Nov 20 10:17:18 2018 +0800
v1
Git分支介绍
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
Git分支使用演示
准备:
第一步:准备git目录
[root@ken ~]# mkdir /test
[root@ken ~]# cd /test
第二步:初始化git目录
[root@ken test]# git init
第三步:查看git分支
发现显示为空
[root@ken test]# git branch
[root@ken test]#
第四步:创建文件并提交才能看到主分支
[root@ken test]# git branch
[root@ken test]# touch test
[root@ken test]# git add .
[root@ken test]# git branch
[root@ken test]# git commit -m “v1”
[master (root-commit) 18a1f53] v1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test
[root@ken test]# git branch
* master
第一步:查看分支
'*'表示当前所处的分支位置
[root@ken kenken]# git branch
* master
第二步:创建分支
[root@ken kenken]# git branch ken
[root@ken kenken]# git branch
ken
* master
第三步:切换分支
[root@ken kenken]# git checkout ken
Switched to branch 'ken'
[root@ken kenken]# git branch
* ken
master
第四步:在分支里面操作e.tt
[root@ken kenken]# ls
a.tt c.tt d.tt e.tt
[root@ken kenken]# echo "888888">>e.tt
[root@ken kenken]# cat e.tt
test1
test2
test3
test4
test5
888888
第五步:提交
git add .表示提交全部
[root@ken kenken]# git add .
[root@ken kenken]# git commit -m "test for branch"
[ken b621584] test for branch
1 file changed, 1 insertion(+)
第六步:切换回主分支并查看文件
现在查看e.tt并没有看到刚才子分支提交的内容
[root@ken kenken]# git checkout master
Switched to branch 'master'
[root@ken kenken]# git branch
ken
* master
[root@ken kenken]# cat e.tt
test1
test2
test3
test4
test5
第七步:合并子分支
合并之后发现现在主分支也可以看到刚才子分支添加的内容了
[root@ken kenken]# git merge ken
Updating ec9c03a..b621584
Fast-forward
e.tt | 1 +
1 file changed, 1 insertion(+)
[root@ken kenken]# cat e.tt
test1
test2
test3
test4
test5
888888