# 29、Git
什么是 git
分布式版本控制系统,它是由linux
(全球比较大得服务器系统)创始人花了两周时间使用C语言编写的工具(在git
窗口中一般都是执行Linux
命令)
什么是版本控制系统(git
)?
没有版本控制系统之前,后面修改的内容会替换原有的内容,原有的内容没有做保存,以后想找都找不到;
版本控制系统的优势
- 1、备份文件
- 2、记录历史
- 3、回到过去
- 4、多段共享
- 5、团队协作
常用的版本控制系统
git
:分布式版本控制系统svn
:集中式版本控制系统
git
和svn
的区别:
- 1、
git
属于分布式版本控制系统,也就是每个开发人员从中心版本库/服务器上chect out
代码后会在自己的机器上克隆一个自己的版本库。无网络的时候也可以提交文件,查看历史版本记录而svn
属于集中式版本控制系统(离开服务器就无法工作); - 2、
GIT
把内容按元数据方式存储,而SVN
是按文件:.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西; - 3、
Git
没有一个全局版本号,而SVN
有:目前为止这是跟SVN
相比Git
缺少的最大的一个特征。 - 4、
Git
下载下来后,在本地不必联网就可以看到所有的log
,很方便学习,SVN
却需要联网; - 5、
git
没有严格的权限管理控制,svn
则有;
# 集中式和分布式版本控制系统的区别:
区别
集中式版本控制系统:所有的版本备份和历史记录都在中央服务器上,每个人的电脑仅仅是一个开发代码的地方而已;如果想要查看历史记录,我们必须联网访问到中央服务器才可以;
分布式版本控制系统:
每个人都是一个单独的管理系统,在自己的本地就可以创建一个仓库,可以记录版本和历史。如果想要在不同的电脑上同步,就需要一个在网络上有一个服务器,保证能从不同的电脑上拉到代码,当然前提是有网络。(例如自己的gitHub
仓库)。我们也可以像集中式一样,建立一个中央服务器,每个人可以把自己本地的信息推送到中央服务器上(比如公司项目团队合作,就可以自己搭建内部的gitLab,部署自己内部的代码)。
# 1、初始化仓库 或 克隆仓库
TIP
初始化仓库
- 1、建立一个文件夹,在文件夹中打开
Git Bash Here
,输入git init
。执行完成之后,会在当前文件夹下自动生成一个.git
的文件夹,说明当前文件夹就是一个本机独立的git
版本控制仓库; - 2、关联仓库
git remote add origin xxx // xxx 为 github仓库地址 git remote rm xxx // 移除这个链接通道 git remote -v // 查看当前仓库链接的所有通道
克隆git仓库
- 在本地某个文件夹中右键打开
Git Bash Here
,执行以下命令:git clone xxx // xxx为仓库地址
如果是克隆的仓库,则不需要执行git init
,因为github
都自带.git
文件
# 2、提交内容到暂存区 / 撤回暂存区的内容:
工作区 → 暂存区
暂存区是临时存储,不会生成版本和历史记录的
git add xxx
: 把指定的文件提交到暂存区
git add -u
:把所有修改的文件(修改和删除的,新增的不包含)都提交到暂存区;
git add .
:把所有修改的文件(修改和新增的,删除的不包含)都提交到暂存区;
git add -A
:把所有修改的文件(修改、删除、新增的都包含)都提交到暂存区;
- 代码为红色:文件还没提交到暂存区
- 代码为绿色:文件已经提交到暂存区未提交到本地版本库
从暂存区撤回内容
git rm --cached xxx
(文件名需要加后缀):将提交到暂存区的xxx文件撤回
git rm --cached . -r
:将所有提交到暂存区的文件撤回
git checkout .
:把暂存区的内容撤回到工作区(会覆盖现有工作区中的内容,无法找回)
git reset HEAD .
:把当前暂存区的内容回滚为上一次暂存区的内容
# 3、把暂存区中的内容提交到本地版本库 / 撤回提交到本地版本库的内容(撤回提交的 commit
):
暂存区 → 本地版本库
提交到本地版本库会生成相关版本的历史记录,如果以后想要回滚到某一次的代码,可以用git
相关命令迁出对应的版本
git log/git reflog
用来查看commit
的每一个版本
git commit -m 'xxx'
:把暂存区的内容提交到本地版本库,后面的内容都是对本次提交新版本的说明xxx为说明
从本地版本库撤回内容
就是撤回之前git commit
的操作。对于是否清空工作区代码有两种选择
1、不清空工作区的代码,撤回了
commit
之后,修改的代码依然保留,可以直接commit
git reset --soft xxxx(最少7位)
:回退到某个版本(xxx
为版本号),只回退了git commit
的信息,不会恢复工作区的代码(修改的代码不会取消)。如果还要提交,直接commit
即可;git reset --soft HEAD^
:将上一次的git commit
的内容撤回,同上,修改的代码不会取消。HEAD
指向当前的版本,HEAD^
指向上一个提交。2、清空工作区的代码,修改的代码会被清空
git reset --hard xxx(最少7位)
:彻底回退到某个版本,工作区的代码修改也会变为某个版本的内容,撤销的commit
中所包含的更改被清空;git reset --hard HEAD^
:彻底回退到上个版本,工作区的代码修改也会变为上一个版本的内容;
# 4、把本地版本库的代码同步到远程仓库
git push origin master
# 比较每个区域的不同
工作区 VS 暂存区:
git diff
工作区 VS 本地版本库:
git diff master
暂存区 VS 本地版本库:
git diff --cached
# 根提交(root-commit
)
第一次提交到本地版本库:如果我们创建一个新的仓库,但是没有做过根提交,此时我们仓库中没有任何的分支,哪怕是
master
;也就不存在分支切换
# 团队协作与分支
# 中央服务器(中央仓库)
TIP
公司内部都会有一个内部的中央git
仓库管理服务器,我们也可以使用免费的git
仓库(github
)来作为我们的中央服务器仓库:
如何把本地代码推送到远程仓库上:
1.先与
gitHub
仓库保持链接git remote add name(name可以自己修改) 地址
git remote rm name
移除这个链接通道git remote -v
:查看当前仓库链接的所有通道
2.把本地仓库的代码和版本信息推送到远程仓库上
git push origin master
把本机代码推送到github
远程仓库上git pull origin master
把远程仓库中的代码同步到本地
一个项目中,我们一般会有以下 这样的文件
.git
:在当前项目中创建git
仓库生成的文件(很重要)
.idea
:使用webStrom
开发,默认生成的文件,记录ws
的一些信息(没用)
.gitignore
:我们一般手动在当前项目中创建一个后缀名是gitignore
的文件,这个文件中记录了每一次git
提交的时候忽略不管的文件或者文件夹(可在ws中创建这个文件)
Readme.md
:这个文件选择性增加,通过这个文件可以对当前的项目进行详细的描述(使用markdown编写)
在真正项目中们一般都是需要团队协作开发的,也就是会存在一个中央远程仓库,如何把gitHub
上的远程仓库上的文件复制到本地,执行命令如下
git clone 远程仓库地址
克隆到本地之后就可以继续开发了,开发完成后需要把开发的内容同步到远程仓库上,还是按照之前的老步骤操作即可
git add .
git commit -m '备注'
git push origin master
获取最新代码的时候只需要输入以下代码
git pull origin master
# 代码合并
TIP
作为开发者每次提交代码之前都要先pull
一下
[如果远程仓库和本地仓库不是同一个文件同一行代码冲突] git会自动帮我们合并仓库中的代码与我们工作区的代码
[如果同一个文件的同一行代码冲突]
- 找到冲突的文件,留下自己想要的代码
- 不管之前是否
commit
过,都要重新的commit
,然后push
即可
# 单独分支的管理
TIP
1、每个功能创建一个dev-xxx
分支,并且切换到这个分支上
git branch // 查看现有分支
git branch dev // 创建一个名叫dev的新分支(创建分支的时候会把master上的commit信息同步到新创建的分支上)
git checkout dev // 切换到名叫dev的分支上
git checkout -b dev // 创建一个新的dev分支并切换到dev这个分支上
git branch -D dev // 删除dev这个分支(一定要在其他分支上才能删除dev分支)
git merge xxx // 合并当前分支与xxx分支的内容
2、正常写代码,把每天开发的任务都先提交到自己功能的分支上
3、提交到远程仓库上
- 把本地自己分支
dev-xxx
中的内容,合并到本地自己的dev
分支下 - 把本地自己的分支删除(防止分支重复)
4、把本地最新合并的dev
分支代码,提交到远程仓库的dev
分支下
[具体操作] 1、创建一个仓库 2、把仓库克隆到本地 3、把源代码传递到master上 4、在本地仓库中创建gh-pages分支 5、把介绍页面放在gh-pages分支下 6、把介绍页面的内容上传到gitHub的gh-pages分支下
# Linux操作系统中常用的命令
常用Linux命令
ls
:查看当前目录下的文件
ls -l
查看详细信息ls -a
查看隐藏文件ls -la
同时具备以上两点
cd
:目录切换
cd ../
返回上级目录cd /
返回根目录cd xxx
进入到指定文件夹cd E:
进入到指定的磁盘
mkdir
文件夹名字 (创建一个文件夹)
touch xxx.xxx
创建一个空文件 如:touche.txt
- 好处:可以创建无文件名的文件
- 在电脑隐藏文件后缀名的情况下,我们也不至于创建出
1.txt.txt
这样后缀名重复的文件
vi
向指定文件中插入内容 如:vi 1.txt
- 首先我们进入命令窗口
- 我么先按i,进入到插入内容模式
- 编辑需要写入的内容
- 按ESC键,然后在英文状态下再按
shift
+;
键,再输入wq
,按回车(保存并退出) - 或者 输入
q!
,按回车(强制退出,新输入的内容不保存)
echo xxx>1.txt
把xxx内容放到1.txt
文件中,如果没有这个文件则创建这个文件,新存放的内容会替换原有的内容
echo xxx>>1.txt
新的内容会追加到原有内容的后面
cat
查看文件中的内容
cp xxx
拷贝文件
rm xxxx
删除文件
rm -r
递归删除(把当前文件夹中所有的后代元素也都遍历删除)rm -rf
强制删除 一旦删除,无法返回
# stash
临时缓存
临时存储
git stash
:命令可用于临时保存和恢复修改,可跨分支。
git stash save "xxx"
: 执行存储时,添加备注,方便查找,只有git stash
也要可以的,但查找时不方便识别。
git stash list
: 查看stash
存储列表
git stash apply
: 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0}
,如果要使用其他个,git stash apply stash@{$num}
,比如第二个:git stash apply stash@{1}
git stash drop stash@{$num}
:丢弃stash@{$num}
存储,从列表中删除这个存储
git stash clear
:删除所有缓存的stash
# 修改完代码(未commit)发现分支错误
解决方法
- 1、保存修改 在当前分支执行:
git stash save 'xxxxx'
。 - 2、切换分支 执行:
git checkout xxxx
。xxx为分支名称 - 3、同步修改 执行:
git stash apply
。默认使用第一个存储,即stash@{0}
# 代码合并中的问题
# 只合并某个分支的某一个commit到另一个分支
单个commit合并
git checkout develop-hbb
git cherry-pick 7c32be61
7c32be61
是develop
上的一个fix bug
的commit
,上面就是将这一个commit
合并到develop-hbb
上
# 合并连续多个的commit到指定的分支上
多个commit合并
- 1、首先基于
develop
创建一个临时分支temp
, 并指明新分支的最后一个commit
git checkout -b temp 54dfef55
- 2、将temp分支上的从
7c32be61
到最后一个commit
,也就是54dfef55
的commit合并到develop-hbb
上
git rebase --onto develop-hbb 7c32be61^
# 回滚代码
revert
revert
的原理实际上就是提交一个反向变更,低消之前的变更。revert
会保留所有的操作记录,历史变更和revert
变更都会保存在历史中,可以从git log
中看到。
对于merge
的commit
的回滚,需要注意的是回滚到哪个分支上,不指定的话会报以下错误
git revert cd397d20
error: commit cd397d2076b88da38d22df868f039e847524d457 is a merge but no -m option was given.
fatal: revert failed
回滚失败 no -m option was given
,这是因为merge
是把两个分支合并到一起,回滚的话,就必须告诉git
需要回滚到哪个分支,输入git log
查看git
日志
commit f54750f4b818e7a1a935ae6ce414e7e5a72dbc06
Author: xxx <xxx@xxx.com>
Date: Mon Nov 14 15:59:23 2022 +0800
feat: 设置到期时间逻辑处理
commit cd397d2076b88da38d22df868f039e847524d457
Merge: f0d7232a 87b077c1
Author: xxx <xxx@xxx.com>
Date: Mon Nov 14 15:13:11 2022 +0800
feat: 合并品牌升级代码
commit f0d7232a25c6b5ab0ed07b0445ac8fde5c4ce65c
Author: xxx <xxx@xxx.com>
Date: Sat Nov 12 21:05:29 2022 +0800
feat: 前端页面开发
从log(Merge: f0d7232a 87b077c1)
中可以看出来,f0d7232a
是1,87b077c1
是合并来的代码2
所以回滚-m
参数值是1,命令是git revert cd397d20 -m 1
# 取消merge
TIP
如果merge
过程中(一般是有冲突需要解决),想取消,则执行命令
git merge --abort
# git常用命令
TIP
npm config get registry // 查看npm当前镜像源
npm config set registry https://registry.npmjs.org
yarn config get registry // 查看yarn当前镜像源
yarn config set registry https://registry.yarnpkg.com
yarn install —verbose 可以查看安装包的时候真实请求的源