同一账号不同电脑同步同一仓库

1 初始工作

1.1 创建github账号(一次性)

github官网按指引进行注册即可

1.2 安装git(一次性)

  • 以下以Windows为例,Linux直接使用sudo apt-get install git即可

  • 需要进行同步的电脑都需要下载并安装gitGit for windows地址,除安装路径可按需修改外,其余均可按照默认设置进行安装。成功安装后,可以在cmd中使用git --version查看版本,此时右键菜单中出现下图红框选项,以后关于git的操作均使用Git Bash Here操作

image-20210823195126529

1.3 设置本地推送github账号(一次性)

需要进行同步的电脑都设置本地推送github账号,如已设置,则跳过此步。在git控制台输入以下命令,即可完成

1
2
git config --global user.name "github账号名字或"
git config --global user.email "github账号绑定邮箱"

  1. 命令执行没有任何输出视为正确
  2. 命令执行后,即在C:\Users\自己的用户名下生成了.gitconfig文件

1.4 生成ssh秘钥(一次性)

**需要进行同步的电脑都生成ssh秘钥**,用于推送免密执行,如已设置,则跳过此步。

  1. cmd终端或者git控制台输入:cd ~/.ssh,检查本机已存在的ssh密钥,如果输出为系统找不到指定的路径。,那么说明之前并未生成过ssh秘钥,继续执行下步

  2. 使用ssh-keygen -t rsa -C "github邮箱地址"生成秘钥,-C后面跟的是说明,用于区分不同ssh秘钥执行命令行,全部回车执行默认操作,否则可能出错(比如更改秘钥名字就无法连接github,即ssh -T测试失败,原因未知)=>可能是Windows原因,在Linux下ssh -T全局有效,当然可能是配置了config,总而言之,针对自定义名称设置,见创建SSH密钥时使用了自定义文件名遇到的问题(含单独文件夹设置git账户)

    image-20210823204654427

  3. 此时会在C:\Users\用户名\.ssh\下生成私钥(xxx)和公钥(xxx.pub),复制公钥内容至GitHub:点击头像->Settings→SSH and GPG keys中即可完成配置

  4. .ssh文件夹下创建config文件,内容如下,根据需要配置githubgitlabIdentityFile也需要替换成第二步创建的文件名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Host github.com
    Hostname ssh.github.com
    PreferredAuthentications publickey
    PubKeyAcceptedKeyTypes=+ssh-rsa
    IdentityFile ~/.ssh/github_id_rsa
    User 【自己的用户名】
    Port 443
    Host gitlab.com
    Hostname altssh.gitlab.com
    IdentityFile ~/.ssh/gitlab_id_rsa
    User 【自己的用户名】
    Port 443
  5. 测试【SSH Key】:ssh -T [email protected]

1.5 初始化本地项目

  1. 假设在电脑A上,建立一个文件夹,此处我创建的文件夹为:E:\workspace\test_repo

  2. 进入这个目录,点击鼠标右键,在弹出框里点击Git Bash here,在当前文件夹打开git控制台

    image-20210823200105677

  3. 初始化仓库git init

    image-20210823200308603

1.6 配置git远程仓库

  1. Github中创建本地同名仓库

    image-20210825091055660

  2. 创建好后,会跳转到下图所示页面

    image-20210823211127073

1.7 将本地仓库与远程github仓库关联

  1. 添加远程仓库git remote add origin <你的项目地址>

    • 项目地址形式为:https://github.com/xxx/xxx.git或者[email protected]:xxx/xxx.git

    • HTTPS和SSH区别:使用HTTP需要每次输入账号密码,使用SSH可以添加公私钥

    image-20210823211531346

  2. 查看关联的远程仓库git remote -v

    image-20210823211705872

2 文章撰写与同步

2.1 初始操作

  • 假设此时已经在电脑A上写好了文件,如下

    image-20210823212238228

  • 电脑A上执行操作

    1
    2
    3
    4
    5
    6
    # 添加当前路径下所有文件
    git add .
    # 提交说明
    git commit -m "第一次提交"
    # 上传至GitHub
    git push origin master

    image-20210824090007051

  • 此时可在github中看到文件已经提交成功

    image-20210824090106097

  • 在另一台安装好了git的电脑上(电脑B),只需要在某个文件夹下打开git控制台。输入如下代码

    1
    git clone [email protected]:你的账户名/仓库名.git

image-20210824092552070

  • 此时电脑B电脑A的内容一致

