Git介绍
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
主要有如下特点:
1. 版本控制
2. 分布式
3. 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端
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基础命令
git常用操作
git add 添加文件至缓存区域
git branch 查看分支和创建分支 git branch 分支名(创建分支)
git checkout 进行撤销也可以进行分支切换 git checkout 分支名(切换分支)
git clone 克隆远程主机仓库
git commit 把暂存区的文件提交到仓库中
git init 初始化目录(工作目录),初始化后就含有.git文件
git merge 合并分支
git pull 拉取远程主机的仓库
git push 把本地仓库推送到远程主机
git reset --hard (commit后面的码) 切换版本仓库
git reset HEAD 文件名 撤销缓存区添加的内容
git log 查看所有仓库
git status 查看git目录中文件的状态
yum或者编译安装,这里采用yum安装。
1)yum -y install git
2)创建目录并查看
root@localhost ~]# mkdir ken [root@localhost ~]# cd ken [root@localhost ken]# ls -a . .. #查看隐藏文件发现没有.git
3)初始化目录
[root@localhost ken]# git init 初始化空的 Git 版本库于 /root/ken/.git/ [root@localhost ken]# ls -a . .. .git #初始化之后.git的隐藏文件出现
4)创建文件测试
[root@localhost ken]# touch test [root@localhost ken]# echo '11111'> test [root@localhost ken]# echo '2222'> test [root@localhost ken]# git add . #将目录下文件都储存到暂存区域 [root@localhost ken]# git commit -m v1 #将暂存区域的文件都提交到版本库v1 [master(根提交) 28a5de2] v1 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 test
[root@localhost ken]# git log #查看所处版本库
commit 28a5de29dcb41e987babfc0dadecfbffd9e48af1
Author: root <root@localhost.localdomain>
Date: Thu May 23 19:21:06 2019 +0800
v1
5)测试文件里追加数据
[root@localhost ken]# echo '3333' >> test [root@localhost ken]# cat test 2222 11111 3333 [root@localhost ken]# git add . [root@localhost ken]# git commit -m 'v2' #将重新添加的数据提交,版本库为v2
[root@localhost ken]# git log #再次查看版本
commit af6b8cf6a5d52da8ef98808ebaed5c3474639ae1
Author: root <root@localhost.localdomain>
Date: Thu May 23 19:28:42 2019 +0800
v2
commit 28a5de29dcb41e987babfc0dadecfbffd9e48af1
Author: root <root@localhost.localdomain>
Date: Thu May 23 19:21:06 2019 +0800
v1
6)恢复到v2版本库查看test文件:
git reset --hard af6b8cf6a5d52da8 #根据上面查看的commit内容恢复 HEAD 现在位于 af6b8cf v2 [root@localhost ken]# cat test 2222 11111 3333
7)恢复到v1版本库查看test文件:
[root@localhost ken]# git reset --hard 28a5de29dc HEAD 现在位于 28a5de2 v1 [root@localhost ken]# cat test #可以看到不同版本库的文件内容不同
1111 2222
撤销工作区的内容
1)重新创建一个文件,写入测试内容
touch txt
echo 'aaaa' >> txt
echo 'bbbb' >>txt
2)将txt添加到缓存区
git add txt
3)在文件追加内容
在包含.git的目录中,只要当前目录下的文件有修改都会自动进入工作区(该文件必须被commit过,否则无法追踪)
所以下面当往文件e.tt中添加test3的时候。e.tt这个文件就进入到了工作区了
***
1.文件进入工作区:包含.git隐藏文件的目录中,文件修改就会自动进入
2.文件进入缓存区:git add .
3.文件进入仓库:git commit -m ‘v1’
4)重新追加内容,但不添加到缓存区,然后撤销缓存区内容,查看是否撤销成功
[root@localhost ken]# echo 'cccc' >> txt [root@localhost ken]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 新文件: txt # # 尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 修改: txt # [root@localhost ken]# git checkout -- txt #撤销txt追加内容 [root@localhost ken]# cat txt #重新查看发现追加的cccc已经被撤销 aaaa bbbb
撤销缓存区的内容
1)创建文件并写入测试文件,然后添加到缓存区,并提交
[root@localhost ken]# echo 'hhhh' >> t [root@localhost ken]# echo 'mmmm' >> t
[root@localhost ken]# git add t #添加到缓存区
[root@localhost ken]# git commit -m 't' #提交到版本库中
[root@localhost ken]# git log #查看
[root@localhost ken]# git log
commit a797245bc8ef03db21dd8313e82629666735436a
Author: root <root@localhost.localdomain>
2)缓存区操作撤回
[root@localhost ken]# echo '1111' >>t #追加内容 [root@localhost ken]# cat t hhhhh mmmm 1111 [root@localhost ken]# git status #查看状态 # 位于分支 master # 尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 修改: t 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") [root@localhost ken]# git add t #添加到缓存区 [root@localhost ken]# git reset HEAD T #撤回缓存区添加的内容,注意撤销的步骤,先撤回缓存区然后撤销工作区 重置后撤出暂存区的变更: M text [root@localhost ken]# cat t hhhhh mmmm 1111 [root@localhost ken]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 修改: t # # 尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 修改: text # [root@localhost ken]# git checkout -- t #在撤销工作区的记录 [root@localhost ken]# cat t #查看发现‘11111’ 并没有添加成功 hhhhh mmmm
撤销仓库中的内容
1)查看版本状态
[root@localhost ken]# git log commit 3afafaa4864573747fceda930b34464ac4c5a6c5 Author: root <root@localhost.localdomain> Date: Thu May 23 20:23:49 2019 +0800 t commit a797245bc8ef03db21dd8313e82629666735436a Author: root <root@localhost.localdomain> Date: Thu May 23 20:17:52 2019 +0800 text commit 1bf4b52acd99a5453e65928bd6ded86b4d6ffaf8 Author: root <root@localhost.localdomain> Date: Thu May 23 20:15:48 2019 +0800 v1 commit 28a5de29dcb41e987babfc0dadecfbffd9e48af1 Author: root <root@localhost.localdomain> Date: Thu May 23 19:21:06 2019 +0800 v2
2)回滚到v1版本
[root@localhost ken]# git reset --hard 1bf4b52ac HEAD 现在位于 1bf4b52 v1 [root@localhost ken]# git log commit 1bf4b52acd99a5453e65928bd6ded86b4d6ffaf8 Author: root <root@localhost.localdomain> Date: Thu May 23 20:15:48 2019 +0800 v1 commit 28a5de29dcb41e987babfc0dadecfbffd9e48af1 Author: root <root@localhost.localdomain> Date: Thu May 23 19:21:06 2019 +0800 v2
3)回退到text版本,但是通过git log已经看不到v4的commit值了,现在怎么办呐?
可以通过git reflog查看所有的历史操作,找到v4前面的值即可
[root@localhost ken]# git reflog 1bf4b52 HEAD@{0}: reset: moving to 1bf4b52ac 3afafaa HEAD@{1}: commit: t a797245 HEAD@{2}: commit: text 1bf4b52 HEAD@{3}: commit: v1 28a5de2 HEAD@{4}: reset: moving to 28a5de29dc af6b8cf HEAD@{5}: commit: v2 28a5de2 HEAD@{6}: commit (initial): v1
4)git reset --hard a797245 #回到text版本
Git分支
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
1)第一步:准备git目录
[root@localhost ~]# mkdir mama
[root@localhost ~]# cd mama
第二步:初始化git目录
[root@localhost ~]# mkdir mama
[root@localhost ~]# cd mama
第三步:查看git分支
[root@localhost mama]# git branch
第四步:创建文件并提交才能看到主分支
[root@localhost mama]# git branch
第一步:查看分支
*表示当前所处的分支位置
[root@localhost mama]# git branch
* master
第二步:创建分支
[root@localhost mama]# git branch slave
第三步:切换分支
[root@localhost mama]# git checkout slave 切换到分支 'slave'
第四步:在分支里面操作test
[root@localhost mama]# echo 'aaaa' >>test [root@localhost mama]# cat test aaaa [root@localhost mama]# git add .
第五步:提交(注意一定要先提交)
git add .表示提交全部
[root@localhost mama]# git commit -m 'new' [slave eaa292e] new 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(+)
第六步:切换回主分支并查看文件
[root@localhost mama]# git checkout master 切换到分支 'master' [root@localhost mama]# cat test [root@localhost mama]#
现在查看test并没有看到刚才子分支提交的内容'aaaa'
第七步:合并子分支
合并之后发现现在主分支也可以看到刚才子分支添加的内容aaaa了
[root@localhost mama]# git merge slave 更新 7d383b9..eaa292e Fast-forward test | 1 + 1 file changed, 1 insertion(+) [root@localhost mama]# cat test aaaa