Git
1.项目存在哪些问题
- 1.项目安全性太低
- 2.项目很难协同开发
- 3.项目无端报错
- 4.项目版本混乱
2.Git概念
Git是一个分布式的版本控制及协同开发工具
3.版本控制工具分类
3.1.集中式版本控制工具 cvs svn
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPqivjgj-1674896002757)(img\集中式版本控制系统s.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZEiTAOi-1674896002757)(img\集中式版本控制工具.jpg)]
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
3.2.分布式版本控制工具 Git
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
当然,Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
4.Git下载,安装
4.1.下载
官网下载:https://git-scm.com/
4.2.安装
傻瓜式安装!
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "zhangcn"
$ git config --global user.email "15236674712@163.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
5.Git使用
1.创建Git仓库(本地库)
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir GitRepository
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in E:/GitRepository/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
2.向仓库添加文件
和把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。
1.创建一个文件
$ touch aaa.txt
2.将文件添加到仓库
第一步,用命令git add
告诉Git,把文件添加到仓库:
$ git add <file> #<file> 文件名
$ git add . #添加所有文件
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
提交警告
工作区的文件都应该用 CRLF 来换行。如果
改动文件时引入了 LF,提交改动时,git 会警告你哪些文件不是纯 CRLF 文件,但 git 不会擅自修改工作区的那些文件,而是对暂存区(我们对工作区的改动)进行修改。也因此,当我们进行 git add 的操作时,只要 git 发现改动的内容里有 LF 换行符,就还会出现这个警告。
解决方式:
我们可以在git命令行中输入如下指令:
$ git config --global core.autocrlf false
**建议:**遇到了这种问题可以直接忽略,对我们整体工作不会造成影响!
3.向仓库提交文件
第二步,用命令git commit
告诉Git,把文件提交到仓库:
$ git commit -m "提交的描述信息" #m=message 本次提交的描述信息
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m "xxx"
行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);1 insertions`:插入了一行内容(readme.txt有两行内容)。
4.查看Git 状态
$ git status
- 红色:工作区已修改并未添加到暂存区
- 绿色:工作区的修改已经添加到暂存区并未提交到版本库
- nothing to commit, working tree clean 工作区与版本库保持一致
5.Git 分区原理
6.查看Git提交版本
当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看:
$ git log
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
$ git log --pretty=onelien #一行展示
需要友情提示的是,你看到的一大串类似1094adb...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
查看历史提交指令
$ git reflog
7.版本回退
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本append GPL
回退到上一个版本add distributed
,就可以使用git reset
命令:
7.1.回退上n个版本
$ git reset --hard HEAD^ #^表示回退上一个版本 有几个^就代表回退上几个版本
$ git reset --hard HEAD~100 #回退上100个版本
7.2.回退到制定版本
$ git reset --hard e93a(commitId) #commitId 提交版本的id
8.撤销修改
8.1.撤销工作区的修改
$ git restore <file> # <file>文件名
8.2.撤销暂存区的修改
#1.将暂存区的修改撤销到工作区
$ git restore --staged <file> # <file>文件名
#2.将工作区的修改撤销
$ git restore <file> # <file>文件名
9.删除文件
1.删除文件
$ rm -rf bbb.txt
2.确定删除
$ git add/rm <file> #add/rm :提交修改/确定删除 <file>文件名
#提交
$ git commit -m "确定删除"
3.误删除
$ git restore <file> # <file>文件名
6.分支管理
6.1.创建分支
$ git branch dev
6.2.查看分支
$ git branch
6.3.切换分支
$ git checkout dev
6.4.创建并切换分支
$ git checkout -b prod
6.5.合并分支
$ git merge dev
#注意:要将dev分支合并到master分支上,就在master分支执行此命令
6.6.删除分支
$ git branch -d dev
6.7.分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
7.Github使用
1.注册,登录
官网地址:https://github.com/
2.创建Github仓库
3.将远程仓库拉取到本地
$ git clone git@github.com:15236674712/2005-Repository.git
克隆失败:
- 请确保您具有正确的访问权限
- 并且存储库存在。
4.生成.ssh秘钥
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
- C:\Users\Administrator.ssh
$ ssh-keygen -t rsa -C "15236674712@163.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
公钥:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDAarLzlbCt1IuQ2BWgqwox4PD5NvUjNx8f2iGq0iQziwZ1doMBsePeDUbNEWvYhf+JdU/GIbxooFX18K6fwbv7KzG2h9pwlOFknUnOgjEAaPkLjoEmwCIGt/VJqNivcpWh6Pfn3Lzp9w5GVqK0AZTLK+Sb7pWs6LHeHVoMGFQZWNZiMzZ6QlWhOrHIBotLh2ybbiPZ5q+3i8ykKKmyRLKRirrxEoMWCRzTtrnKBIwYGIT9Qa7Cn+Nfgo6xTS2SFuWnKoU+xfYhvv1B9phHjGQe+lFc3fxATfNEPICDW1kOBj8mPayDgkuNkk9Y0oI6TqqNPOcS6TQSAjDA380/DcE9DBlMeOhNEEQWwVetrqpuLX2BdParPu46sXRkUkCOzWAHunLZILy15Qm+/8/OgTvQnofF63tDKXv0rQgegdo7AvXzma0BdjVvBJD8XMxuphW8hzOc4Avr26iLOKRrH10SmY+H0efeVOHvAIK2jP1M/050G80JAU9vnf4Utp1p65s= 15236674712@163.com
私钥:
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
5.配置GitHub信任列表
第2步:登陆GitHub,打开“Settings”,“SSH and GPG Keys”页面:
然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
6.将远程仓库拉取到本地
$ git clone git@github.com:15236674712/2005-Repository.git
克隆成功:
7.将本地修改推送至远程仓库
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master #origin 默认远程仓库的名字 master:本地分支名称
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
8.将远程的修改同步到本地
$ git pull origin master
9.将本地项目推送至Github
1.确定本地项目
- 确定项目名字
- 在项目中加入.gitignore
2.在Github创建创库
创建一个空仓库(空文件夹),要与本地项目名保持一致
3.仓库创建成功
执行以下命令:
git init
git add .
git commit -m "yingx项目第一次提交"
git branch -M main
git remote add origin git@github.com:15236674712/git_2005.git #(将本地仓库(项目仓库)与远程空文件夹做一个连接)
git push -u origin main #将本地项目推送至远程Github
4.拉取远程修改到本地
5.将本地修改推送至远程
8.Git集成IDEA
8.1.配置Git
8.2.配置Github
配置Github
创建token
登陆Github网站生成
配置Token权限
idea配置token
配置Github成功
8.3.修改idea终端为Git bash
修改控制台shell路径:setting -> Tools -> Terminal -> Shell path,修改为git安装路径。
8.3.Terminal中文乱码问题
我们配置idea 的终端为git 的bash.cmd 之后会出现中文乱码
解决方法:
1.git的安装路径下etc文件下有个 bash.bashrc 文件,在这个文件末尾追加:
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
2.中文乱码问题
- 在idea安装目录下找到idea.exe.vmoptions和idea64.exe.vmoptions文件,在文件的最后添加:
-Dfile.encoding=UTF-8
- 在git安装目录下找到etc/bash.bashrc文件,在文件的最后添加:
export LANG=“zh_CN.UTF-8”
export LC_ALL=“zh_CN.UTF-8”
-
在Terminal控制台输入:set LESSCHARSET=utf-8
-
退出控制台,重新进入即可。exit
8.4.初始化Git仓库
选择要初始化仓库的项目
8.5.添加到暂存区 add
8.6.提交到版本库 commit
加入提示信息
8.7.Idea中类的颜色
- 红色:工作区已修改并未添加到暂存区
- 绿色:修改已经添加到暂存区暂未提交到版本库
- 黑色:版本库与工作区一致
- 蓝色:已经提交到版本库,有修改
8.8.查看历史提交版本
展示历史提交版本
8.9.撤销修改
8.10.版本回退
8.10.1选择回退版本直接回退
8.10.2根据版本提交id(commitId)回退
复制版本提交编号
选择切换版本
输入要切换的版本编号
8.11.分支
查看/添加分支
分支操作
合并分支
8.12.将本地项目推送至Github
填写要分享的项目名
分享成功
8.13.将Github的修改更新到本地
pull
8.14.将本地的修改推送至Github
Commit and Push
push
推送成功
8.15.使用idea克隆并打开远程的项目
使用Git克隆项目
创建本地文件夹,克隆项目
是否打开项目
使用哪种方式打开项目
8.16.解决代码冲突问题
push时遇到冲突
当前分支主管的推送被拒绝
推送前需要合并远程更改
当push时遇到冲突,要先pull 再push
判断代码有没有交集,idea自动判断
-
1.代码无交集
直接pull成功
-
2.代码有交集
当两个开发者同时操作到一个文件时会出现冲突
当两个开发者遇到冲突代码有交集时:两个人协商解决,解决之后将代码再推送至Github,另一个人再同步修改
pull遇到冲突
解决冲突案例