>[success] # GIT 远程仓库
1. 常见的一些 远程仓库 `GitHub ` `Gitee ` `GitLab ` `自己搭建`
2. 远程仓库一般都会进行会对我们的**身份进行验证**,目前Git服务器验证手段主要有两种
* 基于**HTTP的凭证存储**,因为本身HTTP协议是无状态的连接,所以每一个连接都需要用户名和密码,为了减少这种登录操作git也提供了**一个凭证系统来处理**,使用`git config credential.helper` 查看使用那种方式具体方式如下

1. 默认所有都不缓存。 每一次连接都会询问你的用户名和密码
2. “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除
~~~
git config --global credential.helper cache
~~~
3. “store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
4. 使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中(加密的);
5. 使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具查看 **控制面板=>用户账户=>凭据管理器=>windows凭据**,这就是为什么在第一拉取代码或者提交时候会弹出登录输入用户名密码

* 保存后

*****
* 基于**SSH的密钥**,Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境,**SSH以非对称加密实现身份验证**
1. 是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录
2. 是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录
**原理**:公钥需要放在待访问的电脑之中(远程服务器),而对应的私钥需要由用户自行保管
* **生成密钥(可以在多个不同的仓库使用,并不一定要1队1)**两种形式 `ssh-keygen -t ed25519 -C “your email"` /` ssh-keygen -t rsa -b 2048 -C “your email"`

* 码云为例将公钥贴到

* **注 git连接HTTPS切换成ssh秘钥连接**
~~~
git remote -v //看一下当前连接方式
git remote set-url origin git@github.com:someaccount/someproject.git //改成ssh,这里你项目的ssh地址
git remote -v //再查看一下,url是否已经变成了ssh地址
~~~
>[danger] ##### 解决 GitHub 443
不管你用哪个代码管理平台,如果遇到 `443 Timeout `问题,试试 `ssh `协议
>[info] ## 管理远程
1. 如果此时在本地创建了一个本地git仓库也就是 `git init`。想配置对应远程仓库,使用`git remote`
* 先初始胡一个本地仓库,查询其是否连接远程 `git remote -v`(下图空没有连接的远程)

* `git remote add <shortname> <url>` 增加远程仓库(一个项目可以有多个远程仓库,因此可以多个add 添加) `git remote add origin git@gitee.xxx/xxx.git` ,`origin` 为远程仓库名,就可以将初始化仓库和远程连接
* 拉取时候`git pull origin master` ,`origin master` origin远程仓库的master 分支拉取代码,每次这样执行比较麻烦,因此
1. 通过当**前分支**和**远程分支进行跟踪**,`git branch --set-upstream-to=origin/远程分支名 本地分支名`

2. 在通过 `git fetch` 获取代码
3. 执行 `git merge` 将远程获取的代码和本地合并,从2.9 开始如果直接执行合并如果报错**fatal: refusing to merge unrelated histories**
* 报错原因:我们将两个不相干的分支进行了合并,[参考链接](https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories-on-rebase)

* **解决**:过去git merge允许将两个没有共同基础的分支进行合并,这导致了一个后果:新创建的项目可能被一个毫不怀疑的维护者合并了很多没有必要的历史,到一个已经存在的项目中,目前这个命令已经被纠正,但是我们依然可以通过`--allow-unrelated-histories`选项来逃逸这个限制,来合并两个独立的项目

接下来可以直接 `git pull` 使用了
[sourceTree push 失败](https://wenku.baidu.com/view/f0588c5ef142336c1eb91a37f111f18583d00ccf.html?_wkts_=1668262845416&bdQuery=sourceTree+%E9%80%9A%E8%BF%87%E5%AF%86%E9%92%A5%E8%AE%A4%E8%AF%81%E5%A4%B1%E8%B4%A5)
*****
**关于 remote 其他指令**
* 重命名远程地址:`git remote rename gitlab glab`
* 移除远程地址:`git remote remove gitlab`
>[danger] ##### 本地仓库连接多远程仓库
1. 一个本地仓库可以对接多个远程仓库,在使用`git remote add <shortname> <url>`,`shortname` 为远程仓库别名可以理解为,`url` 实际远程仓库地址
* 对接了两个远程仓库别名分别为 `origin` 和 `origin1`

* 通过指令查看 `git remote -v`

**可以解决的问题**,当项目使用第三方框架时候,或者项目主体框架为,时候当框架升级,其他业务想同步就可以使用 次方法发将另一个仓库代码拉取下来
*****
**以vben(vue3前端框架) 官方给的例子**
如果你使用了该项目进行项目开发。开发之中想同步最新的代码。你可以设置多个源的方式
1. 克隆代码
~~~
git clone https://github.com/vbenjs/vben-admin-thin-next.git
~~~
2. 添加自己的公司 git 源地址
~~~
# up 为源名称,可以随意设置
# gitUrl为开源最新代码
git remote add up gitUrl;
~~~
3. 提交代码到自己公司 git
~~~
# 提交代码到自己公司
# main为分支名 需要自行根据情况修改
git push up main
# 同步公司的代码
# main为分支名 需要自行根据情况修改
git pull up main
~~~
4. 如何同步开源最新代码
~~~
git pull origin main
~~~
>[danger] ##### 全新仓库搭建
* 方案一:
创建远程仓库,`git clone xxx`
* 方案二:
`git remote add orgin xxxx`
`git branch --set-upstream-to=origin/远程分支名 本地分支名`
`git fetch`
`git merge --allow-unrelated-histories`
