准备工作
集中式和分布式版本管理
CVS 和 SVN 属于集中式版本管理
Git 属于分布式版本管理
区别:
-
集中式管理是把整个仓库放到服务器
-
分布式管理是每台电脑都有一个对应的仓库,可以在本地提交,然后再同步到服务器的仓库
优缺点:
-
集中式管理的服务器如果崩了,那么服务器的文件就没了
-
分布式管理的服务器如果崩了,那么可以用本地的仓库推送到另一台服务器,所以说本地仓库就是远程仓库的一个备份
全局配置
提交信息
安装Git后,要做的第一件事就是配置用户提交的信息,即设置你的用户名和邮件地址
-
这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改
-
如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用这些信息
配置目录文件:.gitconfig 或 C:\Users\Vincent\.gitconfig 文件
查看配置信息:
提示:如果命令行配置的方式有问题,可以直接打开配置文件配置
命令别名
VSCode配置Git终端
https://www.jianshu.com/p/494115f98492
远程仓库的交互
获取Git仓库
有两种方式获取:
-
创建本地仓库:git init
-
克隆远程仓库:git clone
提交到Git仓库
git add .
开始跟踪文件,添加到暂存区git commit -m "xxx"
文件提交到 Git 仓库
简化写法:git commit -a -m “xxx” (只对修改文件有效)
如果修改已跟踪的文件需要重新添加到暂存区
文件状态划分
- 未跟踪:默认情况下,Git 仓库下的文件也没有添加到 Git 仓库管理中,我们需要通过 add 命令来操作
- 已跟踪:添加到 Git 仓库管理的文件处于已跟踪状态, Git 可以对其进行各种跟踪管理
- stage:暂缓区中的文件状态
- unmodified:commit 命令,可以将 staged 中文件提交到 Git 仓库
- modified:修改了某个文件后,会处于 modified 状态
untracked:未跟踪状态
检测文件状态
git status 查看文件状态
git status -s 查看简洁的信息
查看提交历史
通过 git log 可以查看所有的提交历史
简化写法:git log --pretty=oneline | git log --pretty=oneline --graph
忽略文件
.gitignore
在实际开发中,这个文件通常不需要手动创建,脚手架会帮你生成并配好,在必要的时候添加需要忽略的内容即可
.DS_Store # mac系统里面会自动生 产的文件
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
校验和
提交的唯一标识(commit id)
根据标识查找提交的文件
版本退回
Git 通过 HEAD 指针记录当前版本,我们可以通过 HEAD 来改变 Git 目前的版本指向:
- 上一个版本就是HEAD^,上上一个版本就是HEAD^^
- 如果是上1000个版本,网民可以使用HEAD~1000
- 我们可以指定某一个commit id(校验和)
git reset --hard HEAD^
git reset --hard HEAD~1000 # ~后加回退数字
git reset --hard 2d44982 # 校验和选前7位即可
如果反悔了,可以通过 reflog 查看操作历史,找到要回退版本的校验和,然后回退即可
远程仓库连接
什么是远程仓库?
远程仓库(Remote Respository)
之前的操作都是基于本地仓库,别人无法拿到,要想别人拿到就得把代码共享到远程仓库
我们可以通过第三方的Git服务器,比如:Github,Gitee,Gitlab等,来搭建我们的 Git 服务
Gitee 和 GitLab 公司采用的比较多,而 GitHub 一般用来做开源项目,协议一般用MIT
创建远程仓库
远程仓库验证
对于私有仓库的操作需要对身份进行验证,共有两种方式:
- 基于HTTP的凭证存储
- 基于SSH的密钥
凭证
因为HTTP是无状态的,所以每次对远程仓库的操作都需要登录
为了避免每次都要登录,可以安装一个 Git Credential Manager for Windows 的辅助工具(默认会安装),它会管理你的凭证,自动帮你验证用户名和密码
通过下面代码可以查看是否安装:
然后就可以克隆,首次操作远程仓库会让你登录,后面就不会了
提交代码到远程仓库:
然后push就不需要你登录了
然后回到远程仓库刷新查看,发现文件已经更新了
删除凭证:
SSH密钥
Secure Sehll(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境
SSH以非对称加密实现身份验证
对称加密和解密的密钥都一致的,非对称加密用私钥,解密永公钥,安全性更高
首先生成公钥和私钥:
# -t 类型:加密类型 -C 注释:你的邮箱
ssh-keygen -t ed25519 -C "your email"
ssh-keygen -t rsa -b 2048 -C "your email" # 老的加密类型
打开公钥文件复制里面的内容
然后就可以克隆了
提交代码到远程仓库:
问题的处理
设置上游分支(跟踪分支)
目的是让本地分支和远程分支建立连接,每次在push/merge/pull时不用指定远程仓库分支,它会默认匹配上游分支
git fetch # 注意:要先fetch一下,获取远程有哪些分支
git branch --set-upstream-to=origin/main
合并没有共同base分支
本地分支和远程分支即没有共同的祖先,祖先就是上一个版本(commit对象)
git merge --allow-unrelated-histories
push时存在的问题
这个问题只出现在:本地分支的名字和远程分支的名字不一样,比如github,gitlab的主分支是main,而本地的是master
现在的问题是:就算你给master分支设置了上游分支(origin/main),当你push的时候,默认还是推送的是当前分支(origin/matser),这是因为push的默认配置是simple,而simple就是当前是什么分支,远程仓库就推送什么分支,此时可以修改push的配置为upstream,它可以把上游分支推送给远程分支
# 解决方法一(推荐)
git config push.default upstream # 默认是simple,推送的远程分支是当前分支;upstream推送的远程分支是上游分支
# 解决方法二
git checkout --track origin/main
git checkout main
GitHub/GitLab创建远程仓库
# 初始化本地仓库
git init
# 添加远程仓库
git remote add origin xxxx
# 从远程仓库获取内容
git fetch
git branch --set-upstream-to=origin/main
git merge --allow-unrelated-histories
# git push
git config push.default upstream
# 换一种做法
git checkout main
标签的使用
理解: 你在哪个版本设置,它就停留在哪个版本
# 创建标签
git tag v1.0.0
git tag -a v1.0.0 -m "附注标签"
# 查看标签
git tag
# 删除标签
git tag -d v1.0.0
# 将本地tag push远程仓库
git push origin v1.0.0 # 推送指定标签
git push origin --tags # 推送所有标签
# 删除远程的tag
git push origin -d v1.0.0
分支的使用
理解:分支就相当于是一个文件夹,它总是指向最后一个版本,它会随着你版本的推送而移动
本地分支的使用
创建分支
git branch testing
git checkout testing
# 合并
git checkout -b testing
合并分支
git merge testing # 默认与当前分支合并
git add .
git commit -m ""
查看所有的分支
git branch
删除本地分支
git branch -d testing
远程分支的操作
# 初始化本地仓库
git init
# 添加远程仓库
git remote add origin xxxx
# 从远程仓库获取内容
git fetch
git branch --set-upstream-to=origin/main
git merge --allow-unrelated-histories
# git push
git config push.default upstream
# 换一种做法
git checkout main
推送一个远程分支:
git push origin develop
# 李四操作
git checkout develop
删除远程分支
git push origin -d develop
rebase
和merge功能类似,区别是它可以让提交历史结构更简洁,merge会记录所有提交历史,结构比较复杂
黄金法则:一定不要在主分支上使用rebase
git checkout experiment # 切换到要合并的分支
git rebase master # 合并后,提交了历史的图结构就成线性
工作流
- master:作为主分支;
- develop:作为开发分支,并且有稳定版本时,合并到master分支中;
- topic:作为某一个主题或者功能或者特性的分支进行开发,开发完成后合并到develop分支中;
- master: 记录主要的版本
- tag
- hotfix: 热修复
- merge master
- merge develop
- develop: 开发分支
- release: 上线的分支
- merge master
- merge develop
- feature: 新特性
Git中常见的命令总结
已有的项目
基础的命令 (必须掌握)
- git clone xxx
- git add .
- git commit -m “xxx”
- git pull => git fetch + git merge(拿到最新的代码)
- git push
进阶的命令
- main
- develop
- feature
git checkout develop
# 1.检查服务器是否有origin/develop这个分支
# 2.创建一个本地的develop分支
# 3.让本地的develop分支自动跟踪origin/develop
# 4.切换到develop分支
git add .
git commit -m ""
git pull
git push
高级的命令
git tag
git checkout -b develop
git push origin develop
git merge develop
git rebase
全新的项目
仓库在远程初始化
克隆远程仓库搭建项目
- 在clone下来的文件夹中搭建整个项目
- git add .
- git commit -m “初始化项目”
- git push
本地仓库和远程仓库合并
-
搭建项目
git add .
git commit -m “初始化项目”
-
连接远程仓库
如果你是本地创建的仓库,那么你需要和远程仓库建立连接
# 仓库名称 仓库地址 git remote add origin https://gitee.com/vincentgzxGZX/git-demo.git git remote remove origin # 断开仓库连接 git remote # 查看仓库连接 git remote -v
-
设置上游分支
git branch --set-upstream-to=origin/master # origin/main
-
拉取仓库
git fetch
-
允许合并没有共同base分支
git merge --allow-unrelated-histories
-
合并仓库
git pull origin master --allow-unrelated-histories
-
修改push的默认属性(可忽略,在本地分支和远程分支不一致时使用)
git config push.default upstream
-
推送远程仓库
git push
仓库在本地初始化
打开vue项目远程来接远程仓库,直接push就可以了