一.git简介
1.git基础
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
- 存储每个文件与初始版本的差异
Git 不按照以上方式对待或保存数据.反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
- 近乎所有操作都是本地执行
这也意味着你离线或者没有 VPN 时,几乎可以进行任何操作。 如你在飞机或火车上想做些工作,你能愉快地提交,直到有网络连接时再上传。这也意味着你离线或者没有 VPN 时,几乎可以进行任何操作。 如你在飞机或火车上想做些工作,你能愉快地提交,直到有网络连接时再上传。
使用其它系统,做到如此是不可能或很费力的比如,用 Perforce,你没有连接服务器时几乎不能做什么事;用 Subversion 和 CVS,你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。
2.git的三种状态
Git 有三种状态,你的文件可能处于其中之一:
- 已提交(committed):表示数据已经安全的保存在本地数据库中
- 已修改(modified):表示修改了文件,但还没保存到数据库中
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域:
3.工作目录、暂存区域以及 Git 仓库
- Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据
- 工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
- 暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
在工作目录中修改文件。
暂存文件,将文件的快照放入暂存区域。
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录
二.Git的部署及其应用
Git相关安装及其简介也可参考网站:
https://www.liaoxuefeng.com/wiki/896043488029600
https://git-scm.com/book/zh/v2/起步-初次运行-Git-前的配置
1.Git的部署及其相应的配置
1.安装git
[root@server1 ~]# yum install -y git
2.初次运行git前的配置
//获取 Git 仓库
有两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。
在现有目录中初始化仓库:
创建一个版本库:
[root@server1 ~]# mkdir demo
[root@server1 ~]# cd demo/
[root@server1 demo]# pwd
/root/demo
[root@server1 demo]# ls
通过git init命令把这个目录变成Git可以管理的仓库:
[root@server1 demo]# git init ##命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干
Initialized empty Git repository in /root/demo/.git/
[root@server1 demo]# ls
[root@server1 demo]# ls -a
. .. .git
//用户信息:
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改
[root@server1 ~]# git config --global user.name "zll"
[root@server1 ~]# git config --global user.email zll@westos.org
注:如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
//文本编辑器:
配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器,通常是 Vim ,如果想使用不同的文本编辑器,例如 Emacs,可以这样做:
git config --global core.editor emacs
//检查配置信息:
3.添加文件到Git仓库
//创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,将看到一个新的未跟踪文件:
//跟踪新文件,使用命令 git add 开始跟踪一个文件。要跟踪 README 文件,运行.此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:
注:git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件
//将跟踪文件提交到仓库,查看文件状态:
二.Git应用
1.暂存已修改文件
1.修改一个已被跟踪文件,并且查看状态
[root@server1 demo]# vim readme.txt ##编辑文件修改相应内容
[root@server1 demo]# git status
# On branch master
# Changes not staged for commit: 表示已跟踪文件已经发生了修改,但是还没有放到暂存区,要暂存这次更新,需要运行 git add 命令
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@server1 demo]# git status -s
M readme.txt 修改过的文件前面有 M 标记,出现在右边的 M 表示该文件被修改了但是还没放入暂存区
2.查看文件修改的内容
[root@server1 demo]# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 891edf5..6dc95cb 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
zll
zll
+cyh ##显示文件添加了内容
3.重新运行 git add 把最新版本重新暂存起来,并且查看状态
[root@server1 demo]# git add readme.txt
[root@server1 demo]# git status
# On branch master
# Changes to be committed: 显示文件已经暂存,需要提交文件到仓库
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
[root@server1 demo]# git status -s
M readme.txt 出现在靠左边的 M 表示该文件被修改了并放入了暂存区
4.将已经暂存的文件进行提交并且查看状态
[root@server1 demo]# git commit -m readme.txt
[master 7ba4b85] readme.txt
1 file changed, 1 insertion(+)
[root@server1 demo]# git status
# On branch master
nothing to commit, working directory clean
[root@server1 demo]# git status -s
注意:新添加到暂存区中的文件前面有 A 标记
2.查看已经经过多次修改并提交到仓库的文件版本
[root@server1 demo]# git log
commit 7ba4b856321536d2f3e9c4090ca59aa4121ba1d6
Author: zll <zll@westos.org>
Date: Wed Jun 5 15:57:50 2019 +0800
readme.txt
commit 61acf1b980a1f3978a7410d793724d72fc2c56af
Author: zll <zll@westos.org>
Date: Wed Jun 5 11:17:52 2019 +0800
add readme.txt
git log命令显示从最近到最远的提交日志,本次显示进行了俩次提交,一次是文件编辑好后地直接提交,第二次是对已经跟踪地文件进行修改然后iu再次提交
//要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
[root@server1 demo]# git reflog
7ba4b85 HEAD@{0}: commit: readme.txt
61acf1b HEAD@{1}: commit (initial): add readme.txt
3.忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
4.撤销修改
修改readme.txt文件,并且查看文件状态。但是添加地内容发现又不是需要地内容需要对添加的内容进行撤销中分为ie两种情况:
1.修改了文件但是文件还没有add到暂存区
//对文件进行修改并且查看文件状态
[root@server1 demo]# vim readme.txt
zll
zll
cyh
是zhu
[root@server1 demo]# 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
//对所作的修改进行撤销并且查看文件,发现文件内容又回到了上一个没有修改之前的版本
[root@server1 demo]# git checkout -- readme.txt
[root@server1 demo]# cat readme.txt
zll
zll
cyh
2.修改了文件的内容并且已经提交到了暂存区
//修改文件内容并且提交到暂存区并且查看文件状态
cyh
[root@server1 demo]# vim readme.txt
[root@server1 demo]# cat readme.txt
zll
zll
cyh
123345556
[root@server1 demo]# git add readme.txt
[root@server1 demo]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage) ##可以把暂存区的修改撤销掉(unstage),重新放回工作区
#
# modified: readme.txt
//撤销暂存区的修改,用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区
[root@server1 demo]# git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
//再用git status查看一下,现在暂存区是干净的,工作区有修改
[root@server1 demo]# 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
//执行checkout撤销已经被撤销到暂存区的修改,再次查看文件发现文件已经会到初始版本
[root@server1 demo]# git checkout -- readme.txt
[root@server1 demo]# cat readme.txt
zll
zll
cyh