Git使用说明
同一账号不同电脑同步同一仓库
1 初始工作
1.1 创建github账号(一次性)
在github官网按指引进行注册即可
1.2 安装git(一次性)
以下以
Windows为例,Linux直接使用sudo apt-get install git即可需要进行同步的电脑都需要下载并安装
git,Git for windows地址,除安装路径可按需修改外,其余均可按照默认设置进行安装。成功安装后,可以在cmd中使用git --version查看版本,此时右键菜单中出现下图红框选项,以后关于git的操作均使用Git Bash Here操作

1.3 设置本地推送github账号(一次性)
需要进行同步的电脑都设置本地推送github账号,如已设置,则跳过此步。在git控制台输入以下命令,即可完成
1 | git config --global user.name "github账号名字或" |
注:
- 命令执行没有任何输出视为正确
- 命令执行后,即在
C:\Users\自己的用户名下生成了.gitconfig文件
1.4 生成ssh秘钥(一次性)
**需要进行同步的电脑都生成ssh秘钥**,用于推送免密执行,如已设置,则跳过此步。
在
cmd终端或者git控制台输入:cd ~/.ssh,检查本机已存在的ssh密钥,如果输出为系统找不到指定的路径。,那么说明之前并未生成过ssh秘钥,继续执行下步使用
ssh-keygen -t rsa -C "github邮箱地址"生成秘钥,-C后面跟的是说明,用于区分不同ssh秘钥,执行命令行,全部回车执行默认操作,否则可能出错(比如更改秘钥名字就无法连接github,即ssh -T测试失败,原因未知)=>可能是Windows原因,在Linux下ssh -T全局有效,当然可能是配置了config,总而言之,针对自定义名称设置,见创建SSH密钥时使用了自定义文件名遇到的问题(含单独文件夹设置git账户)
此时会在
C:\Users\用户名\.ssh\下生成私钥(xxx)和公钥(xxx.pub),复制公钥内容至GitHub:点击头像->Settings→SSH and GPG keys中即可完成配置在
.ssh文件夹下创建config文件,内容如下,根据需要配置github和gitlab,IdentityFile也需要替换成第二步创建的文件名1
2
3
4
5
6
7
8
9
10
11
12Host 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测试【SSH Key】:
ssh -T [email protected]如果正常连接,如下图

如果出现下图错误,可能是在复制公钥时多了空格或者在生成SSH秘钥时改名了(即不使用默认id_rsa),针对自定义名称设置,见创建SSH密钥时使用了自定义文件名遇到的问题(含单独文件夹设置git账户)

1.5 初始化本地项目
假设在电脑A上,建立一个文件夹,此处我创建的文件夹为:
E:\workspace\test_repo进入这个目录,点击鼠标右键,在弹出框里点击
Git Bash here,在当前文件夹打开git控制台
初始化仓库:
git init
1.6 配置git远程仓库
在
Github中创建本地同名仓库
创建好后,会跳转到下图所示页面

1.7 将本地仓库与远程github仓库关联
添加远程仓库:
git remote add origin <你的项目地址>注:
项目地址形式为:
https://github.com/xxx/xxx.git或者[email protected]:xxx/xxx.gitHTTPS和SSH区别:使用HTTP需要每次输入账号密码,使用SSH可以添加公私钥

查看关联的远程仓库:
git remote -v
2 文章撰写与同步
2.1 初始操作
假设此时已经在电脑A上写好了文件,如下

在电脑A上执行操作
1
2
3
4
5
6添加当前路径下所有文件
git add .
提交说明
git commit -m "第一次提交"
上传至GitHub
git push origin master
此时可在github中看到文件已经提交成功

在另一台安装好了git的电脑上(电脑B),只需要在某个文件夹下打开git控制台。输入如下代码
1
git clone [email protected]:你的账户名/仓库名.git

- 此时电脑B和电脑A的内容一致
2.2 日常同步
首先将远程仓库与本地仓库进行合并,这一步很重要,必须每次都执行,保证在本地修改是在最新远程库的更新
偷懒操作:
git pull一条命令即可,如果提示失败,可采用git pull origin master1
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
注:上图由于本地仓库刚从远程仓库clone下来,所以两者没有变化,如果是以后同步执行以上代码后,可能是下图所示情况

