git
git重要的工作区域 工作区:项目目录 暂存区:工作区和版本库之间的缓冲地带 版本库:快照存储区域,工作区下的.git目录
文件状态 未跟踪:工作区中的文件,尚未执行add 已跟踪: 已暂存:通过git add将文件放到暂存区 未修改:git commit后,没有在做修改。工作区文件内容与版本库中一致 已修改:git commit后,修改文件,但是没有执行git add操作
git是一个开源的分布式的版本控制系统,用于敏捷高效的处理任何或小或大的项目。 无需服务器或者客户机随时在线,仅仅初次连接同步时需要,或者更新代码之后提交时需要。每个用户都相当于时服务器
svn(subversion)集中式管理数据的工具。
必须有服务器且在线,客户机使用此工具必须在线,客户机有代码更新之后必须提交服务器,数据由服务器统一保存
git与svn的区别
1.git是分布式,svn是集中式, 2.git把内容按元数据方式存储,而svn是按文件,所有的资源控制系统都是把文件的元信息隐藏在一个类似svn,cvs等的文件夹里 3.git分志和svn的分支不同,分支在svn中一点不特别,就是版本库中的另一个目录。 4.git没有一个全局的版本号,而svn有,目前为止这是跟svn相比git缺少的最大的一个特征 5.git的内容完整性要优于svn,git内容存储使用的是SHA-1哈希算法。这能确保
代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
分布式版本控制
集中式版本控制 开发者之间共用一个仓库 所有操作需要联网
分布式版本控制系统 每个开发着都是一个仓库的完整克隆,每个人都是服务器 支持断网操作
##############################################################
服务器名 | ip地址 |
---|---|
node01 | 192.168.4.156 |
node02 | 192.168.4.169 |
1.安装git
node01安装git工具,部署服务器环境
[root@node01 ~]#yum -y install git #装包
[root@node01 ~]# mkdir /var/git #创建目录
[root@node01 ~]# git init /var/git/project --bare #创建git仓库,初始化,--bare空仓库,一定要加
始化空的 Git 版本库于 /var/git/project/
[root@node01 ~]# ls /var/git/
project
[root@node01 ~]# ls /var/git/project/
branches config description HEAD hooks info objects refs
2.客户端测试(192.168.4.169)
使用git常用指令列表 git常用指令列表
指令 | 作用 |
---|---|
clone | 将远程服务器的仓库克隆到本地 |
config | 修改git配置 |
add | 添加修改到暂存区 |
commit | 提交修改到本地仓库 |
push | 提交修改到远程服务器 |
pull | 拉取数据保持同步 |
rm | 删除数据 |
reflog | 查看本机使用日志 |
log --oneline | 查看服务器使用日志 |
部署客户端环境
[root@node02 ~]# yum -y install git #装包
[root@node02 ~]# git clone root@192.168.4.157:/var/git/project #克隆服务器端的仓库到本地,当前位置
warning: 您似乎克隆了一个空版本库。
[root@node02 ~]# cd project/ #进入仓库(工作区)
[root@node02 project]# pwd
/root/project
[root@node02 project]# ls
[root@node02 project]# ls .git/
branches config description HEAD hooks info objects refs
[root@node02 project]# echo "hello world" > web1_001.txt #开始写代码(在工作区内容随意写)
[root@node02 project]# git add . #提交到暂存区
[root@node02 project]# mkdir test #创建新目录(相当于继续编写工作中的代码)
[root@node02 project]# cp /etc/hosts test/ #随意拷贝一个文件到次目录
[root@node02 project]# git add . #可以再次提交到暂存区,或者刚才不提交,这里只提交一次
[root@node02 project]# git status #查看状态,前面的一些操作
[root@node02 project]# git commit -m "web1_001.txt" #将代码提交到本地仓库,-m,选项时定义日志信息,可以写这次提交的内容是什么,写一些详细信息
#回车之后有提示输入邮箱与姓名,可以复制提示
[root@node02 project]# git config --global user.email "you@example.com"
[root@node02 project]# git config --global user.name "Your Name"
[root@node02 project]# git commit -m "web1_001.txt test/hosts"
#再次提交,不报错
[root@node02 project]# git push #将本地数据提交到远程服务器
[root@node02 project]# git config --global push.default simple #复制提示信息,修改为新的使用习惯
[root@node02 project]# git push #再次提交,然后输入node01的密码
3.在去node01里面克隆git服务端的project仓库,是否有数据,node01既是客户端又是服务端
[root@node01 ~]# git clone root@192.168.4.157:/var/git/project
[root@node01 ~]# cd project/ #进入目录
[root@node01 project]# ls #查看
test web1_001.txt
[root@node01 project]# echo "web1_001" > web2_001.txt #写代码
[root@node01 project]# git add . #提交到暂存区
[root@node01 project]# git commit -m "web2_001.txt" #提交到仓库,报错,输入邮件和名字信息
[root@node01 project]# git config --global user.email "you@example.com"
[root@node01 project]# git config --global user.name "Your Name"
[root@node01 project]# git commit -m "web02_001.txt"
[root@node01 project]# git push
[root@node01 project]# git config --global push.default simple
[root@node01 project]# git push
4.在node02更新同步数据
[root@node02 project]# git pull #更新数据
[root@node02 project]# ls
test web1_001.txt web2_001.txt
5.在node01删除数据并在node02查看更新数据
[root@node01 project]# git rm web2_001.txt
rm 'web2_001.txt'
[root@node01 project]# ls
test web1_001.txt
[root@node01 project]# git commit -m "del-web2_001.txt" #删除数据后提交保存
[root@node01 project]# git push
######################################################
#node02查看
[root@node02 project]# git pull
[root@node02 project]# ls
test web1_001.txt
6.HEAD指针操作
HEAD指针是一个可以在任何分支和版本移动的指针 通过移动指针我们可以将数据还原至任何版本 每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动。
指令 | 作用 |
---|---|
git log --oneline | 查服务器使用日志 |
git reset --hard 对应节点号码 | 还原到指定的位置 |
git log | 查看完整日志 |
-
1准备工作(多对数据仓库进行修改、提交操作,以产生多个版本)。
root@node02 project]# echo "new file" > new.txt
[root@node02 project]# git add .
[root@node02 project]# git commit -m "add new.txt"
[root@node02 project]# echo "first" >> new.txt
[root@node02 project]# git add .
[root@node02 project]# git commit -m "new.txt:first line"
[root@node02 project]# git push
6.2 查看Git版本信息
[root@node02 project]# git reflog
[root@node02 project]# git log --oneline
de963c9 new.txt:first line
bbbbe26 add new.txt
9f3efaf web2_mod_web2_002.txt
2b1fea0 web2_003.txt
3e2cff9 web2_002.txt
aa1b0cd del-web2_001.txt
93db3d5 web02_001.txt
989b778 web1_001.txt test/hosts
6.3 移动HEAD指针,将数据还原到任意版本
注意: 当前HEAD指针为HEAD@{0}。
[root@node02 project]# git reflog
de963c9 HEAD@{0}: commit: new.txt:first line
bbbbe26 HEAD@{1}: commit: add new.txt
9f3efaf HEAD@{2}: reset: moving to 9f3efaf
2b1fea0 HEAD@{3}: reset: moving to 2b1fea0
9f3efaf HEAD@{4}: commit: web2_mod_web2_002.txt
2b1fea0 HEAD@{5}: commit: web2_003.txt
3e2cff9 HEAD@{6}: commit: web2_002.txt
aa1b0cd HEAD@{7}: pull: Fast-forward
93db3d5 HEAD@{8}: pull: Fast-forward
989b778 HEAD@{9}: commit (initial): web1_001.txt test/hosts
[root@node02 project]# git reset --hard 3e2cff9
HEAD 现在位于 3e2cff9 web2_002.txt
[root@node02 project]# git reflog #查看指针移动历史
3e2cff9 HEAD@{0}: reset: moving to 3e2cff9
de963c9 HEAD@{1}: commit: new.txt:first line
bbbbe26 HEAD@{2}: commit: add new.txt
9f3efaf HEAD@{3}: reset: moving to 9f3efaf
2b1fea0 HEAD@{4}: reset: moving to 2b1fea0
7.协同工作中出现的问题。
node01
删除某文件,git rm ,然后commit提交,然后git push提交服务器
##########################
node02 修改node02随便一个文件,添加一点内容,git add . ,然后commit提交,然后git push提交服务器时报错,在使用git pull命令,git要求添加新的事件日志记录(添加日志时自动进入vim编辑状态,保存退出即可),然后再此提交git push ########################
node01 git pull 再次更新新数据,此时已经拥有web1的最新数据
#############################################
7.2.修改文件的冲突处理
首先保证客户机与服务器都是同步状态 node02 修改文件内容 vim web1_001.txt 修改同一行内容,例如第三行改成123 git add . git commit -m "node02 vim web1_001.txt" git push ###########################################
node01
修改文件 vim web1_001.txt 修改同一行内容,例如第三行改成456
git add . git commit -m "node01 vim web1_001.txt" git push 报错,提示要git pull,输入git pull结果还是失败, vim web1_001.txt发现文件被系统修改,然后将第三行以及以后的内容删除,再在第三行添加123,则说明最终商量结果是123,然后保存退出
git add . git commit -m "ok" git push 推送了最终商量结果给服务器
#####################################
node02