2.2 日常同步

  1. 首先将远程仓库与本地仓库进行合并,这一步很重要,必须每次都执行,保证在本地修改是在最新远程库的更新

    偷懒操作:git pull一条命令即可,如果提示失败,可采用git pull origin master

    1
    2
    3
    4
    5
    6
    7
    8
    # 从远程的origin仓库的master分支下载代码到本地的origin master
    git fetch origin master

    # 比较本地的仓库和远程参考的区别
    git log -p master.. origin/master

    # 把远程下载下来的代码合并到本地仓库,远程的和本地的合并
    git merge origin/master

    image-20210824093356147

    :上图由于本地仓库刚从远程仓库clone下来,所以两者没有变化,如果是以后同步执行以上代码后,可能是下图所示情况

    image-20210824094130422

  2. 更改文件,新增文件等,并提交至远程仓库

    1
    2
    3
    4
    5
    6
    # 添加当前路径下所有文件
    git add .
    # 提交说明
    git commit -m "第一次提交"
    # 上传至GitHub
    git push origin master

    image-20210824093800714

  3. 此时远程仓库已经更新,如下

    image-20210824093848206

2.3 遇到问题

  1. Your branch is behind 'origin/master' by N commits, and can be fast-forwarded

    • 在日常同步过程中,合并远程分支与本地分支时出现下图问题:

    image-20210906091019866

3 其他命令说明

  • git remote -v:仓库路径查询查询
  • git remote rm origin:删除指定的远程仓库

4 参考

同一账号相同电脑推送不同仓库

  • 在本地不同文件夹,使用git init进行初始化仓库后,每个文件夹就是一个仓库,在不同文件夹中打开git 控制台根据进行独立推送即可

多个账号不同电脑维护同一仓库

1 合作者模式

:将本节阅读完后,再进行操作

1.1 初始工作

1.1.1 推送设置

  • 不同电脑都拥有推送github仓库的基本设置,即已完成同一账号不同电脑同步同一仓库——>1.1至1.4

1.1.2 仓库创建及邀请合作者

  • 账号A创建空仓库如下

    image-20210907172948670

  • 通过以下步骤邀请合作者

    1. settings->Manage access

      image-20210908082144062

    2. 输入账号密码即可进入下图所示界面

      image-20210908082238337

    3. 通过invite a collaborator在弹出的搜索框中输入用户名邮箱地址进行邀请

      image-20210908082424978

    4. 此时状态为等待受邀者同意

      image-20210908082713011

    5. 此时受邀者将会受到一封邮件,根据提示选择接受邀请即可,同意邀请后,合作者状态变为下图

      image-20210908083106756

1.1.3 仓库初始映射到本地

  • 有两种可选方式

    1. 按照同一账号不同电脑同步同一仓库——>1.5至1.7进行配置
    2. 直接将仓库进行clone,下面介绍第二种
  • 在电脑A和电脑B分别找一个空文件夹执行:git clone [email protected]:cv-programmer/test_repo2.git,此时两者都与远程仓库有了关联

    • 电脑A

      image-20210908091605987

    • 电脑B

      image-20210908093023105

1.2 文章撰写与同步

1.2.1 初始操作(空仓库)

  • 此时电脑A本地仓库电脑B本地仓库远程仓库均为空仓库

  • 电脑A添加文件并上传至远程仓库

    • 操作步骤

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 查看当前路径下文件
      ls

      # 增加并修改computerA.txt
      vim computerA.txt

      # 提交更改至远程
      git add .
      git commit -m "电脑A新增文件"
      git push origin master

    image-20210908093419726

    • 此时远程仓库状态如下

      image-20210908093635720

  • 电脑B重复电脑A操作

    • 操作步骤

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 查看当前路径下文件
      ls

      # 增加并修改computerB.txt
      vim computerB.txt

      # 提交更改至远程
      git add .
      git commit -m "电脑B新增文件"
      git push origin master

      image-20210908093948791

    • 此时,可以看到,在推送至远程时,发生冲突,原因在于由于电脑A的修改及推送,此时远程仓库已经与电脑B本地仓库不相同,根据提示,依次执行以下步骤

      1
      2
      3
      4
      5
      # 将本地仓库更新为最新远程仓库
      git pull

      # 再次更新
      git push origin master

      image-20210908094511816

  • 可以看到,此时还是更新失败,原因在于电脑B在此之前没有过提交,相当于本地没有分支,而此时远程仓库有了电脑A的推送,导致两者分支毫无关联,处理办法如下:

    1. 电脑B的仓库进行删除,重新执行git clone [email protected]:cv-programmer/test_repo2.git

    2. 此时文件内容如下

      image-20210908095000508

    3. 再次按照下列步骤新增文件并推送

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 查看当前路径下文件
      ls

      # 增加并修改computerB.txt
      vim computerB.txt

      # 提交更改至远程
      git add .
      git commit -m "电脑B新增文件"
      git push origin master

      image-20210908095145255

    4. 此时远程仓库状态如下

      image-20210908095247133

