[原文链接:Link] 转载请注明原作者
🧩 Remote:代码托管中心
Git 系统(本地库)其实本身就是一个分布式的 VCS 了,但若有个能够远程托管和维护代码的地方(远程库),协同工作也能更高效。所以本篇内容的前提是默认你已经注册了 Github 账号。
其中,代码托管中心分两大类:(局域网中协同工作,广域网中协同工作)
🌇 托管环境
✨ 局域网环境中
- GitLab
✨ 广域网环境中
- GitHub
- Gitee (码云)
此外,本地库与远程库的交互方式也分两类:
⛵ 协作模式
✨ 团队内部协同工作
✨ 跨团队协同合作
🔬 remote 的基础操作
粗略总结,远程库的操作分为两个阶段:
🚧 一:想要将本地库关联上远程中心,需要如下指令:
- 🧲
$ git remote
🚧 二:成功 remote 后,经过上面两个工作流程图示,演示了下列操作:
主要内容(团队内合作必掌握)
- ⏬pull,拉操作 = (pull = fetch + merge)(默认不包括tags)
- ⏬fetch 获取 = 下载远程代码
- ⏫push,推操作
次要内容(跨团队合作必掌握)
⏬clone,克隆全部 Github Repo 内容到本地目录 (包括tags)
🔱fork,(从库外部)开库的分叉的操作
(注意:fork 不是git指令!其操作 全部内容、操作 仅在 Github 中进行)
- ⏯️pull request :发起拉请求
将 一、二 详细来讲,就是:
🧲 一、remote 指令
-
本质:
- 在你的本地库中指明它所对应的在线库位置(Github地址)
-
位置:
- remote 信息存储于 ./.git/config 中
-
结构:
- remote name (或称 alias): 唯一的 “远程仓库代号” ,如 origin
- remote url: push 时推到的地址,就是你的 Github 在线仓库
- remote fetch:默认生成的用于 fetch 的数据
-
应用(CURD):
- 添加:
$ git remote add origin https://github.com/yourname/yourrepo.git
- add 参数的额外子参数:
-f
:关联后立即额外运行一条$ git fetch <name>
指令--tags
:此 remote 在 fetch 时从 Github Repo 中导入全部 tags
- 查询:
- 查看全局 reomte 状态:
$ git remote --verbose
(verbose: adj.详尽的)$ git remote -v
- 查看某个 remote 详细信息:
$ git remote show <remoteName>
- 查看全局 reomte 状态:
- 更改:
- 更改 remote 名:
$ git remote rename <oldName> <newName>
- 更改 remote url:
$ git remote set-url <remoteName> <newUrl>
- 更改 remote 名:
- 删除:
$ git remote remove <remoteName>
$ git remote rm <remoteName>
- 添加:
-
注意:
-
若你选择 HTTP 的 remote 方式:
- 第一次 remote 操作,不能直接修改并 push,需要输入一次 github 账号 / 密码 才能顺利 push。
- 其中 win 10 会自动保存 HTTP remote 的 github 账户密码,若想更改账号,详情见本文第三部分。
-
若你选择 SSH 的 remote 方式:
-
第一次 remote 操作,不能直接修改并 push,需要额外验证一次 SSH 才能有权上传代码:
-
配置验证信息 - 保姆式教学:Link
-
粗略笔记(关于 SSH 初始化 key 与重置 key)
-
进入 HOME (~)
$ cd ~
-
删除本地旧的 .ssh 目录
$ rm -rvf .ssh
-
运行命令生成 .ssh 密钥目录
$ ssh-keygen -t rsa -C <你的github注册邮箱>
-
进入 .ssh 目录查看后续需求文件
$ cd ~/.ssh
$ ls -IF
-
查看 id_rsa.pub 文件内容
$ cat if_rsa.pub
-
复制 id_rsa.pub 文件内容,登录 Github,点击用户头像,Settings,SSH and GPG Keys,New SSH Key,输入刚才复制的密钥信息
-
回到 Git bash 去 add remote
$ git remote add origin_ssh <你项目的SSH克隆地址>
-
push!
-
-
-
-
🚧 二、其余远程指令
🧱 主要内容(团队内合作必掌握):fetch,pull,push
⏬ $ git fetch
- 本质:
- download code from Remote to Local Repo (从 remote 下载代码到本地库)
- 样例:
$ git fetch <remoteName>
- 实操:
$ git remote add origin https://github.com/yourname/yourrepo.git
$ git fetch origin
$ git merge origin/master
⏬ $ git pull
-
git pull 本质:
-
用于从 remote 获取代码,并 merge 到本地的 HEAD 指向的 branch 中(默认)
-
至于为什么要多一步 merge, 思考一下:
因为 fetch 只把代码下载到了本地库,工作目录还没有改动!
需要 merge 把本地库的内容统一到 工作目录中!
-
-
git pull 底层:(也是两条指令的组合拳!)
$ git fetch <remoteName>
$ git merge FETCH_HEAD
-
git pull 应用1:
-
$ git remote add origin https://github.com/yourname/yourrepo.git
-
``$ git fetch origin `
-
$ git merge origin/master
等价于:
$ git remote add origin https://github.com/yourname/yourrepo.git
- ``$ git pull origin `
-
-
git pull 应用2:
-
$ git remote add origin https://github.com/yourname/yourrepo.git
-
``$ git fetch origin `
-
$ git merge origin/mybranch
等价于:
$ git remote add origin https://github.com/yourname/yourrepo.git
$ git pull origin mybranch
-
⏫ $ git push
- 本质:
- 将本地的 branch 上传到 remote ,并 merge。
- 一般应用:
$ git push <远程库代号> <本地branch>
$ git push origin master
- 注意:
- 若你不是团队成员,且与团队无关,你只能先 fork,再在本地改完 push 到 fork 的库,再发起 pull request 等待审核才能成功。
- 若你不是团队成员,但未来会被邀请进入团队。那么只有在被邀请后才能顺利 push。
- 若你是项目掌权人(或Owner),你只要 remote 成功,登陆成功,即可顺利 push。
- 特殊情况:
- 本地 branch 与 remote 中的 branch 名称不一致,但内容一致时:
$ git push <远程库代号> <本地branch>:<远程branch>
$ git push origin master:master2
- 下两条内容等价:
$ git push origin master
$ git push origin master:master
- 本地 branch 与 remote 中的 branch 名称不一致,但内容一致时:
🧱 次要内容(跨团队合作必掌握):clone,fork,pull request
⏬ clone 功能拆解
clone (克隆) 的功能是直接从远程 Github 下载代码到本地。
但具体它都做了什么?
- 下载全部代码(全版本)
- 配置好本地的 ./.git/ 目录内容 (remote、branch、config 信息等)
⏬ 从 IDE 自带的 git 管理系统中 clone
高级 IDE 都会内置自己的 VCS 系统,但每个 IDE 内的 clone 操作步骤都有些许不同
以 Eclipse 为例,不同版本的 Eclipse 也有不同的 clone 步骤 (如新版的 Oxygen Eclipse,旧版的 Kepler Eclipse 等)
但具体都是如下内容:
- 新建 project,选择从 git 导入 (import) project
- 配置 URL,配置最初的 branch (一般是master),配置 remote 别名。
- (创建完成后,将 project 的工程格式改为 maven 工程)
注意:
- 旧版的 Kepler Eclipse 有 Bug, git 无法在 workspace 中 clone,只能在 workspace 之外的地方 clone
⏬ fork 与 pull request
fork: 跨团队协作,从 别人github 的 repo 中 fork 全部内容到 自己 github 的一个 新repo 中。
pull request: 在你从 新repo 中 clone 下来代码,改完并 push 回 自己 github 后,即可点击 pull request 的 New pull request 按钮。填入信息后,原作者即可收到你的新代码,并审核。
🚧 三、Github 补充内容
🔐 为什么 Windows 中的 Git Bash 能够记住 github 的登录密码?
git 不自带记住密码功能,
其功能由 windows 10 系统自带:
控制面板 => 所有控制面板项 => 凭据管理器 =>
Windows凭据 => 普通凭据 => git:https//github.com(可在此删除和管理)
↑(如需要切换账号时,从这里入手才能更改)
此外,一些高级 IDE 也实现了对 Github 账户密码的保存功能,如 Eclipse,JetBrains 系列如 IntelliJ IDEA 等。
🕸️ HTTP remote 与 SSH remote 的区别
现在我们已知 Windows 10 系统自带对 github 个人账号密码的凭据保存功能
但若我们的环境不是在 Win 10 系统中,该怎么办?
答案是: github 若是用 HTTP remote,则每次 push 都需要重新输入账号密码。
所以,对比 HTTP remote 与 SSH remote,它们的区别就是:
- SSH remote 可以理解为:自带保存密码功能的公钥
- 而 HTTP remote 需要额外的系统来实现这个功能 (如 Win 10)
所以,SSH 真香。
但 SSH remote 相比于 HTTP remote 有一个缺点:
- 不方便在同一台机器上切换 git 账号密码
但几乎没人会有这个需求(除了教师)
所以,SSH 真香。
🕸️ HTTP remote 与 SSH remote 可以共存吗?
能。
$ git remote add orogin_http URL
$ git remote add origin_ssh URL
此后你在 push 的时候可以选择:
$ git push origin_http master
$ git push origin_ssh master
二者其一。
👩🚀 github 如何添加团队成员?(Add Collaborator)
邀请方:Github - repository界面- settings - manage access - invate a collaborator (后生成一个邀请链接 - 发给合作人)
被邀请方:打开连接,接受邀请
🔬 远程库的 push 冲突 (push rejected)
🕹️ 情况1:正常冲突
两个人A和B,在同一个远程 repo 上 push 代码,
A pull 了v2.3.1367 后开始进行代码工作,
B pull 了v2.3.1367 后开始进行代码工作,
A 写完了,先 push 了 v2.3.1368
B 写完了,后 push,发现存在冲突,push 被拒绝了。
🕹️ 解决方案:直接 pull 就好了
类似
Github入门3 - 分支基础
笔记中的merge冲突的解决方案
。
-
push 时发现冲突后,git会在命令行 (prompt) 提示你需要先 pull 下最新版,再push。
思考:pull = fetch + merge
-
pull 后,prompt 状态由
(branch)
变为(branch | MERGING)
-
working directory 中 conflict files 被添加了如下内容:
a line of a.java before v138
<<<<<<< HEAD
a line of a.java for v138-张三版
**=======**
a line of a.java for v138-李四版
>>>>>>> e25172f2515aabb2754
a line of a.java before v138
- 然后需要你决定需要把这两段内容怎么改:
- 这两行是全留下➕,还是需要继续修改🛠️,或是删掉其中一个✂️?。
- 然后需要你决定需要把这两段内容怎么改:
-
改完后,此时你再 git add, commit, 就彻底 merge 完成!
-
再 push,即可通过(但若是改变别人代码,还是得提前和别人说好)。
☠️ 情况2:多人之间,IDE 不同导致的 push 冲突 (※须知!)
由于各个程序员自己用的 IDE 不同,导致的 push 冲突了 IDE 配置文件。
这个问题很傻,若在公司发生此事,你可能也离被开除不远了。
🕹️ 解决方案1:在 git 中配置 “忽略文件” (Git-Ignore)
✨ 概念
-
区分
工程文件
与特定文件
- 如 Eclipse 中,生成新项目后,会附带生成一堆配置文件,编译文件,如:
- .project
- .classpath
- .settings
- target
- …
- 此外,macbook 系统也会为每个文件夹生成一些隐藏文件来保存文件夹信息,如:
- .DS_store
- **这些文件与代码开发无关,**属于特定文件。
对于 特定文件,不要去让 git 追踪它,要让 git 去忽略它!
- 如 Eclipse 中,生成新项目后,会附带生成一堆配置文件,编译文件,如:
✨ 方式
- 配置一个
MyProject.gitignore
文件,在其中配置好自己想要忽略的文件 - 然后,在
~/.gitconfig
(全局配置)或./.git/config
(独立配置) 中的[core]
字段下: - 添加如下变量:
excludesfile = <MyProject.gitignore文件路径>
- 注意:
- git 解析本地路径方式为:辨别
正斜杠
“/” 而不是反斜杠
“\” (同Linux一致) - 若你写错了,那么路径无法被正确解析!
- git 解析本地路径方式为:辨别
✨ 如何配置.gitignore文件?
Github 为全世界开发者准备好的 各个语言的 gitignore模板地址:
-
若你开发 Java,则找到其中的 Java.gitignore即可
-
但这只是基础模板,你还要根据你的不同 IDE,来自己进行添加过滤。
-
自定义过滤规则:
/mtk/ 过滤工作区目录下的整个mtk文件夹 *.zip 过滤工作区目录下的所有.zip文件 /mtk/do.c 过滤工作区目录下的某个具体文件
-
自定义不过滤的规则:
!src/ 不过滤该文件夹 !*.zip 不过滤所有.zip文件 !/mtk/do.c 不过滤该文件
-
注意:
- IDE 中重置 .gitignore 文件后,一般需要重启 IDE 来加载
-
🕹️ 解决方案2:遵循 maven 相关规范
通过配置 maven,也可以做到在 IDE 中让 git 忽略特定的配置文件。
并且在各个 IDE 内通用!
回头再继续写 maven 相关笔记。
reference:
菜鸟教程 (2020). git pull 命令. Available at: https://www.runoob.com/git/git-pull.html (Accessed: 19 December 2020).
Git - Reference (2020). Available at: https://git-scm.com/docs/ (Accessed: 19 December 2020).
😄 望这篇笔记能对你也有所帮助,若是喜欢,也不妨点一下收藏,万分感谢。
如有错误,也尽请指出。