git的下载
版本控制系统一般分为两种,集中式版本控制系统,分布式版本控制系统
什么是集中式版本控制系统:版本库集中存放在中央服务器,工作时候使用自己的电脑,当工作时候在中央服务器上拉取最新版本的代码,然后开始工作,工作完成之后,将自己编写完的代码再推送给中央服务器。
他的缺点也显而易见,当中央服务器宕机时全部的工作就无法再去进行,而且无法确保每个人的网络速度都很快,拉取推送代码会很慢浪费大量时间。(比较有代表性的是:svn,svc等)
什么是分布式版本控制系统:我们的每个主机设备就是一个完整的版本库,我们可以直接在我们本地进行工作,也不用网络,当我们多人协作的时候,只需要相互推送一下代码,这样就可以看到各自的内容
分布式是目前比较热门的一种方式,优点就是不用连接网络确保了我们工作时候只需要在本地,即使是多人协作,他的速度也是非常快的。
缺点就是,可能在本地储存需要大量的储存,在数据方面需要大量的维护
(在线分布式库也有很多:github,gitlab,gitee)
什么是git:git是一个开源的分布式版本控制系统,开源有效,快速的对很小到非常大的项目版本进行管理
下载git
访问官网:
Git - 安装 Githttps://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
在这里选择下载的平台版本
这里下载的gui界面
Gui界面也涵盖了各个平台的
初始化操作
git -v
# 可以看到git版本
再使用git之需要先去配置一下用户名和邮箱
git config --global user.name 'tarro'
--global : 全局配置对所有仓库生效,如不加这个参数则只对当前仓库生效
--system : 系统配置,对所有用户生效(这个是系统级别配置,一般不使用,一般使用global)
( 其实用户名为tarro其实可以不用’’引起来 如果是kali tarro 中间有空格 那就一定需要’’ ,如果没有空格的情况下去掉空格也是可以的 )
配置完用户再来配置一下邮箱
git config --global user.email 123@qq.com
由于邮箱中间是没有空格的这里可以直接省略引号
git config --global credential.helper store
保存一下用户名和密码这样就不用每次都输入了
git config --global --list
可以使用该命令去查看一下刚刚写入的内容
创建初始本地仓库
创建仓库一般有两种方式
- 在本地进行管理
git init
- 克隆远程仓库
git clone
创建本地仓库
git init
该命令直接把当前所在目录变成git的仓库
可以看到我们执行了该命令之后我们的目录后面就有提示一个master的标识
使用ls -a 还可以看到一个隐藏文件.git的文件,这个不可以进去删除,如果删除了里面的东西就可以造成git结构的破坏
如果我直接把.git这个目录删除那么这个目录也不在是master
还可以在git init 后面通过路径的方式去创建git仓库
git init my-git
我们这个就是在当前目录下生成一个git仓库,git init可以写相对路径,也可以写绝对路径
克隆远程仓库
git clone git@github.com:KALItarro/git.git
这样就把我github上的仓库克隆到本地了
Linux搭建本地仓库
我准备了两个Linux,一个Windows,分别为
1.centos7 ip: 192.168.6.1 git主服务器
2.centos7 ip: 192.168.6.2 客户端
3.windows10 ip:192.168.6.254 客户端
我分别在Linux和Windows中都安装了git工具
先去搭建Linux的主服务器,在第一台6.1服务器上
去创建一个用户
useradd -m git
echo git:123 | chpasswd
让后切换到这个角色中
su - git
mkdir git && cd git
先去创建一个目录
git init --bare
直接创建一个裸模板库,就是不放在隐藏目录里,直接放目录里
现在就不需要去配置别的了,到第二台6.2服务器上操作即可
我先做个ssh免密,如果不做也是可以的,只不过每次远程操作都要输入密码
在6.2服务器上
ssh-keygen -t rsa
让后一直回车
ssh-copy-id git@192.168.6.1
输入yes然后输入git的密码123即可
先去创建一个名为git的文件夹(不是git也可以)
再去把项目克隆下来
git clone git@192.168.6.1:/home/git/git
由于我们还没在这个里面做任何配置,所以空的是正常的
再次进入刚刚克隆的git目录
创建一个1.html内容为1
echo 1 > 1.html
可以看到刚刚添加的一个,现在我将他添加到暂存区
git add .
这样就添加进去了
git status
可以查看做的操作
让后保存到本地
git commit -m '第一次修改'
-m是注释
下面这报错是没有写用户名和邮箱,设置一下就行
补充完之后再推送即可
git push origin master
推送成功,现在我们把git目录删除,再重新拉取一下就行
这样的话就保存进仓库了,后期做出了修改等操作都可以重新推送
这些就是linux上的一些操作
现在去win10上通过git自带的gui进行一次提交,windows上的git命令也是和Linux上一样的
然后多次输入密码
让后就成功连接并且克隆到本地了
我在做个目录中添加一个文件名为321
点击一下rescan就可以看到刚刚做出的操作了
然后依次向下点,分别是放到暂存区,写入本地,推送到服务器
当我们点击了push的时候,如果你没有写你的user名称和邮箱就会弹窗让你写,只需写完重新推送即可
现在我去Linux上拉取一下看看
也可以看到321,这样就同步成功了
工作区域和文件状态
git的工作区域主要分为3个:工作区,暂存区,本地仓库
git的文件一共有4种状态:未跟踪 ,未修改,已修改,已暂存
git init #创建本地仓库
git status #查看仓库状态
git add #添加到暂存区域
git commit #提交
上一节我已经创建了一个本地仓库
我在这创建了一个文件,再使用status去查看发现他是一个未跟踪的一个状态
我使用
git add file1.txt
他现在就是暂存区的了,再去放到本地仓库,他放本地仓库他只会放暂存区域的,我这里再创建一个文件
可以看到新文件没有放到暂存区域,所以等会提交并不会
git commit -m "第一次提交"
如果不加-m会进入vim的交互模式写入介绍
可以到第一个文件已经不存在了,因为他只会提交在暂存区中的文件
还能通过通配符去匹配内容
我这里创建了几个文件在这个目录里,都是未跟踪状态
git add *t
或者使用
git add .
将这个目录下所有的对象放到暂存区
这次使用
git commit
进行提交,会进入到vim的编辑模式
把介绍写在最上面
可以看到提交过后没有再提交的内容了
使用
git log
查看提交的历史记录
还可以使用
git log --oneline
查看简洁的更新内容
reset 版本回退
当需要回退版本的时候 就 使用 git reset 进行版本的回退,可以回退到某次的提交那次
reset 有三种用法 也是就是在后面加上三种参数
git reset --soft # 也就是保留工作区和暂存区的内容
get reset --hard # 也就是丢弃工作区和暂存区的内容
get reset --mixed # 介于上面两者之间,他会保存工作区的东西但是不会保存暂存区的东西
mixed也是reset的默认参数
soft
这里我直接创建几个文件
然后将这个目录复制出来三个
一个目录演示一个操作
先进入到soft中演示一下soft的效果
可以看到我当前没有进行恢复,所以他里面没有要更新的东西,我把他恢复成第二次的记录,不出意外的话再去查看,他应该显示有个3.txt没有暂存,因为当时做第二个快照的时候没有第三个,他也不会去清除第三个,所以他肯定有一个3.txt的没有记录
使用他前面的数值进行恢复一下
git reset --soft 93919bd
这样就恢复成功了,可以看到他保留了暂存区
hard
进入git-hard/目录
可以直接使用HEAD^恢复到上一次快照
git reset --hard HEAD^
可以看到工作目录和暂存区都没有东西了
mixed
最后再去看一下mixed参数
切换到mixed工作目录之后,直接执行
git reset HEAD^
然后查看一下提交历史
可以看到他并没有保存暂存区
操作回溯
在实际操作中我们一般都是使用的,soft和mixed , hard很少使用,他可能会造成误删除的效果,但是误删除了问题也不大,因为所有操作都是可以进行回溯的
我们再回到hard目录中
使用
git reflog
查看一下操作的历史记录
git reset --hard 6892b0f
就直接恢复到指定的步骤了
diff查看差异
git diff 用于查看差异
可以查看工作目录差异,暂存差异,分支差异等
我准备了3个文件,分别是1,2,3.txt 每创建了一个文件夹都进行了一次备份
我直接去更改一下3.txt文件内容
然后使用
git diff
可以看到他的一个改动信息
默认的是工作区和暂存区进行一个比较
可以使用git add .暂存区同步一下
查看工作区和版本库之间的差异
git diff HEAD
查看暂存区和版本库之间的差异
git diff --cached
还可以进行版本之间的比较
只用前面的数值比较即可
git diff 3854b95 07f5c66
比较上一次提交的版本和当前的提交版本之间的变化
git diff HEAD~ HEAD
git diff HEAD^ HEAD也是一样的
git diff HEAD~2 HEAD
就表示之前的两个版本
git diff 3.txt
也可以针对某个文件查看差异内容
git diff 查看分支差异的话直接加上分支的名称就可以了
从版本库中删除文件
有两种办法一种直接在工作目录中删除再同步 一种直接在版本库删除
但是暂存区中的3.txt还没被删除掉
再去更新一下暂存区
发现3.txt没了,这种办法十分的低效
可以直接使用git rm命令去删除
他会把本地工作区和暂存区的都删除掉
如果不想删除本地的话可以在后面加上--cached
git rm --cached 文件名
忽略文件
忽略文件就是不应该加入到版本库中的文件
只要在.gitignore中列出要忽略的清单,他就不会去提交到仓库中
现在我创建了两个log文件
我现在不想把access.log提交到仓库中,我可以这样做
echo access.log > .gitignore
再去提交一下
发现access.log成功被隐藏
我们也可以使用通配符进行配置
我直接编辑.gitignore这个文件
意思是所有log后缀的文件都不上传
现在一切以.log结尾的文件都不上传了
因为刚刚已经上传过了,虽然还有他,但是我现在对other.loh插入一些数据看看
可以看到他还是会进行记录的,因为他有个前提就是必须是先在.gitignore里写要忽略的文件
如果我已经提交上去了再去进行忽略就是无效的
这时通过git rm命令删除一下就行
git rm --cached other.log
此外还可以对整个目录进行忽略
这个就是对整个temp进行忽略
他是支持一些简单的Linux中正则表达式的
这就是一个简单的案例
管理远程仓库
创建好github账户之后创建一个新的仓库
创建好仓库等会在下一步,想克隆远程仓库进行工作必须要先进行ssh密钥的认证
windows上生成ssh密钥
ssh-keygen -t rsa
一直回车
再去c盘下找到你的用户目录里
有个.ssh的目录里面id_rsa.pub 内容就是我们需要的密钥
里面这串就是密钥
Linux下获取密钥
ssh-keygen -t rsa
一直回车
这个就是密钥
将密钥放入github
然后回到仓库中
点击ssh
然后回到我们设备上
克隆到本地
git clone git@github.com:KALItarro/git.git
不要写我的地址,后面要写你的仓库地址
我这里创建了一个文件,加到了缓存区,又进行了提交,最后推送到github上
现在我到github上看一下
可以成功看到内容了推送成功
关联本地仓库
上一节展示了将仓库克隆下来再进行同步
这次要展示的是将本地已有的仓库推送到公网仓库上
再去创建一个github仓库
然后我在本地创建了一个仓库
我再把他进行暂存,再提交一下本地就可以进行下一步了
复制一下仓库地址
git remote add origin git@github.com:KALItarro/git1.git
git branch -M main
git push -u origin main
这就成功的传上来了 push 是上传 pull是拉取
上传是把本地的数据上传上去,也就是让仓库和本地的进行同步
拉取就是让本地的仓库和github仓库进行同步
我去github里修改一下东西
现在我创建的100个文件都是空文件,我现在在github的在线仓库中的66文件中写入一下东西
再到本地进行拉取
可以看到文件内容被拉取下来了
他拉取下来的内容会被合并,当本地也有同样的文件可能会导致合并失败
还可以用fetch他不会去进行合并
git分支的管理
git的仓库默认是main
使用命令
git branch
可以看到目前就一个main分支
我现在创建3个文件,每创建一个提交一次
我这里使用的GitKraken可以看到每次提交的一个过程
创建分支
现在我创建一个名为dev的分支
git branch dev
现在就可以看到dev分支了,再去进入分支
进入分支
git checkout dev
使用checkout也是可以进入分支的,但是checkout他是可以恢复文件,有些情况下当文件名和分支名称重复了之后,再去使用checkout恢复,他只会先去切换分支
官方因为这个操作,又出了个switch他和checkout都是可以进行切换分支,但是switch是专门用来切换分支的
git switch main
我再切换回dev
git switch dev
我再到dev分支下创建一些文件,并提交
再切换回main分支
git switch main
可以看到dev里的和main的不同步所以他们互不干扰
合并分支
我现在在main里 想把dev的内容合并到main里
git merge dev
如果想把main的合并进dev里的话,需要先切换到dev里然后执行 git merge main
可以看到现在dev合并过来了
git log --graph --oneline --decorate --all
可以看到合并的情况
删除分支
当我合并完分支之后
发现dev分支依然存在
分支必须要进行手动删除
git branch -d dev
-d是删除已合并的分支,无法删除未合并的
-D是强制删除,都可以删除
解决合并分支冲突
我先在main分支的main内容为1
我切换到feach分支中去修改main1中的内容并且去提交
git switch feach
再去提交,再换回main分支也去修改main1的文件内容
也是去提交,再进行合并,由于都是在一个文件同样的位置,所以合并就报错
git merge feach
可以看到已经报错了
git diff
可以看到具体的内容
main1中成这样的,我们再这里进行合适的调整之后,再去提交就自动进行合并了
合并成功了
如果想终止合并的话可以使用
git merge --abort