1. 远程仓库
步骤:
1.注册第三方托管平台网站账号
2.新建仓库得到远程仓库 Git 地址
3.本地 Git 仓库添加远程仓库原点地址
命令:git remote add 远程仓库别名 远程仓库地址
例如:git remote add origin https://gitee.com/lidongxu/work.git
4.本地 Git 仓库推送版本记录到远程仓库
命令:git push -u 远程仓库别名 本地和远程分支名
例如:git push -u origin master
完整写法:git push --set-upstream origin master:master
HTTP协议凭证
因为本身HTTP协议是无状态的连接,所以每一个连接都需要用户名和密码:
如果每次都这样操作,那么会非常麻烦;
幸运的是,Git 拥有一个凭证系统来处理这个事情;
下面有一些 Git Crediential 的选项:
选项一:默认所有都不缓存。 每一次连接都会询问你的用户名和密码;
选项二:“cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除;
选项三:“store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
选项四:如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中(加密的);
选项五:如果你使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具;
✓ 可以在 https://github.com/Microsoft/Git-Credential-Manager-for-Windows 下载。(在安装 git 时有一个选项,勾选即可安装)
2. SSH 配置和克隆仓库
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
SSH以非对称加密实现身份验证。
- 例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;
- 另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录;
- 公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管;
ssh-keygen -t rsa -C "xxx@qq.com"
回车后出现以下内容,直接回车:
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): (按回车键)
Enter passphrase (empty for no passphrase): (按回车键)
Enter same passphrase again: (按回车键)
这样密钥文件就生成了,默认在用户目录下,如:C:\User\xxx.ssh\ 这个文件夹中。其中的xxx是你的windows用户名。
然后将公钥添加到 github 中。
在C:\user\xxx.ssh\文件夹中找到id_rsa.pub这个文件,用文本编辑器(如记事本)打开,复制里面的所有内容。
登陆 github 账号,点击settings-SSH and GPG keys-New SSH key,在 Title 中取一个名字(任意),key 中粘贴你刚刚复制的内容。然后点击 Add SSH key 即可。
然后进入本地的 C:\Windows\System32\drivers\etc ,host文件配置域名解析,140.82.112.3 github.com
然后测试是否成功。
ssh -T git@github.com
出现以下结果即为成功。
Hi Shelden-Hao! You've successfully authenticated, but GitHub does not provide shell access.
如果还没连通看看是否设置了代理,通过以下命令去取消就可以了(如果没有使用代理的话):
git config --global --unset http.proxy
git config --global --unset https.proxy
然后就可以克隆仓库。
git clone git@github.com:Shelden-Hao/js-learning.git
进行 add 和 commit ,但是,这两条都是对本地仓库的操作。将更新内容对远程仓库生效还需要其他操作。更新推动内容和拉取推送内容。
git push <remote> <branch>
git pull <remote>
比如:
git pull origin main:main
省略默认拉取仓库别名为 origin 的 main 分支。
3. 关联本地仓库和远程仓库
添加远程地址:我们也可以继续添加(多个)远程服务器(让本地的仓库和远程服务器仓库建立连接),比如这里我让远程仓库名字为 origin 。
重命名远程地址:git remote rename gitlab glab
移除远程地址: git remote remove gitlab
git remote add <shortname> <url>
git remote add origin git@github.com:Shelden-Hao/js-learning.git // 从本地关联远程仓库
git remote -v // 查看关联的远程仓库
然后。
git push --set-upstream origin master
因为本地存在分支 master,而远程仓库名 origin,存在 master 分支,但是无法进行分支对应,所以需要设置一个上游分支(跟踪分支 upstream)。在进行分支 pull 或者 push。
其他写法:
git branch --set-upstream-to=origin/master // 创建上游分支
git branch --track dev origin/master // 创建跟踪分支
◼ 从远程仓库clone代码:将存储库克隆到新创建的目录中;
◼ 将代码push到远程仓库:将本地仓库的代码推送到远程仓库中;
默认情况下是将当前分支(比如master)push到origin远程仓库的;
git clone http://152.136.185.210:7888/coderwhy/gitremotedemo.git
git push
git push origin master
◼ 从远程仓库fetch代码:从远程仓库获取最新的代码
默认情况下是从origin中获取代码;
获取到代码后默认并没有合并到本地仓库,我们需要通过merge来合并;
git fetch
git fetch origin master
git merge
git merge origin/master // 注意写法的不同
◼ 从远程仓库pull代码:上面的两次操作有点繁琐,我们可以通过一个命令来操作远程仓库的交互
git pull
git fetch + git merge(rebase)
这里可能遇到一些问题:
There is no tracking information for the current branch.
原因:当前分支没有和远程的origin/master分支进行跟踪
- 在没有跟踪的情况下,我们直接执行pull操作的时候必须指定从哪一个远程仓库中的哪一个分支中获取内容;
解决方法就是设置上游分支(或者跟踪分支)。
refusing to merge unrelated histories
过去git merge允许将两个没有共同基础的分支进行合并,这导致了一个后果:新创建的项目可能被一个毫不怀疑的维护者合并了很多没有必要的历史,到一个已经存在的项目中,目前这个命令已经被纠正,但是我们依然可以通过–allow-unrelated-histories选项来逃逸这个限制,来合并两个独立的项目;
解决方法:
git merge --allow-unrelated-histories
The current branch dev has no upstream branch.
在一个分支下,如没有创建上游分支,那么不可以 push 。
解决方法可以使用
// 当前分支:远程分支
git push origin dev:main
// 或者是 head 指向当前分支
git push origin head:main
// 或者直接将 upstream/current(当前分支) 设置为默认
// 当前本地git会 push 到远程的 upstream
git config push.default upstream
// 当前本地的git 会 push 到远程同名的分支下(相当于还是上面报错的操作
,只不过不会报错了而已)
git config push.default current
4. gitee 和 gitlab 的使用
gitee 的使用和 github 的使用几乎一致。
gitlab 主要用于私有化部署。
5. VS Code 中的 Git
改变文件内容后。
第一个图标表示打开文件。
第二个图标表示放弃更改。
第三个图标表示添加到暂存区。
最后一个图标表示更改的状态。相当于 git status
。
然后进行添加文件。
commit 提交到本地仓库。
Sync Changes 同步更新,提交到远程仓库。
6. 分支
本质上是指向提交节点的可变指针,默认名字是 master
注意:HEAD 指针影响工作区/暂存区的代码状态
git branch // 查看分支列表
git branch branch-name // 创建分支
git checkout branch-name // 切换分支(默认)或者恢复文件
git switch branch-name // 切换分支(推荐)
git merge branch-name // 合并分支 branch-name 到目前分支下(一般为master)
git branch -d branch-name // 删除分支(已合并)
git branch -D branch-name // 删除分支(未合并)
分支合并后仍然存在,需要手动删除。
6.1 解决合并冲突
不同分支中,对同一个文件的同一部分修改,Git 无法干净的合并,产生合并冲突。
git diff // 查看冲突的具体内容
解决:
1.打开 VSCode 找到冲突文件并手动解决
2.解决后需要提交一次记录
7. 多人协同开发
需求:小传新代码共享给小智
步骤:
1.小传开发代码 -> 工作区 -> 暂存区 -> 提交 -> 拉取(可选)-> 推送
2.小智 -> 拉取(后续也可以开发代码 -> … -> 推送)
3.想要看到别人同步上去的最新内容:git pull origin master 等价于
git fetch origin master:master(获取远程分支记录到本地,未合并)
git merge origin/master (把远程分支记录合并到所在分支下)