Skip to content

什么是git

Git是一个分布式的版本控制的软件

  • 分布式:
    • 文件夹拷贝
    • 本地版本控制
    • 集中式版本控制
    • 分布式版本控制
  • 版本控制:毕业论文,写文案,需要反复修改和保留原始数据,代码也是。
  • 软件:不必多说

##为什么要做版本控制

保留之前的版本,便于回滚修改。

git安装

https://git-scm.com/book/zh/v2/起步-安装-Git

git的三个区域

  • 工作区

  • 暂存区:git add,从工作区到暂存

  • 版本库:commit,从暂存到版本库

代码管理过程

电脑上安装git之后,

Git进行版本控制需要如下步骤:

  • 进入要管理的文件夹

  • 执行初始化命令,给git提权

    bash
    git init
    
    #初始化后会出现一个.git存储一切与git有关的相关配置文件,存储所有git相关的配置,和全部的版本信息等。
  • 查看管理目录下文件状态

    bash
    git status
    
    #注:已经通过 git add <文件名>管理起来的文件为绿色,还未add的文件为红色

image-20240324122117762

  • 将文件提交到暂存区(把代码管理起来)

    bash
    git add <文件>
    
    # 将当前所有文件都管理起来
    git add .
  • 匹配个人信息:用户名,邮箱(最开始要)

    bash
    git config --global user.email "you@example.com"
    git config --global user.name "Your name"
  • 将代码从暂存区提交到版本库,生成版本及版本信息

    bash
    # m是message的缩写
    git commit -m '描述信息'
    
    #此时再查看文件,什么都没有,因为已经生成了一个版本
    git status
  • 查看当前所有的版本记录

    bash
    git log
    
    # 以图形化显示提交记录
    git log --graph
    
    # 图形化展示简洁版记录
    git log --graph --pretty=format:"%h %s"
image-20240611191719970

回滚

  • 回滚到之前的版本
bash
#彻底回滚
# --hard 此模式会永久丢失所有未提交到版本库的代码,包括工作区,暂存区的全部未提交代码,谨慎使用!!!
git reset --hard <版本>
  • 回滚到当前版本之后的版本
bash
#如果回滚到之前的版本后,使用git log 是无法查看当前版本之后的版本号的,
#此时使用如下命令,查看全部版本号,ref 是 reference 的缩写
git reflog

#回滚
git reset --hard <版本>

回滚的各种模式

具体哪滚到哪,看下面的图

基本就checkout --hard 用的多。

bash
#彻底回滚,
#--hard回永久丢失所有未提交到版本库的代码,包括工作区,暂存区的全部未提交代码,使用前记得搞一个新的分支,把代码备份,然后再--hard彻底回滚!!!
git reset --hard <版本>

#回滚到修改后,提交前的状态
git reset --mixed <版本>

#将尚未提交的代码回滚到修改之前的状态
git checkout -- <文件>

git checkout -- index.html     #注意:--前后都有空格,不然报错

#从暂存区回滚到工作区
git reset HEAD -- <文件>

git reset HEAD -- index.html

#从版本库回滚到暂存取
git reset --soft <版本>
image-20240611193628228

版本控制的原理

image-20201110005626068

  • 就是一个像快照一样的东西
  • 每一版本只保存相较于上一个版本变化或新增的部分,生成一个commit对象
  • 在各个commit对象之间,有一个指针,将所有的commit对象连接起来,如上图
  • 然后回滚版本的时候,就找到对应的commit对象,及根据指针找到所有之前的commit对象
  • 就实现了版本控制

分支

分支可以给使用者提供多个环境,意味着可以将正在写的代码和主线分隔开,以免影响主线代码。

image-20240324142642946

分支命令

  • 查看当前分支

    bash
    git branch
  • 创建分支

    bash
    git branch <分支名>
  • 切换分支

    bash
    git checkout <分支名>
  • 分支合并

    可能产生冲突,如下图约饭的部分,产生冲突后只能手动解决,解决后再次提交

    产生冲突的部分会同时出现在文件里,如下图。

    image-20240613191553162
    bash
    git merge <要合并的分>
    
    # 比如说把develop的分支merge到自己的分支
    # 先 git checkout sunminghong
    # git merge develop
    # 不要搞反了
  • 删除分支

    bash
    git branch -d <分支名>

    工作流

    image-20240324151312727

开发规范:至少要有两条工作流,main里只放稳定版代码,别瞎搞!!!

