# 29、Git

什么是 git

分布式版本控制系统,它是由linux(全球比较大得服务器系统)创始人花了两周时间使用C语言编写的工具(在git窗口中一般都是执行Linux命令) 什么是版本控制系统(git

没有版本控制系统之前,后面修改的内容会替换原有的内容,原有的内容没有做保存,以后想找都找不到;

版本控制系统的优势

  • 1、备份文件
  • 2、记录历史
  • 3、回到过去
  • 4、多段共享
  • 5、团队协作

常用的版本控制系统

  • git:分布式版本控制系统
  • svn:集中式版本控制系统

gitsvn 的区别

  • 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

7c32be61develop上的一个fix bugcommit,上面就是将这一个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中看到。

对于mergecommit的回滚,需要注意的是回滚到哪个分支上,不指定的话会报以下错误

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 可以查看安装包的时候真实请求的源

上次更新: 11/15/2022, 5:48:35 PM