更改文件,新增文件等,并提交至远程仓库
1
2
3
4
5
6添加当前路径下所有文件
git add .
提交说明
git commit -m "第一次提交"
上传至GitHub
git push origin master
此时远程仓库已经更新,如下

2.3 遇到问题
Your branch is behind 'origin/master' by N commits, and can be fast-forwarded- 在日常同步过程中,合并远程分支与本地分支时出现下图问题:

- 解决方法:
git reset --hard origin/master=>将本地库更新为远程最新库 - 参考博客:Your branch is behind ‘origin/master’ by N commits, and can be fast-forwarded 解决方法
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创建空仓库如下

通过以下步骤邀请合作者
settings->Manage access
输入账号密码即可进入下图所示界面

通过
invite a collaborator在弹出的搜索框中输入用户名或邮箱地址进行邀请
此时状态为等待受邀者同意

此时
受邀者将会受到一封邮件,根据提示选择接受邀请即可,同意邀请后,合作者状态变为下图
1.1.3 仓库初始映射到本地
有两种可选方式
- 按照同一账号不同电脑同步同一仓库——>1.5至1.7进行配置
- 直接将仓库进行
clone,下面介绍第二种
在电脑A和电脑B分别找一个空文件夹执行:
git clone [email protected]:cv-programmer/test_repo2.git,此时两者都与远程仓库有了关联电脑A

电脑B

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

此时远程仓库状态如下

电脑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
此时,可以看到,在推送至远程时,发生冲突,原因在于由于电脑A的修改及推送,此时远程仓库已经与电脑B本地仓库不相同,根据提示,依次执行以下步骤
1
2
3
4
5将本地仓库更新为最新远程仓库
git pull
再次更新
git push origin master
可以看到,此时还是更新失败,原因在于电脑B在此之前没有过提交,相当于本地没有分支,而此时远程仓库有了电脑A的推送,导致两者分支毫无关联,处理办法如下:
将
电脑B的仓库进行删除,重新执行git clone [email protected]:cv-programmer/test_repo2.git此时文件内容如下

再次按照下列步骤新增文件并推送
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
此时远程仓库状态如下

1.2.2 初始操作(非空仓库)
经过多个账号不同电脑维护同一仓库1.2.1的操作,此时,
电脑A、电脑B和远程仓库的状态如下电脑A

电脑B

远程仓库

说明:可以看到,此时
电脑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
此时发生冲突,原因在于在
1.2.1 初始操作(空仓库)中电脑B的修改及推送,此时远程仓库已经与电脑A本地仓库不相同,根据提示,依次执行以下步骤将本地仓库更新为最新远程仓库:
git pull,会出现如下图所示界面,是git发现两者内容不同,需要合并,并需要填写必要说明(可不填,直接保存退出即可)
再次推送:
git push origin master

此时
电脑A状态如下
远程仓库状态如下
电脑B状态如下
1.2.3 日常同步
- 注:
- 严格按照以下步骤进行操作,否则可能发生冲突导致推送失败
- 只能修改自己的文件,不能修改其他合作者的文件,否则两者同时修改也会导致推送失败
步骤
1
2
3
4
5
6
7
8
9
10
11
12
131. 将本地仓库更新为最新远程仓库
git pull
2. 修改或新增文件,即修改md文档等
3. 将更改提交至暂存区
git add .
4. 将更改提交至本地分支
git commit -m "提交说明"
5. 推送远程
git push origin master示例
仓库状态
电脑A
电脑B
远程仓库
考虑到只有
电脑B状态不为最新,所以以下操作均针对于电脑B将本地仓库更新为最新远程仓库:
git pull
修改文件,本次修改了
computerB.txt和新增b.txt将更改提交至暂存区:
git add .将更改提交至本地分支:
git commit -m "电脑B日常同步"推送远程:
git push origin master

此时远程仓库状态

2 fork 模式
(未完成…)
3 参考
多个账号相同电脑推送不同仓库
前提
假设此时已经配置好基础环境,见同一账号不同电脑同步同一仓库:1. 初始工作,基础设置如下