1.2.2 初始操作(非空仓库)

  • 经过多个账号不同电脑维护同一仓库1.2.1的操作,此时,电脑A电脑B远程仓库的状态如下

    • 电脑A

      image-20210908095528584

    • 电脑B

      image-20210908095627649

    • 远程仓库

      image-20210908095247133

    • 说明:可以看到,此时电脑B远程仓库内容保持了一致,而电脑A确实computerB.txt

  • 此时再在电脑A修改computerA.txt和新增a.txt文件

    • 操作步骤

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 查看当前路径下文件
      ls

      # 修改computerA.txt
      vim computerA.txt
      # 增加并修改a.txt
      vim a.txt

      # 提交更改至远程
      git add .
      git commit -m "电脑A再次修改"
      git push origin master

      image-20210908100458026

    • 此时发生冲突,原因在于1.2.1 初始操作(空仓库)中电脑B的修改及推送,此时远程仓库已经与电脑A本地仓库不相同,根据提示,依次执行以下步骤

      1. 将本地仓库更新为最新远程仓库:git pull,会出现如下图所示界面,是git发现两者内容不同,需要合并,并需要填写必要说明(可不填,直接保存退出即可)

        image-20210908100713958

      2. 再次推送:git push origin master

      image-20210908101019080

    • 此时电脑A状态如下

      image-20210908101100263

    • 远程仓库状态如下

      image-20210908101159133

    • 电脑B状态如下

      image-20210908101233848

1.2.3 日常同步

  1. 严格按照以下步骤进行操作,否则可能发生冲突导致推送失败
  2. 只能修改自己的文件,不能修改其他合作者的文件,否则两者同时修改也会导致推送失败
  • 步骤

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 1. 将本地仓库更新为最新远程仓库
    git pull

    # 2. 修改或新增文件,即修改md文档等

    # 3. 将更改提交至暂存区
    git add .

    # 4. 将更改提交至本地分支
    git commit -m "提交说明"

    # 5. 推送远程
    git push origin master
  • 示例

    • 仓库状态

      • 电脑A

        image-20210908101100263

      • 电脑B

        image-20210908101233848

      • 远程仓库

        image-20210908101159133

    • 考虑到只有电脑B状态不为最新,所以以下操作均针对于电脑B

      1. 将本地仓库更新为最新远程仓库:git pull

        image-20210908102132360

      2. 修改文件,本次修改了computerB.txt和新增b.txt

      3. 将更改提交至暂存区:git add .

      4. 将更改提交至本地分支:git commit -m "电脑B日常同步"

      5. 推送远程:git push origin master

      image-20210908102415864

    • 此时远程仓库状态

      image-20210908102443168

2 fork 模式

(未完成…)

3 参考

多个账号相同电脑推送不同仓库

前提

