Git是一个分布式的版本控制系统
版本控制系统(Version Control System),是一个记录一个文件或者若干个文件内容变化,以便于在将来查阅特定版本修订情况的系统,可以以标签管理的功能来达到这一的效果
特点
将文件回溯到之前的某个状态
可以从内容变更中看出,是谁提交的代码除了问题,易于排错
VCS(本地版本控制系统)的迭代:
a。VCS本地版本控制系统
b。集中的版本控制系统(Centrolized Version Control System)
c。分布式版本控制系统(Distributed Version Control System)
Git的特点:
1、只有在提交代码和拉取代码的时候需要网络
2、直接记录快照,而非差异比较
3、所有操作基本在本地
4、Git保证数据完整性
5、Git一般只添加数据
git的运行逻辑
file–>提交暂存区–>提交到本地仓库–>提交到远程仓库
现在来想一个环境,你的windows中某个目录的文件要拖到另一个目录中,当你鼠标点击文件开始拖动时,跟随鼠标的有一个文件的残影,就可以理解为只要你没松鼠标按键,文件一直在暂存区,但也不代表,原始位置就没有文件,当你的鼠标拖到另一个目录中,松开鼠标时,就上传到了本地仓库。远程仓库就只需要上传一下就好了
安装Git
一台4G内存的服务器
yum -y install git
Git本地仓库的基本操作
mkdir /tmp/test # 创建本地仓库目录
cd /tmp/test/
git init # 初始化本地仓库
初始化空的 Git 版本库于 /tmp/test/.git/
仓库本地仓库状态
git status
# On branch master
#
# Initial
#
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
创建提交文件
echo "cyj" > cyj.txt
git add cyj.txt # 建立对此文件的跟踪,存储在了暂存区
git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: cyj.txt
#
git commit -m "first"
# 提交文件,如果没有成功,需要设置用户名和邮箱名,只是为了记录提交这个事是谁干的
git config --global user.email "mupeifeiyi@gmail.com"
git config --global user.name "mupei"
git commit -m "first" # 再次提交
[master(根提交) ada9f09] first
1 file changed, 1 insertion(+)
create mode 100644 cyj.txt
修改文件后在返回之前的状态
git reset HEAD [file]
撤出缓存区
git checkout -- [file]
返回上一次进入缓存区修改之前的内容
echo "pjf" >> cyj.txt # 修改文件内容
git add cyj.txt # 提交到暂存区,进行跟踪
git reset HEAD cyj.txt # 撤出暂存区
git checkout -- cyj.txt # 返回到之前的内容,仅限于
cat cyj.txt
cyj
查看提交日志
git log
git log
# 返回信息
commit ada9f094c2e1a98d2c760300da60c3067690b4f8 # 提交ID
Author: mupei <mupeifeiyi@gmail.com> # 用户密码
Date: Fri Mar 6 18:08:09 2020 +0800 # 提交时间
first # 提交标签
提交ID来进行返回指定的操作
git reset --hard [commit id]
git reset --hard ada9f094c2e1a98d2c760300da60c3067690b4f8
# 返回到产生这个id时,该文件的内容,同时会删除git log中,这个id之后的所有提交过的记录
Git远程仓库
需要注册GItHub的账户,登录进行创建远程仓库
创建新的仓库
指定仓库名称hello
,选择必须有权限的才可以提交到这个远程仓库,允许将存储库克隆到计算机上
图中红线部分是你的github新建hello仓库的https地址和ssh地址
如果要给远程仓库进行上传代码或者其他文件,因为我们创建的仓库是私有的,需要在本地记住生成密钥对上传到github上,经过验证才可以成功上传到远程仓库
ssh-keygen # 生成密钥对
cat /root/.ssh/id_rsa.pub # 将查看到的公钥复制到github上
登录github进行密钥的相关设置
选中SSH并创建新的SSH key
将复制的公钥信息粘贴,并为它命名
add成功的界面如图所示
回到github首页并进入新建的仓库hello
复制该仓库的ssh地址,用来从本机主机上传使用
在本地添加远程仓库
git remote add origin git@github.com:mupeifeiyi/hello.git
将本地仓库的测试文件cyj.txt
上传到github远程仓库
git push -u origin master # 第一次上传需要输入yes确认
# 也只有第一次使用-u选项将本地仓库与远程仓库关联
# 将本地master主干的代码上传到刚才创建的origin指定的远程仓库上
可以登录github看到hello仓库中已经上传过的文件
完整上传到远程仓库的步骤
echo mupei >> cyj.txt # 修改文件
git add cyj.txt # 添加到暂存区
git commit -m "third" # 提交到本地仓库
git push origin master # 从本地仓库上传到远程仓库
Git仓库克隆
mkdir test1
cd test1
git clone git@github.com:mupeifeiyi/hello.git
# 地址为远程仓库中生成的,会直接将远程仓库hello中的内容全部克隆到本地中
如果这个时候你在github中操作,将某个文件删除,但是本地不会知道该文件的变动,此时在进行上传push时,会报错,原因是因为数据紊乱,不允许提交到远程仓库了
将远程仓库中的内容拉取到本地,达到同步的效果,现在来模拟一下报错,删除远程仓库中,主干的一个文件
点击仓库中某个文件,删除即可
将删除操作提交
然后修改或者创建一个文件,尝试上传到远程仓库
echo "feiyi" >> pjf.txt
git add pjf.txt
git commit -m "pjf"
git push origin master
# 报错
To git@github.com:mupeifeiyi/hello.git
! [rejected] master -> master (fetch first)
error: 无法推送一些引用到 'git@github.com:mupeifeiyi/hello.git'
提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外
提示:一个版本库已推送了相同的引用。再次推送前,您可能需要先合并远程变更
提示:(如 'git pull')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
解决方法一:git pull
现在直接运行git pull
,拉取文件,然后上传
git pull
git push origin master
解决方法二:--force
git push origin master --force
方法二不推荐使用,有时候会使数据不一致
标签管理
tag
对于远程仓库来说相当于快照和虚拟机的关系,可以查看不同时候上传代码的内容
git tag
查看当前代码仓库已有的标签
一般在git push
之后使用git tag [tag_name]
,然后将标签上传到远程仓库
git tag v1.0.1
git push origin v1.0.1 # 将创建的tag同步到远程仓库
搭配每次git push
之后使用
上传之后可以在github看到该标签
为了可以区别多个标签的操作,我们来创建多个标签验证
# 重新创建一个测试文件
echo "裴金凤我爱你" >> pjf.txt
git add pjf.txt # 添加到暂存区
git commit -m "forth" # 提交到本地仓库
git push origin master # 从本地仓库上传到远程仓库
git tag v1.0.2 # 为刚上传的文件添加标签
git push origin v1.0.2 # 将标签上传得到github
此时通过git tag
也可以看到创建的两个标签
[root@git test]# git tag
v1.0.1
v1.0.2
在github查看两个标签之间的变化
v1.0.1,在添加这个标签之前,只有cyj.txt一个文件
v1.0.2,但是添加第二个标签之前,有上传了pjf.txt文件,一共两个
git rm [file]
,删除远程仓库的file必须是远程仓库已有的
git rm cyj.txt
git commit -m "delete" # 提交删除操作
git push origin master # 将空目录上传到github
git tag v1.0.3 # 为删除的操作创建标签
git push origin v1.0.3 # 将标签上传
该标签下将没有任何文件
分支管理
主干:进入hello远程仓库之后,直接就在hello下,可以看到的所有内容,都在主干中
*
在哪,哪个就是当前分支
创建分支git branch [name]
切换分支git checkout [name]
合并master与分支git merge [分支name]
删除分支git branch -d [分支name]
一般代码都是在分支上进行操作,因为不会影响到主干分支的代码情况,最后测试成功合并到主干即可
一个完整的分支举例:
# 比如现在有一个java项目需要做,开发首先要在分支上进行操作
git branch java # 创建分支java
git checkout java # 切换到分支java
# 虽然目录还在当前目录,但是对文件的操作后的提交是没有在主干
echo 123456 >> cyj.txt # 修改项目文件
git add cyj.txt
git commit -m "java"
git push origin java # 将java分支的内容上传到github
上传完成后,可以在github查看该分支
在java分支查看cyj.txt文件
cat cyj.txt
cyj
mupei
123456
切换回master分支再次查看
git checkout master
cat cyj.txt
cyj
mupei
可以看出在分支中的任何操作不会影响master主干的数据
当java项目测试完成后要合并到master主干中进行使用
git merge java
# 再次查看文件
cat cyj.txt
cyj
mupei
123456
# 已经变成了分支中的修改后的内容,之后再进行上传就OK了
git push origin master