>[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`