1.4.2 分布式版本控制 git

  1. 关于 git 的认识

    • git clone : Clone 下来的文件夹自带 .git 隐藏目录,天生就是 Git 仓库。

    • Fork : 这是 GitHub 网页上的操作,不是 Git 命令。

      • 它的作用是:“复制一份别人的仓库到我自己的账号下”。

      • 为什么需要 Fork ? 如果你想给 Ceph 官方贡献代码,你直接 Clone 官方仓库是推不回去的(没权限)。所以你要先 Fork 一份到自己名下(比如 xqy2003/ceph),然后 Clone 这个自己的仓库,改完推回自己的仓库,最后在网页上提 "Pull Request"

    • 把普通文件夹变成 Git 仓库

      cd my-project
      
      # 1. 初始化
      git init
      # 此时文件夹里多了一个 .git 隐藏目录
      
      # 2. 纳入管理
      git add .
      git commit -m "First commit"
      
    • 绑定身份

      • 是一次性的吗?

        • 如果你加了 --global 参数:是的。这台电脑上以后所有的 Git 操作都用这个身份。

        • 如果不加:只对当前仓库生效。

      • 例子

        git config --global user.name "xqy2003"
        git config --global user.email "xqy2003@example.com"
        
      • 注意:这只是“签名”,不是“登录”。Git push 时让你输密码/Token 才是验证权限。

        • user.name 不必和 GitHub 用户名一样吗

        • user.email 很重要:如果你配置的邮箱和你 GitHub 账号绑定的邮箱一致,GitHub 才会把这次提交算作你的贡献(绿格子),头像也会显示对。

    • 创建分支

      • 创建并切换到新分支:

        # 基于当前分支,创建一个叫 feature-A 的新分支,并跳过去
        git checkout -b feature-A
        
      • 在分支上再生分支(孙子):

        # 假设你现在已经在 feature-A 上了
        git checkout -b feature-B
        # 现在 feature-B 就是基于 feature-A 的代码创建的
        
      • 跳转到已有分支

        git checkout 分支名
        # 例如: git checkout my-dev
        
        • 如果你在当前分支修改了文件但没提交 (Dirty Workspace)Git 可能会拒绝切换,怕覆盖了你的改动。

        • 最稳妥的做法:永远保持 git status 是干净的再去切换分支。

    • git push

      • 完整语法 : git push <远程仓库名> <本地分支名>:<远程分支名>

      • 当你偷懒写成 git push origin my-experiment 时,Git 默认理解为:git push origin my-experiment:my-experiment (把本地的 A 推送到远程的 A)。

      • 如果没有远程分支会怎样?: 如果 GitHub 上本来没有 my-experiment 这个分支,Git 会直接在那边新建一个同名分支,然后把代码传上去。

      • origin 只是一个代号, 它代表了那串很长的 URL (https://github.com/.../....git)

      • 你可以用 git remote -v 看看 origin 到底指向哪里。

    • 远程仓库的管理

      • 查看 git remote -v

        • 内容举例

          origin  https://github.com/ceph/ceph.git (fetch)
          origin  https://github.com/ceph/ceph.git (push)
          my_repo https://github.com/xqy2003/ceph-hrac.git (fetch)
          my_repo https://github.com/xqy2003/ceph-hrac.git (push)
          
        • 这里说明你关联了两个远程仓库,分别起了昵称叫 origin 和 my_repo。

      • 关联一个新的远程仓库

        # 语法: git remote add <给它起个名> <URL>
        git remote add my_backup https://github.com/xqy2003/backup.git
        
    • 分支名

      • 在同一个仓库内:是的,必须唯一。(你不能在本地有两个叫 dev 的分支)。

      • 在本地和远程之间:不是!完全不需要一致!

        • 最常用的(同名推送): git push origin dev

          • Git 看到你没写冒号,它会默认帮补全为:git push origin dev:dev
        • 改名推送

          • 假设你在本地叫 my-dev-v2,但你希望推送到服务器上显示为 release-1.0

            git push origin my-dev-v2:release-1.0
            
    • 基础三板斧

      • 有个很重要的观点: git add , git commit 都是争对当前分支的。

      alt text

  2. github 连接案例

    • 尝试用 HTTPS 方式克隆一个私有仓库,结果失败。

      git clone https://github.com/charicity/ceph-compress/tree/astl-lj.git
      
      • HTTPS 协议:git clone https://... 这种方式需要账号密码(或 Token)认证。如果本地没有缓存正确的 Token,或者 Token 过期,GitHub 会拒绝访问。

      • GitHub 的安全策略:对于私有仓库的无权访问,GitHub 统一报 404 Not Found(找不到),而不是 403 Forbidden(禁止访问),目的是防止黑客探测私有仓库是否存在。

      • URL 错误:git clone 后面必须接仓库的根地址(以 .git 结尾),不能接分支路径(如 /tree/astl-lj)。要下载特定分支,得先 clone 整个仓库,再 checkout

    • 生成 SSH 密钥

      • 既然 HTTPS 走不通,我们切换到 SSH 协议。首先需要一把钥匙。

        ssh-keygen -t ed25519
        
        • ssh-keygen:生成 SSH 密钥对的工具。

        • -t ed25519:指定加密算法。ed25519 是目前最安全、最高效的新一代算法(比老的 rsa 更好)。

        • 生成结果:在 ~/.ssh/ 目录下生成了两个文件:

          • 私钥 (id_ed25519):你自己留着,绝对不能给别人看。

          • 公钥 (id_ed25519.pub):你需要给 GitHub 的“锁”。

    • 上传公钥

      你把公钥内容复制到了 GitHub 网页设置里。

      cat ~/.ssh/id_ed25519.pub
      

      帮内容放入网页里面

      alt text

    • 首次连接验证 (握手与信任)

      ssh -T git@github.com
      
      • ssh:Secure Shell 客户端。

      • -T :告诉 SSH “不要分配伪终端”。因为 GitHub 不允许我们登录进去敲命令,所以必须加这个参数,否则可能会卡住或者报错。

      • git@github.com :以 git 用户身份连接 github.com 主机。

      • 你的操作输入 yes

    • ssh建立连接后,注意点

      • Clone 整个仓库,不要在 URL 后面加 /tree/... 那一段,那是分支路径,不是仓库地址。clone 下来后用 git checkout astl-lj 切换分支即可
      git clone git@github.com:charicity/ceph-compress.git
      
  3. 假设要连接两个 github 账号 && 疑问

    • 如何让本机 PC 连接两个 github 账号

    alt text

    alt text

    alt text

    • 疑问

    alt text

    alt text

    alt text

  4. 理解 git 的历史追踪功能

    • 归功于 commit , 而不是分支,分支相当于 git 树上一个标签的作用。

    • 你想,其实不同版本的迭代,他就是线性的一条链,分支的出现让它变成树结构(把一条链分成多条链)。

    alt text

    alt text

    alt text

    alt text

    alt text

    alt text

    alt text

    alt text

    alt text

    alt text

posted @ 2026-01-27 21:44  xqy2003  阅读(1)  评论(0)    收藏  举报