Git的使用
引用:
背景介绍
背景介绍 😍
为什么选择Git
Git是分布式的版本控制,SVN是集中式的版本控制。如果SVN的中央服务器挂掉,那整个仓库就没有了。
集中式和分布式的版本控制区别
-
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 -
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟,这还不得把人给憋死啊。
-
那分布式版本控制系统与集中式版本控制系统有何不同呢? 首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢? 比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 -
和
集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。 -
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有台充当 “中央服务器” 的电脑,但这个服务器的作用仅仅是用来方便"交换"大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
Git环境搭建
调整窗口大小 😍
1. 自报家门
设置用户名
git config --global user.name "wkk"
设置邮箱
git config --global user.email "wbr@qq.com"
2. 创建一个版本库
什么是版本库 😍
版本库又名仓库,英文名 repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
把ems文件创建成版本库
git init
3. 添加文件到版本库
git add 文件名 把文件添加到版本库
git commit 文件名 把文件提交到版本库
git commit -m "版本信息 把文件提交到版本库(加-m避免出现vi界面)
退出:按esc退出编辑模式后,shift + zz 或q
修改文件内容
注意:修改文件内容后需要重新添加和提交
时光穿梭
git status 查看仓库状态
红色:文件修改 ,未添加版本库
绿色:文件添加到版本库, 未提交
nothing to commit,working tree clean:版本库没有更新的文件
仓库状态
git status
查看历史记录
git log 查看git的历史记录(最近改变)
git log --pretty=oneline
每条日志都只显示一行
多屏显示控制方式 空格向下翻页 b向上翻页 q退出
版本回退
git reset --hard 版本id
git reflog 显示所有历史记录的版本号
工作区与暂存区
Git 和其他版本控制系统如 SVN 的一个不同之处就是有暂存区的概念。
工作区有一个隐藏目录 git ,这个不算工作区,而是 Git 的版本库。
Git 的版本库里存了很多东西,其中最重要的就是称为 stage (或者叫 index ) 的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。
Git为何回退迅速?(重点)
Git是C语言写的,版本回退只是移动head指针指向不同的master主干
master记录了每一次更改,指针head始终指向当前所指版本的master
管理修改
为什么 Git 比其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,而非文件。
如果两次对aa.txt进行修改
只能把暂存区的修改提交到master主干,工作区已经修改没有加到暂存区的东西不能提交到主干分支
撤销修改
- 撤销工作区的修改
git resore -- file
- 撤销暂存区的修改 (已经add到暂存区)
a. 暂存区撤回工作区git restore --staged file
git reset HEAD如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 ,HEAD 可以不写,直接git resetb. 撤销工作区的修改
git resore -- file
删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用 rm 命令删了:
rm aa.txt
这个时候,Git 知道你删除了文件,因此,工作区和版本库就不一致了,git status 命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit :
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git restore aa.txt 取消删除
git分支 branch
分支介绍 😍
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 Git 的时候,另一个你正在另一个平行宇宙里努力学习 SVN。如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了 Git 又学会了 SVN!
分支在实际中有什么用呢? 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
其他版本控制系统如 SVN 等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但 Git 的分支是与众不同的,无论创建、切换和删除分支,Git 在 1 秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
在版本回退里,你已经知道,每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。
HEAD 严格来说不是指向提交,而是指向 master,master 才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master 分支是一条线,Git 用 master 指向最新的提交,再用HEAD 指向 master,就能确定当前分支,以及当前分支的提交点:
每次提交,master 分支都会向前移动一步,这样,随着你不断提交,master 分支的线也越来越长:
当我们创建新的分支,例如 dev 时,Git 新建了一个指针叫 dev,指向 master相同的提交,再把 HEAD 指向 dev,就表示当前分支在 dev 上:
你看,Git 创建一个分支很快,因为除了增加一个 dev 指针,改改 HEAD 的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变:
- 创建分支
git checkout -b dev
-b表示创建这个分支的同时并切换到这个分支
- 切换到主分支
git checkout master
注意:在dev上修改不影响主分支master
- 合并分支
git merge dev
注意:先切换到master再合并
- 删除分支
git branch -d dev
删除远程分支 git push -d origin dev
- 查看分支
git branch
git的冲突解决与远程仓库
Git告诉我们,aa.txt文件存在冲突,必须手动解决冲突后再提交。git status也告诉我们冲突的文件:
手动去增删改
远程仓库
- 在github 码云 注册用户名密码
- 创建仓库
- 将本地仓库push 远程仓库
git remote add origin 地址
git remote add origin git@gitee.com:icattt/study_spring_security.git
意思是给远程仓库添加一个目标,把地址给它
- 将本地master分支推向远程仓库
git push -u origin master
出错原因:一个仓库只能创建一次,这里不要勾选初始化仓库
- 删除原有的远程仓库地址
git remote remove origin
-
把代码从远程拉取到本地
-
Git全局设置(不用每次输入用户名):
git config --global user.name 'wbr'
git config --global user.email 'a@qq.com'
HTTPS和SSH的区别
SSH方式可以免密登录仓库
HTTPS的地址需要输入用户名和密码,使用SSH不需要。
但是SSH需要码云或githuab平台给本机做授权。
先根据本机生成公钥和私钥,再把公钥和私钥配置到码云平台上。
ssh-keygen -t rsa -C youremail@example.com"
ssh-keygen -t rsa -C 3551508840@qq.com"
此时生成了公钥和私钥的文件
把公钥文件打开,复制粘贴到gitee
除了第一次push到远程仓库用
git push -u origin master
以后就直接用
git push
拉取远程仓库代码
git pull
先把远程代码更新下来
往远程推dev分支
git push origin dev
git远程仓库操作
-
本地版本库与远程版本库冲突问题
git pull 将远程版本库改变拉到本地版本库中
git push 提交本地版本库
注意:如果出现冲突需要手动解决 解决之后git add 之后执行git commit -
提交本地版本库的分支到远程仓库
1). git checkout -b dev-b表示创建这个分支的同时并切换到这个分支
2). git add 文件名|目录名把文件或目录添加到版本库中
3). git commit -m "信息"把文件提交到版本库(加-m避免出现vi界面)
4). git push origin dev往远程推dev分支
5). git checkout master切换到master
6). git merge dev合并dev中内容 到master
7). git branch -d dev删除本地分支
8). git push -d origin dev删除远程分支
git中实战
git 添加版本库
-
git 上传项目
注意: git 上传的java项目
.idea
.iml
target .settings
.classpath
.project -
下载 .ignore插件
git init 创建版本库
上传项目到git远程仓库
每一个仓库都有唯一的远程地址
a. 新建仓库
b. 版本库设置git远程仓库地址
git remote add origin git@gitee.com:xxxx/wbrgit_parent.git
git add . 将当前项目所有内容添加到暂存区
git commit -m "this is init project" 把文件提交到版本库(加-m避免出现vi界面)
git reset 版本回退
- 上传项目到远程仓库
git push -u origin master拿本地库中的主干分支去更新远程仓库
从远程仓库拉取
git clone将远程版本库克隆到本地
克隆相比下载最大的好处是,克隆保留了项目原始的版本控制
- 打开idea工具
注意:推送java代码以前,一定要 git pull
git与idea集成 (不推荐这种方式,慢)
装完gitbash后git就默认集成在idea中了
把idea终端调成git终端
注意:修改完后必须重启idea
练习:
注意:不要忘了加.gitignore哦
删除原有的远程仓库地址:
(此处报错上文中有解决方法,在gitee新建新的未初始化仓库) 每个版本库只有唯一的远程仓库。
还可以git pull --rebase origin master,将远程仓库中的更新合并到本地仓库,rebase的作用是取消掉本地仓库中刚刚的commit
本地和远程仓库不一样了