推代码的流程

  • 创建个仓库

  • 把本地代码推到运程仓库

    • 初始化本地仓库:
    bash
    git init
    • 添加远程连接,连接到仓库
    bash
    # 给仓库起个别名origin 
    git remote add origin <你的仓库URL>
    • 添加文件到暂存区
    git add .
    • 生成版本信息,并提交到版本库
    bash
    git commit -m "版本信息"
    • 推送到远程仓库
    bash
    # 一次推送全部分支到仓库origin
    git push --all origin
    
    # -u 会设置origin为默认仓库,下次push时直接 git push 就可以了
    git push -u <仓库别> <分支名>
    
    #举个例子
    git push -u origin main

拉代码的流程

  • 克隆远程仓库代码
bash
git clone <仓库URL>
  • 拉代码
bash
git pull

合并产生冲突的解决方案

image-20240614202539381
  • 会显示哪个文件有冲突
  • 手动解决

Rebase变基

  • 团队协作时,你的大多数提交版本,对于别人来说并不重要,别人只需要最终的结果
  • rebase可以将多个提交记录整合为一个
  • 但如果已经push到仓库了,不建议使用Rebase
  • 两种合并方式,如下
bash
# 从最新版本开始合并之前的n条记录
rebase -i Head~n

#从最新版本到写入的版本合并 
rebase -i <版本>
  • 合并后,输出如下
image-20240614204120697
  • image-20240614204333548
  • 将上述花圈的位置pick改为s

    • s的意思是将v4合并到上一版本v3,将v3合并到上一版本v2
  • 然后:wq!保存

  • image-20240614204647940
  • 再修改上图画圈位置的描述信息,完成

  • 如果已经提交到仓库了,不建议Rebase,在本地可以搞

Rebase用法二

  • 春生在公司写的代码只提交到了版本库,忘记推到远程仓库了

  • 春生回家后又写了别的功能的代码,推到了远程仓库

  • 第二天去公司要拉代码,但如果使用git pull会产生分叉

  • 此时可以如下操作,就不会产生分叉

    bash
    # git pull origin dev = git fetch origin dev + git merge
    git fetch origin dev      # 把代码拉到版本库
    git rebase origin/dev     #从代码库合并到工作区

使用Beyond Compare解决冲突

  • 下载Beyond Compare
  • 在git 中配置
bash
git config --local merge.tool bc3
git config --local mergetool.path '/usr/local/bin/bcomp'
git config --local mergetool.keepBackup false
  • 使用Beyond Compare解决冲突,输入如下命令,软件就会自动启动,如下图
bash
git mergetool
image-20240615194256699

多人协同开发git flow工作流(分支)

  • 每一个人有一个自己的分支,在自己的分支上写代码
  • 每个人的分支是从dev分支拆分出来的
image-20240615201416042

线上代码出bug了,怎么处理

  • 创建一个临时分支,比如叫bug,用于修复bug
  • 修复好后,合并回main分支,并删除临时分支bug

多人协同开发之创建初始项目和版本

  • 创建项目仓库

  • 给成员们授权(两种方式)

    • 方式一:

      • 点进项目
      • settings -> collaborates,如下图,邀请成员即可

      image-20240615202029672

    • 方式二

      • 创建一个组织

      • image-20240615202308765

      • 在组织里创建项目仓库

使用tag,代替版本号,进行版本管理

  • 在commit 版本信息之后打tag

  • bash
    # 在本地给刚刚commit的版本,打tag信息,v1.0,-a 是annotated tag 的缩写,打标签的意思
    git tag -a v1.0 -m  '版本信息'
    # 举个例子
    git tag -a v1.0 -m '第一版'
    
    # 删除tag信息
    git tag -d v1.0
    
    # 提交到远程仓库
    git push origin --tags
    
    #从远程仓库拉代码
    git pull origin --tags
    
    # 切换到版本
    git checkout v.10
    
    #clone 版本代码
    git clone -b v1.0 地址
    image-20240615203520524

开发完成后需要做code review

给分支配置,发起请求,同意后才可以合并

  • Review没问题之后,才合并到dev分支

  • 通过创建pull request 来做code review

    • 进入项目仓库 -> protect this branch

    • image-20240615211735441

    • 往下拉,在Rules里选择 require a pull request before merging

    • image-20240615211953731

如何发起一个合并请求

  • 点击pull request
  • 点击new pull request
  • 选择要合并的两个分支
  • 点击view pull request
  • 点击merge pull request
image-20240615213903338

组长做code review

  • Pull request 的地方会有提示,有人发起了merge 请求,如下图

  • image-20240615214503886
  • 点进去后,files changed处可以review code

  • image-20240615215424646
  • 没问题后,merge pull request,允许合并

  • image-20240615215350695

くすくくすく

查看有没有大文件被追踪

bash
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')"