Git


# Git

网站 github 托管代码 免费的服务器

# 基础用法

git 工作流:你的本地仓库由 git 维护的三棵 "树" 组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区 (index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果
工作目录用 add 命令,提交到暂存区,在暂存区用 commit 提交到 HEAD

git操作的基本步骤
1. cd 路径 进入当前目录

2. 配置git基本操作
[注] 没有消息就是好消息,输完没有提示说明输入是正确的
  git config --global user.name "Mrr-cxh"
  git config --global user.email "1361091680@qq.com"

3.当前我们要提交的这个目录(testDemo)叫做本地磁盘路径,在git中叫做工作区
  git init 在本地进行初始化(建立暂存区)
  .git 文件存储当前项目的所有版本信息

4.工作区 => 暂存区
  git add 文件名
  git add *  提交所有文件
  git commit -m "代码提交信息"

5. 查看当前工作区的状态
  git status

6.从暂存区恢复文件到工作区
  git checkout 文件.后缀

7. 查看工作区和暂存区版本的区别
  git diff <source_branch><target_branch>

8. clear 清屏操作

9. git log 查看已经提交到暂存区的历史版本

10. 恢复文件到指定的某一个版本
  git reset --hard 版本号

11. 从暂存区将数据提到远程仓库,需要先授权
  生成SSH密匙
  ssh-keygen -t rsa -C "你GitHub的邮箱地址"

windows 查找文件:我的电脑-用户-用户名文件夹-.ssh(隐藏文件)-xxx.pub(存有密匙)

12.Github账户配置密匙

13.暂存区 => 远程仓库
  git remote add origin "https://github.com/Mrr-cxh/TestDemo.git":如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,可以使用这个命令
  git push origin master:执行这个命令可以将改动提交到远端仓库,可以将master换成你想要推送的任意分支
  [注] 提交过程,可能需要你输入用户名,密码

14. git clone
  从远程仓库,克隆项目到本地

15. git pull origin <branch>
  从远程仓库同步本地代码(将更新你的本地仓库至最新版)
  以在你的工作目录中 `获取(fetch)` 并 `合并(merge)` 远端的改动

16. git checkout -b feature_x
  创建一个feature_x的分支,并切换过去。

17. git checkout master
  切换到主分支

18. git checkout -d feature_x
  把feature_x分支删除掉

19. git merge <branch>
  要合并其他分支到你的分支(例如master),执行:git merge master
  在这两种情况下(git pull和git merge),git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能会出现冲突(conflicts)。这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
  git add <filename>

20. 替换本地改动
  例如你操作失误,你可以使用如下命令替换掉本地改动:
  git checkout --<filename>
  此命令会使用HEAD中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
  假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地分支指向它:
  git fetch origin:git fetch相当于是从远程获取最新版本到本地,不会自动merge
  git reset --hard origin/master

# 使用本地的 git 工具操作 github

# 1. 网上创建好了有内容的仓库,本地去更新

  • 将远端的仓库克隆到本地 使用 git clone 地址 命令,仓库不能嵌套

    • 远端地址分为两种 1.http 地址 2.ssh 地址
  • 在克隆好的项目中更新一个 Index.html (想更新什么更新什么,这里只是举例)

  • 将做好的更新提交到远端

    • 进入到仓库中打开命令行执行 git add .(点) (将对仓库的更新让远端记录) . 代表所有更改 (一般都写.),可以换成文件名 git add index.html

    • 执行 git commit -m'更新信息' 更新信息,更新的信息指的就是这次的更新标题,将已经被记录的修改制作成一个版本并添加版本留言

      • 第一次执行这个命令会失败,会提示 please tell me who you are?..
      • 按照提示告诉远端你是谁 1. 执行 git config --global user.email'你的邮箱' 2. 执行 git config --global user.name'你的名称'
    • 重新执行 git commit -m'更新信息' 命令

    • 执行 git push 命令,弹出用户密码弹窗,输入正确的用户名密码

  • 如果再次更新的话直接执行 git 三步 add commit 和 push 即可

# 2. 网上创建好空仓库,将本地的项目更新到网上

  • 网上创建空仓库,空仓库什么都不用写,起个名字就可以 (仓库名称最好与本地的项目名相同)

  • 准备好本地的项目 (文件夹,最好和网上的仓库名称重名)

  • 在本地的项目根目录内打开命令行工具,将本地的项目制作成 git 仓库,执行 git init

  • 初始化空仓库之后,将本地项目的所有修改,让远端记录执行 git add .

  • 将此次记录制作成版本 执行 git commit -m'修改信息'

  • 将分支强制重命名成 main 默认创建的叫 master 执行 git branch -M main (不是很主要 main 和 master 差不多)

  • 由于本地的仓库没有远端的地址,所以需要添加一个远端地址,执行 git remote add origin 你的仓库地址

  • 将本地的内容提交到远端,由于是第一次和远端交互,提交的时候需要带 地址 和 分支,执行 git push -u origin main

  • 如果再次更新的话直接执行 git 三步 add commit 和 push 即可

# 3. 添加 ssh 密钥

  • 在任意位置打开命令行工具,执行 ssh-keygen 创建密钥。会生成公钥和私钥

  • 在默认生成密钥的位置,找到公钥并复制,依次执行 cd ~/.ssh 和 cat id_rsa.pub

  • 将公钥复制

  • 去 github 网站新建一个 ssh (用户下边的 settings -> SSH and GPG keys -> new SSH key),每个系统有一个 ssh 密钥

  • 以后下载上传更新仓库直接可以使用 ssh 地址,就不需要输入密码了

  • 将原来的文件夹删除掉,执行下边操作,会发现文件克隆回来了

    git clone git@github.com:Mrr-cxh/0403_test.git (去 github 网站的 code 选项卡下复制 ssh 地址)
    然后回到下载回来的文件夹,修改操作 (新建一个文件 然后执行 git add. git commit -m’更新信息’ git push)

# 4. 两个用户操作同一个仓库下的同一个分支 main

网上操作当成一个用户,本地的操作当成一个用户

  • 情况一

    • 网上的 小 a 同事,更新了自己的代码功能 (和小 b 操作的不是同一个文件)

    • 本地的小 b,工作做完了也要更新自己的代码,但是小 b 提交 (push) 的时候失败了,提示远端包含本地不存在的工作,不允许提交

      • 只要本地和远端地址不一致,就不允许上传
    • 需要将本地不存在的远端版本拉取下来,执行 git pull ,

      • 因为网上的版本和本地的不冲突,会自动合并一个版本,弹出一个编辑器让你提交版本留言,不需要填写,直接 shift+z+z 保存并退出
    • 然后直接执行 git push 上传更新小 b 的工作,并不需要 add commit 等。

  • 情况二

    • 网上的 小 a 同事,对 index.html 进行更新,并上传

    • 本地的小 b,工作做完了也要更新自己的代码,也是修改了 index.html, 然后上传的时候依然上传失败,也会提示远端存在本地不存在的版本,需要执行 git pull 拉取远端更新,但是这次 GitHub 并不会自动帮你合并版本,而是需要你解决冲突之后 (在修改的文件中选择对应的选项卡),自己制作合并之后的版本上传 (git add . git commit -m’更新信息’ git push)

# 5.git 分支

一个 git 仓库可以拥有多个分支,默认只有一个 main (主) 分支,所有的内容都是放在了 main 分支下

  • 网上创建好带 readme.md 的仓库,使用 ssh 克隆到本地 (其实就是克隆了 main 分支的内容)

  • 在本地的仓库内打开命令行,创建一个新的分支,执行 git branch 分支名 ,这步操作只是在本地的仓库新建了一个分支。可以使用 git branch 查看本地仓库的所有分支,带星号的是当前所处分支。创建好的分支,默认里面的内容和当前分支完全一样

  • 使用 git checkout 分支名 切换到对应分支,分支切换的时候文件夹会自动变换成对应分支的内容,文件夹只能显示一个分支

    • 可以使用 git checkout -b 分支名 新建分支并切换
  • 在分支的文件夹下新增 index.html 并使用 git 三步上传,因为远端不存在新建的分支,需要使用 git push --set-upstream origin 分支名 上传

  • 如果新创建的分支里边什么也没有,想把这个分支上传到远端直接执行 git push --set-upstream origin 分支名

# 6. 特殊的分支 gh-pages, 是 GitHub 提供的免费服务器

当新建的分支名是 gh-pages 的时候,这个分支下的所有内容都会部署在 (github)用户名.github.io/仓库名 地址下,默认会访问 index.html

# 7. 分支的团队合作

一个人一个分支

  • 分支的工作互不干扰 (比较少见)

    • 网上新建一个和本地项目重名的仓库

    • 本地新建 vue 项目,删除 .git 文件夹

      • vue 项目创建的时候自带 .gitignore 文件,该文件是 git 忽略上传文件,该文件内写的所有内容都会被忽略上传。
    • 进入到项目中打开命令行,制作成仓库并上传 (按照 2. 空仓库的操作执行)。创建多个分支,并上传。分支创建的时候不需要做修改

    • 同事 a 切换到 a 分支运行项目,并且开始执行任务。做完之后上传

    • 同事 b 切换到 b 分支运行项目,并且开始执行任务。做完之后上传

    • 工作做好之后需要合并分支,也就是将 a b 分支的更新全部合并到 main 分支,切换到 main 分支执行 git merge 分支名 ,将对应分支的修改合并到 main 分支。然后直接执行 git push 将合并好的更新提交到远端

      • 有些时候 merge 合并会失败,提示你解决冲突然后做版本 (git 三步) 上传
    • 上面的分支操作流程 a 和 b 彼此不知道做了哪些更新 (不是很好)

    • 当 a 开始工作的时候,需要知道整个项目的进度,那就需要拉取 main 的更新,切换到 a 分支,执行拉取 main 分支的命令 git pull origin main

  • 开始工作之前,先要知道整个项目进度

    • 网上新建一个和本地项目重名的仓库

    • 本地新建 vue 项目,删除 .git 文件夹

      • vue 项目创建的时候自带 .gitignore 文件,该文件是 git 忽略上传文件,该文件内写的所有内容都会被忽略上传。
    • 进入到项目中打开命令行,制作成仓库并上传 (按照 2. 空仓库的操作执行)。创建多个分支,并上传。分支创建的时候不需要做修改

  • 同事 a 切换到 aaa 分支运行项目,并且开始执行任务。做完之后上传 (git 三步)

  • 切换到分支 main 合并刚才 aaa 分支的更新 git merge 分支名 ,然后上传 git push

  • 切换到 bbb 分支,需要先拉取 main 的更新 git pull origin main ,然后开始工作,上传更新 bbb 分支 (git 三步)

  • 切换到 main 分支,合并 bbb 分支的更新 git merge bbb ,然后上传 git push

# 8.vue 部署

因为都是单页面应用,如果用了路由的话,分两种情况。
情况一:使用路由的 hash 模式

  • 将 mode 改成 hash
  • 如果部署的服务器地址是带路径的,比如 https://<USERNAME>.github.io/<REPO>/ ,就是要部署到 GitHub 的 gh-pages。需要给 vue 项目添加一个 publicPath 配置
    • 在项目根目录新建 vue.confing.js,这个文件是 vue 的配置文件,会自动和项目原配置合并
    • 根据服务器地址修改对应的 publicPath
  • 重启项目,保证本地运行项目没问题
  • 打包成品到本地 执行 npm run build
  • npm i -g serve 能够在本地搭载一个小型服务器 (没下载 serve 需要下载 serve)
  • 在 dist 文件夹下起一个本地服务,项目可以正常运行
  • 将 dist 文件夹的所有内容 serve . 挂载到服务器上
  • 上传完毕后,直接使用服务器网址访问即可

情况二:使用路由的 history 模式,此模式的时候必须对部署的服务器进行部署,所有地址全部指向根目录的 index.html

# 9.GitHub 部署 vue 项目的时候借助 gh-pages 工具包,自动更新 gh-pages 分支

  • 项目内安装 gh-pages 包 npm i gh-pages --save-dev
  • 在 package.json scripts 字段添加一个 deploy 如下所示,作用是将项目根目录内下的 dist 内的所有内容上传到 gh-pages 分支
    "scripts": {
      "serve": "vue-cli-service serve",
      "build": "vue-cli-service build",
      "lint": "vue-cli-service lint",
      "deploy": "gh-pages -d dist"
    },
  • 对你的项目进行本地更新,打包编译 npm run build
  • 将对项目修改的源码更新到 main 分支 (git 三连)
  • 直接可以使用 npm run deploy 自动更新 gh-pages , 在 main 中运行

文章作者: Mrr-cxh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mrr-cxh !
赏
 上一篇
Webpack Webpack
本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图对应映射到项目所需的每个模块,并生成一个或多个 bundle。
2021-04-08
下一篇 
Js深入-变量对象 Js深入-变量对象
本文详细阐述 JavaScript 的变量对象。JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
  目录