Github入门6 - 代码托管中心(与远程库push冲突时的解决方案)

[原文链接: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>
    • 更改:
      • 更改 remote 名:
        • $ git remote rename <oldName> <newName>
      • 更改 remote url:
        • $ git remote set-url <remoteName> <newUrl>
    • 删除:
      • $ 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)

          1. 进入 HOME (~)

            $ cd ~

          2. 删除本地旧的 .ssh 目录

            $ rm -rvf .ssh

          3. 运行命令生成 .ssh 密钥目录

            $ ssh-keygen -t rsa -C <你的github注册邮箱>

          4. 进入 .ssh 目录查看后续需求文件

            $ cd ~/.ssh

            $ ls -IF

          5. 查看 id_rsa.pub 文件内容

            $ cat if_rsa.pub

          6. 复制 id_rsa.pub 文件内容,登录 Github,点击用户头像,Settings,SSH and GPG Keys,New SSH Key,输入刚才复制的密钥信息

          7. 回到 Git bash 去 add remote

            $ git remote add origin_ssh <你项目的SSH克隆地址>

          8. push!


🚧 二、其余远程指令
🧱 主要内容(团队内合作必掌握):fetch,pull,push
⏬ $ git fetch
  • 本质:
    • download code from Remote to Local Repo (从 remote 下载代码到本地库
  • 样例:
    • $ git fetch <remoteName>
  • 实操:
    1. $ git remote add origin https://github.com/yourname/yourrepo.git
    2. $ git fetch origin
    3. $ 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

    1. $ git remote add origin https://github.com/yourname/yourrepo.git

    2. ``$ git fetch origin `

    3. $ git merge origin/master

    等价于:

    1. $ git remote add origin https://github.com/yourname/yourrepo.git
    2. ``$ git pull origin `
  • git pull 应用2

    1. $ git remote add origin https://github.com/yourname/yourrepo.git

    2. ``$ git fetch origin `

    3. $ git merge origin/mybranch

    等价于:

    1. $ git remote add origin https://github.com/yourname/yourrepo.git
    2. $ 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
🧱 次要内容(跨团队合作必掌握):clone,fork,pull request
⏬ clone 功能拆解

clone (克隆) 的功能是直接从远程 Github 下载代码到本地。

但具体它都做了什么?

  1. 下载全部代码(全版本)
  2. 配置好本地的 ./.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: 在你从 新repoclone 下来代码,改完并 push自己 github 后,即可点击 pull request 的 New pull request 按钮。填入信息后,原作者即可收到你的新代码,并审核。

fork&pullrequest

🚧 三、Github 补充内容
🔐 为什么 Windows 中的 Git Bash 能够记住 github 的登录密码?

git 不自带记住密码功能,

其功能由 windows 10 系统自带:

控制面板 => 所有控制面板项 => 凭据管理器 =>

Windows凭据 => 普通凭据 => git:https//github.com(可在此删除和管理

↑(如需要切换账号时,从这里入手才能更改

此外,一些高级 IDE 也实现了对 Github 账户密码的保存功能,如 Eclipse,JetBrains 系列如 IntelliJ IDEA 等。


🕸️ HTTP remote 与 SSH remote 的区别

HTTP&SSH

现在我们已知 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冲突的解决方案

  1. push 时发现冲突后,git会在命令行 (prompt) 提示你需要先 pull 下最新版,再push。

    思考:pull = fetch + merge

  2. pull 后,prompt 状态由 (branch) 变为 (branch | MERGING)

  3. 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

    • 然后需要你决定需要把这两段内容怎么改:
      • 这两行是全留下➕,还是需要继续修改🛠️,或是删掉其中一个✂️?。
  4. 改完后,此时你再 git add, commit, 就彻底 merge 完成!

  5. 再 push,即可通过但若是改变别人代码,还是得提前和别人说好)。

☠️ 情况2:多人之间,IDE 不同导致的 push 冲突 (※须知!)

由于各个程序员自己用的 IDE 不同,导致的 push 冲突了 IDE 配置文件。

这个问题很傻,若在公司发生此事,你可能也离被开除不远了。

🕹️ 解决方案1:在 git 中配置 “忽略文件” (Git-Ignore)
✨ 概念
  • 区分 工程文件特定文件

    • 如 Eclipse 中,生成新项目后,会附带生成一堆配置文件,编译文件,如:
      • .project
      • .classpath
      • .settings
      • target
    • 此外,macbook 系统也会为每个文件夹生成一些隐藏文件来保存文件夹信息,如:
      • .DS_store
    • **这些文件与代码开发无关,**属于特定文件。

    对于 特定文件,不要去让 git 追踪它,要让 git 去忽略它!

✨ 方式
  • 配置一个 MyProject.gitignore 文件,在其中配置好自己想要忽略的文件
  • 然后,在 ~/.gitconfig全局配置)或 ./.git/config独立配置) 中的 [core] 字段下:
  • 添加如下变量:
    • excludesfile = <MyProject.gitignore文件路径>
  • 注意:
    • git 解析本地路径方式为:辨别 正斜杠 “/” 而不是 反斜杠 “\”同Linux一致
    • 若你写错了,那么路径无法被正确解析!
✨ 如何配置.gitignore文件?

Github 为全世界开发者准备好的 各个语言的 gitignore模板地址:

  • https://github.com/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).


😄 望这篇笔记能对你也有所帮助,若是喜欢,也不妨点一下收藏,万分感谢。

如有错误,也尽请指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值