假设新github用户名为
fighting
步骤
进入ssh文件夹:
cd ~/.ssh为
其他账号生成ssh秘钥,即ssh-keygen -t rsa -C "github邮箱地址",用于区分不同秘钥,注意下图中,保存名称需要修改为唯一(默认为id_rsa和id_rsa.pub,已经被设置的默认全局账号使用),本测试名称为id_rsa_fighting
添加公钥
id_rsa_fighting.pub内容至github仓库在~/.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修改
config权限chmod 600 config:否则出现如下错误Bad owner or permissions on .ssh/config:
测试连接,结果如下
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]
下载仓库
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为仓库设置单独的推送账号信息,如没有设置,推送信息为全局账户,如果觉得每次修改仓库的配置过于麻烦,可按照步骤9修改
1
2
3只为新账户单独设置(我的需求是以一个为主,另一个偶尔提交,没必要改全局的)
git config user.name "用户名"
git config user.email "邮箱"此方法按照文件夹设定不同的
name及email假设在
E:\codes下存放所有的 git repos,已有.gitconfig配置如下1
2
3[user]
name = xxxxx
email = [email protected]现在建立两个特殊的目录
1
2E:\codes\github --> 专门存放托管于 github 的项目
E:\codes\gitlab --> 专门存放托管于 gitlab 的项目打开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- Windows:
在全局
.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]这样配置以后,如果你是在
E:\codes\gitlab下的某个项目时,你的 email 是[email protected],如果你是在E:\codes\github下的某个项目时,你的 email 是[email protected],其它情况下,是[email protected],name同理
参考
同步本地仓库至多个远程仓库(未完成)
Git pull失败
问题描述
之前已经配置好公私钥,能够与github互通上传及下载代码,突然不能git pull/clone等操作了

使用
ssh -T [email protected],也显示无法连接
解决方案
在本机
~/.ssh目录下,修改config文件,增加以下内容1
2
3
4
5
6Host github.com
User YourEmail(你的邮箱)
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
参考
- ssh: connect to host github.com port 22: Connection timed out
- git报错ssh: connect to host github.com port 22: Connection timed out
Git实现原理
存储实现原理(Git对象)
- 在git中以存储
键值对(key-value)的方式来存储文件。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。git的kv中value一般有以下几种类型blob、tree、commit
总结

参考
创建SSH密钥时使用了自定义文件名遇到的问题(含单独文件夹设置git账户)
步骤
创建自定义名ssh私钥:
ssh-keygen -t rsa -C "注释信息",假设生成的文件为~/.ssh/test_key使用
ssh-add命令把专用密钥添加到ssh-agent的高速缓存中(不执行这一步的话,后面使用ssh -T测试,就只能在~/.ssh下才能成功):ssh-add ~/.ssh/test_key,如果报错,先执行ssh-agent bash,再次执行ssh-add ~/.ssh/test_key即可,可使用ssh-add -l查看已添加的私钥修改
~/.ssh/config,如下1
2
3
4Host github
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/test_key进入
github添加公钥,配置成功后,测试连接:ssh -T -i test_key [email protected],出现Hi xxx,说明配置成功在项目文件夹下,设置推送人信息(修改成功后,在
{项目}/.ssh/config文件中可看到修改)1
2git config user.name "用户名"
git config user.email "邮箱号"为项目添加
remote信息,注意添加git@xxx,如果是添加了https://,则还需要每次输入帐密(没走ssh这条路),可使用git remote -v查看已经添加的远程仓库信息执行推送操作
参考
- 创建SSH密钥时使用了自定义文件名遇到的问题
- ssh-add命令
- github设置ssh key后push还要输入用户名和密码解决方案
- 执行ssh-add时:Could not open a connection to your authentication agent
git-crypt
- 安装:
brew install git-crypt或参考 https://github.com/AGWA/git-crypt 进行安装
加密
初始化 key:
git-crypt init添加需要加密的文件:
.gitattributes文件中添加以下内容,表示加密aaa/bbb下所有 yml 文件1
aaa/bbb/*.yml filter=git-crypt diff=git-crypt
提交到 remote 时,远端仓库显示如下

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




