# 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 中运行