大前端学习九:版本控制的利刃Git

326 阅读5分钟

目录:

  1. git 基础
  2. gitflow 和 团队协作
  3. gitlub、github、gitee私有化部署方案

课程前置-版本知识

Git Vs Svn

Git基础

秘钥管理

  1. 在控制台输入ssh-keygen -t rsa -b 4096 -C "your_email@example.com
    通常来说,都会默认放在/User/mac/.ssh/id_rsa文件夹。然后继续下一步就行了。但是,如果要放在另外的文件夹怎么处理了?
  2. 选择存放位置
  3. 进入github 的 settings 里面新建一个ssh key
  4. 进入个人文件夹,打开显示的文件夹 .ssh
  5. 修改config配置如下:
Host github.com
  HostName github.com
  User haimingyue
  PreferredAuthentications publickey
  IdentityFile /myproject/ssh/github_key

当我clone的时候,发现github报权限过大错误如下:

  1. 修改权限:chmod -R 700 /myproject/ssh/*

到这里就可以clone啦。

git remot扩展

git 基础命令

  1. 新建git仓库的两种方式
  • 第一种方式
git init
// 生成.git文件,这个文件存放所有文件的快照
git add test.txt 放入缓存
git commit -m "first-comiit" // 拍快照
git status 查看缓存
git remote add origin git@github.com:haimingyue/learngit-simoon.git 
git push origin master
  • 第二种方式(多仓库)
git remote add origin1 git@github.com:haimingyue/learngit-simoon1.git
git push origin origin1

  1. git clone : 从远程克隆项目,这个命令包含了git init 和 git remote 和 gitpull 的功能
  2. git pull 拉去代码
  3. git log 查看日志
  4. git reflog 查看本地的一些操作日志,包括删除的日志
  5. git config --global --list 查看全局配置
  6. 设置 git config global user.name "xxxx"
  7. git diff 查看差异
  • git log 和git reflog 的区别

git reflog 包括所有的提交、删除、切换分支的记录

  • git stash & git stash reply

应用场景: 某一个分支工作没有完成,需要切换到另外一个分支,就先git stash 缓存起来。切过去完成工作,切回这个分支,再git stash reply 恢复这些文件。

Git Flow(协同工作流)

经典模型

比较实用的两个模型

  • 第一种模型
  1. 适合持续继承的模型
  2. 上游分支向下游发展,

master ---> pre-production ---> production

主分支 ---> 预发布版本 ---> 发布版本

流程: Bug --> new branch -->master --> pre-production --> production

  • 第二种模型
  1. 适用于版本项目

流程: master --> Stable --> new Branch --> bug fix --> version

协作命令

git branch: 查看分支,当前处在哪个分支

git branch dev: 新增一个分支

git branch dev -D: 删除一个分支

git checkout -d dev: 复制代码,新建dev分支,并且切换到dev分支

git pull = git fetch+git merge

git fetch: 查看远程代码与本地有什么不一样

git fetch origin feature:dev1: 把远程feature的分支合并dev1分支, 如果dev1不存在,就自动新建一个分支。

dev1 切换到 dev 分支之后,git merge dev1: dev1 的代码就会合并到dev分支

git reset --hard head^: 回退到上一次提交

git reflog: 查看提交记录

git reset --hard 6d89c38(哈希值): 回退到这个hash对应的更改

两种工作流的实操

  • 场景 1 中的工作流

前提: 假设有3个分支,开发分支feature, 预发布分支dev, 生产环境master

git checkout dev // 切换到dev分支

get merge feature // 合并代码到dev分支

git checkout master // 切换到master

git merge master // 合并代码

  • 场景2针对版本的项目控制
git tag v1.0.0

git push origin master --tag

git tag -d v1.0.0 删除

git push origin :refs/tags/v1.0.0  删除远程的v1.0.0的tag

git push origin :feature 删除远程分支

git checkout -D feature 删除本地分支

git reset HEAD 文件名 // 取消暂存

git checkout --文件名 // 删除工作区修改的文件内容



分支创建原则

  1. 按需创建
  2. 自己的本地可以玩自己的分支,推送的时候,先合并代码
  3. 合并完成之后,发起PR,让项目经理合并代码
  4. 重要的版本管理

Git Lub 搭建

使用docker run 创建

sudo docker run --detach(后台运行) \
  --hostname gitlab.example.com(指定域名) \
  --publish 443:443(https协议) --publish 80:80(默认访问端口) --publish 22:22(可能仓库的端口) \
  --name gitlab(指定镜像名称) \
  --restart always(数据隐射宿主机) \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

使用docker-gitlab创建

github地址

  1. 在/home 下新建 docker-composer.yml ,粘贴以下内容
version: '2'

services:
  redis:
    restart: always
    image: sameersbn/redis:4.0.9-2
    command:
    - --loglevel warning                  
    volumes:
    - redis-data:/var/lib/redis:Z    !这一行修改 /home/lib/redis:Z

  postgresql:
    restart: always
    image: sameersbn/postgresql:10-2
    volumes:
    - postgresql-data:/var/lib/postgresql:Z  !这一行修改 /home/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm

  gitlab:
    restart: always
    image: sameersbn/gitlab:12.4.0
    depends_on:
    - redis
    - postgresql
    ports:
    - "10080:80"
    - "10022:22"
    volumes:
    - gitlab-data:/home/git/data:Z
    environment:
    - DEBUG=false

    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

    - REDIS_HOST=redis
    - REDIS_PORT=6379

    - TZ=Asia/Kolkata
    - GITLAB_TIMEZONE=Kolkata

    - GITLAB_HTTPS=false
    - SSL_SELF_SIGNED=false

    - GITLAB_HOST=localhost
    - GITLAB_PORT=10080
    - GITLAB_SSH_PORT=10022
    - GITLAB_RELATIVE_URL_ROOT=
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

    - GITLAB_ROOT_PASSWORD=     !自己的密码
    - GITLAB_ROOT_EMAIL=        !自己的邮箱

    - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
    - GITLAB_NOTIFY_PUSHER=false

    - GITLAB_EMAIL=notifications@example.com
    - GITLAB_EMAIL_REPLY_TO=noreply@example.com
    - GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com

    - GITLAB_BACKUP_SCHEDULE=daily     // 备份周期
    - GITLAB_BACKUP_TIME=01:00
    - GITLAB_BACKUP_EXPIRY=64800       // 备份7天内容

    - SMTP_ENABLED=false
    - SMTP_DOMAIN=www.example.com
    - SMTP_HOST=smtp.gmail.com
    - SMTP_PORT=587
    - SMTP_USER=mailer@example.com
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=login

    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=mailer@example.com
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_STARTTLS=false

    - OAUTH_ENABLED=false
    - OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
    - OAUTH_ALLOW_SSO=
    - OAUTH_BLOCK_AUTO_CREATED_USERS=true
    - OAUTH_AUTO_LINK_LDAP_USER=false
    - OAUTH_AUTO_LINK_SAML_USER=false
    - OAUTH_EXTERNAL_PROVIDERS=

    - OAUTH_CAS3_LABEL=cas3
    - OAUTH_CAS3_SERVER=
    - OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
    - OAUTH_CAS3_LOGIN_URL=/cas/login
    - OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
    - OAUTH_CAS3_LOGOUT_URL=/cas/logout

    - OAUTH_GOOGLE_API_KEY=
    - OAUTH_GOOGLE_APP_SECRET=
    - OAUTH_GOOGLE_RESTRICT_DOMAIN=

    - OAUTH_FACEBOOK_API_KEY=
    - OAUTH_FACEBOOK_APP_SECRET=

    - OAUTH_TWITTER_API_KEY=
    - OAUTH_TWITTER_APP_SECRET=

    - OAUTH_GITHUB_API_KEY=
    - OAUTH_GITHUB_APP_SECRET=
    - OAUTH_GITHUB_URL=
    - OAUTH_GITHUB_VERIFY_SSL=

    - OAUTH_GITLAB_API_KEY=
    - OAUTH_GITLAB_APP_SECRET=

    - OAUTH_BITBUCKET_API_KEY=
    - OAUTH_BITBUCKET_APP_SECRET=

    - OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
    - OAUTH_SAML_IDP_CERT_FINGERPRINT=
    - OAUTH_SAML_IDP_SSO_TARGET_URL=
    - OAUTH_SAML_ISSUER=
    - OAUTH_SAML_LABEL="Our SAML Provider"
    - OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
    - OAUTH_SAML_GROUPS_ATTRIBUTE=
    - OAUTH_SAML_EXTERNAL_GROUPS=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
    - OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=

    - OAUTH_CROWD_SERVER_URL=
    - OAUTH_CROWD_APP_NAME=
    - OAUTH_CROWD_APP_PASSWORD=

    - OAUTH_AUTH0_CLIENT_ID=
    - OAUTH_AUTH0_CLIENT_SECRET=
    - OAUTH_AUTH0_DOMAIN=
    - OAUTH_AUTH0_SCOPE=

    - OAUTH_AZURE_API_KEY=
    - OAUTH_AZURE_API_SECRET=
    - OAUTH_AZURE_TENANT_ID=

volumes:
  redis-data:
  postgresql-data:
  gitlab-data:
  1. 运行 docker-composr up -d 命令

看到下图,就完成了。

权限控制

  1. 以组为单元,设置管理人员
  2. 熟悉merge-request,写好git commit(这点一定要写好!)
  3. 及时回收权限,设置过期时间

gitignore

  1. gitignore.io
  2. vscode 中的插件 .gitignore generator