步骤

  1. 进入ssh文件夹:cd ~/.ssh

  2. 其他账号生成ssh秘钥,即ssh-keygen -t rsa -C "github邮箱地址" ,用于区分不同秘钥,注意下图中,保存名称需要修改为唯一(默认为id_rsaid_rsa.pub,已经被设置的默认全局账号使用),本测试名称为id_rsa_fighting

    image-20221010102705114

  3. 添加公钥id_rsa_fighting.pub内容至github仓库

  4. 在~/.ssh目录下创建一个config文件,格式如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # git server global
    # Host 别名 # Hostname 真实域名
    # IdentityFile ssh秘钥w路径
    # User 标识作用

    Host github.com
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
    User global

    Host o1github.com
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_fighting
    User other1
  5. 修改config权限chmod 600 config:否则出现如下错误Bad owner or permissions on .ssh/config

    image-20221010104632634

  6. 测试连接,结果如下

    1
    2
    3
    4
    5
    6
    7
    8
    # 格式:ssh -T ssh@Host

    # 配置config前
    ssh -T [email protected]

    # 配置config后(因为我这里全局别名没变,所以第一个保持)
    ssh -T [email protected]
    ssh -T [email protected]

    image-20221010104958375

  7. 下载仓库

    1
    2
    3
    4
    5
    6
    7
    8
    # 格式:git clone git@Host:项目路径.git

    # 配置config前
    git clone [email protected]:cv-programmer/test_repo.git

    # 配置config后
    git clone [email protected]:cv-programmer/test_repo.git
    git clone [email protected]:fighting/test_repo.git
  8. 为仓库设置单独的推送账号信息,如没有设置,推送信息为全局账户,如果觉得每次修改仓库的配置过于麻烦,可按照步骤9修改

    1
    2
    3
    # 只为新账户单独设置(我的需求是以一个为主,另一个偶尔提交,没必要改全局的)
    git config user.name "用户名"
    git config user.email "邮箱"
  9. 此方法按照文件夹设定不同的nameemail

    1. 假设在 E:\codes 下存放所有的 git repos,已有.gitconfig配置如下

      1
      2
      3
      [user]
      name = xxxxx
      email = [email protected]
    2. 现在建立两个特殊的目录

      1
      2
      E:\codes\github --> 专门存放托管于 github 的项目
      E:\codes\gitlab --> 专门存放托管于 gitlab 的项目
    3. 打开git的全局配置文件,增加两段配置,如下(第 5 行起的部分),更多规则可查看Git Conditional Includes

      • Windows: C:\Users\{用户名}\.gitconfig
      • Linux等:~/.gitconfig
      1
      2
      3
      4
      5
      6
      7
      8
      9
      [user]
      name = xxxxx
      email = [email protected]

      [includeIf "gitdir:codes/github/"]
      path = ./.github

      [includeIf "gitdir:codes/gitlab/"]
      path = ./.gitlab
    4. 在全局 .gitconfig文件夹相同的位置,创建 .github.gitlab 文件,内容如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # .github
      [user]
      name = hello
      email = [email protected]

      # .gitlab
      [user]
      name = world
      email = [email protected]
    5. 这样配置以后,如果你是在 E:\codes\gitlab 下的某个项目时,你的 email 是 [email protected],如果你是在 E:\codes\github 下的某个项目时,你的 email 是 [email protected],其它情况下,是 [email protected],name同理

参考

同步本地仓库至多个远程仓库(未完成)

Git pull失败

问题描述

  • 之前已经配置好公私钥,能够与github互通上传及下载代码,突然不能git pull/clone等操作了

    image-20220108170920022

  • 使用ssh -T [email protected],也显示无法连接

解决方案

  • 在本机~/.ssh目录下,修改config文件,增加以下内容

    1
    2
    3
    4
    5
    6
    Host github.com
    User YourEmail(你的邮箱)
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
    Port 443

参考

Git实现原理

存储实现原理(Git对象)

  • 在git中以存储键值对(key-value)的方式来存储文件。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。git的kv中value一般有以下几种类型blobtreecommit

总结

在这里插入图片描述

参考

创建SSH密钥时使用了自定义文件名遇到的问题(含单独文件夹设置git账户)

步骤

  1. 创建自定义名ssh私钥: ssh-keygen -t rsa -C "注释信息",假设生成的文件为 ~/.ssh/test_key

  2. 使用 ssh-add命令把专用密钥添加到ssh-agent的高速缓存中(不执行这一步的话,后面使用ssh -T测试,就只能在 ~/.ssh下才能成功):ssh-add ~/.ssh/test_key,如果报错,先执行 ssh-agent bash,再次执行 ssh-add ~/.ssh/test_key即可,可使用 ssh-add -l查看已添加的私钥

  3. 修改 ~/.ssh/config,如下

    1
    2
    3
    4
    Host github
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/test_key
  4. 进入 github添加公钥,配置成功后,测试连接:ssh -T -i test_key [email protected],出现 Hi xxx,说明配置成功

  5. 在项目文件夹下,设置推送人信息(修改成功后,在 {项目}/.ssh/config文件中可看到修改)

    1
    2
    git config user.name "用户名"
    git config user.email "邮箱号"
  6. 为项目添加 remote信息,注意添加 git@xxx,如果是添加了 https://,则还需要每次输入帐密(没走ssh这条路),可使用 git remote -v查看已经添加的远程仓库信息

  7. 执行推送操作

参考

git-crypt

加密

  1. 初始化 key: git-crypt init

  2. 添加需要加密的文件: .gitattributes文件中添加以下内容,表示加密aaa/bbb下所有 yml 文件

    1
    aaa/bbb/*.yml filter=git-crypt diff=git-crypt
  3. 提交到 remote 时,远端仓库显示如下

    image-20240311172947784

解密

  1. 拿到 key,通过 git-crypt unlock [密钥文件]进行解密

参考