1.Git简介
Git是一种分布式版本控制系统,在我看来有两个重要优势:更新、回溯,举个简单的例子,在写毕业论文的过程,在初版到最终版的过程中,一般进行多次修改,并且还会有其他同学或老师提出的修改意见,生成许多不同版本,我们一般是保存历史版本,在前一版的基础之上进行修改,而这一过程就是“版本控制”。何为分布式,即集中式的反义词,任何人只需要clone公共的代码仓库就可以拥有整个代码和版本信息,开发者之间可以容易地解决冲突问题,更好的实现协作开发。
推荐阅读:
2.Git教程
2.Git的基本工作流程
转载自:
2.Git简介

Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
常用的命令:
#初始化仓库
git init
#提交所有文件到暂存区
git add .
#提交所有文件到仓库区
git commit -m "提交说明"
#提交到远程仓库
git push3.Git的常用配置
3.1 Git配置文件与配置流程总览
转载自:
3.1.1 Git配置文件介绍
既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
1./etc/gitconfig文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
2.~/.gitconfig或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
3.当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)
每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users$USER )的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。 如果你在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在 C:\Documents and Settings\All Users\Application Data\Git\config ,Windows Vista 及其以后的版本在 C:\ProgramData\Git\config 。此文件只能以管理员权限通过 git config -f <file> 来修改。
你可以通过以下命令查看所有的配置以及它们所在的文件:
git config --list --show-origin3.1.2 配置用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改,全局配置信息会写入到 ~/.gitconfig 文件中:
git config --global user.name "John Doe"
git config --global user.email [email protected]
#示例
git config --global user.name "Einstein-schrodinger"
git config --global user.email [email protected]user.name:github或其它代码仓库的用户名
user.email:github或其它代码仓库所绑定的邮箱
再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。
删除全局配置:
git config --global --unset user.name "用户名"
git config --global --unset user.email 邮箱当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
局部配置,这一配置会保存在当前仓库目录的 .git/config 文件中,在提交代码时会携带该信息
git config --local user.name "用户名"
git config --local user.email 邮箱3.1.3 检查配置信息
如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置:
git config --list
user.name=John Doe
[email protected]
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig 与 ~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
你可以通过输入 git config <key>: 来检查 Git 的某一项配置:
git config user.name
John Doe3.1.4 生成/添加SSH公钥
Git服务器都了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库之前,需要先配置好账户/仓库的 SSH 公钥。
3.2 Git配置的实际操作流程
3.2.1 安装git(如果已经安装可以忽略)
推荐阅读:
3.2.2 设置环境变量
将HOME环境变量设置为自己的家目录(如果已经配置可以忽略)

3.2.3 配置全局用户信息(如果已经配置过可以忽略,安装完git后这一步配置是必须的)
这一信息将会在你向远程仓库push时携带
git config --global user.name "用户名"
git config --global user.email 邮箱之后通过以下命令查看配置是否成功,如下图的末尾两行显示
git config --list --show-origin
可以看到配置之后会在 C:\User\Su 家目录下生成 .gitconfig 文件,内容如下:
[user]
name = Einstein-schrodinger
email = [email protected]3.2.4 生成SSH公钥和私钥用于SSH连接远程代码仓库
参考:
一般来说需要我们需要连接的代码仓库不止一个,所以这里演示连接多个代码仓库的配置步骤,以连接Gitee和Github以及自建的Git仓库Gitea为例,所以需要生成三次密钥
右键打开git bash,依次输入如下内容分别生成三个仓库的公钥与私钥,-t之后为加密方式,-C之后为 sshkey 的标识名,一般便于标识会使用邮箱,实际并不要求具体命名为某个邮箱,下图中SHA256一行的末尾即为该标识,-f之后为生成的密钥文件名称,为了便于标识,在最后以仓库名称结尾
ssh-keygen -t ed25519 -C "github" -f ~/.ssh/id_ed25519_github
ssh-keygen -t ed25519 -C "gitee" -f ~/.ssh/id_ed25519_gitee
ssh-keygen -t ed25519 -C "gitea" -f ~/.ssh/id_ed25519_gitea具体生成过程如下,一路回车即可

之后会在 ~/.ssh 目录下生成三个仓库的公钥(后缀名为pub)与私钥六个文件,分别为:
id_ed25519_github
id_ed25519_github.pub
id_ed25519_gitee
id_ed25519_gitee.pub
id_ed25519_gitea
id_ed25519_gitea.pub然后将公钥放置到代码仓库,这样在连接代码仓库时会进行公钥和私钥的验证,配对成功则进行连接
Github添加公钥流程


Gitee添加公钥流程

Gitea添加公钥流程

此时你迫不及待,想要进行SSH连接测试,结果会报如下错误:
ssh -T [email protected]


这是因为你设置了三组密钥,而在连接代码仓库时未指定那一组公钥和私钥进行配对,所以还需要再 ~/.ssh目录下新建一个config配置文件,内容如下:
# github密钥
Host github.com
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519_github
# gitee密钥
Host gitee.com
HostName gitee.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519_gitee
# gitea密钥
Host gitea.sqwfly.top
Port 222
HostName 123.123.123.123 #Gitea仓库所在服务器的ip地址,如果未进行转发也可用域名
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519_giteaHost
它涵盖了下面一个段的配置,我们可以通过他来替代将要连接的服务器地址, [email protected] 中的 gitee.com 即为Host
这里可以使用任意字段或通配符。
当ssh的时候如果服务器地址能匹配上这里Host指定的值,则Host下面指定的HostName将被作为最终的服务器地址使用,并且将使用该Host字段下面配置的所有自定义配置来覆盖默认的 /etc/ssh/ssh_config 配置信息。Port
自定义的端口。默认为22,可不配置,但是Gitea使用的是222端口所以需要配置User
自定义的用户名,默认为git,可不配置HostName
真正连接的服务器地址PreferredAuthentications
指定优先使用哪种方式验证,支持密码和秘钥验证方式IdentityFile
指定本次连接使用的密钥文件位置
之后再进行连接测试,可以看到均连接成功,这样就可以进行git的操作了




一般连接成功之后会在 ~/.ssh 目录下生成 known_hosts 文件
known_hosts:访问过的机器的公钥,第一次SSH其他机器时如果有权限访问,会提示是否保存信息,下次会校验访问该机器的公钥与known_hosts中的是否一致,如果不一致则不能登录过去。如果不能登录,解决方案是删除known_hosts中该条机器的记录,再重试。
如果需要克隆自建代码仓库的某一仓库可以执行,以下两种命令均可以
git clone ssh://[email protected]:222/sqwfly/blog.git
git clone ssh://[email protected]/sqwfly/blog.git如果报如下错误,很可能是 config 配置问题

3.3 Git配置多个SSH Key
转载自:Git 配置多个 SSH Key
同时使用两个 Gitee 帐号,需要为两个帐号配置不同的 SSH Key:
帐号 A 用于公司;
帐号 B 用于个人。
解决方法
1.生成帐号 A 的 SSH Key,并在帐号 A 的 Gitee 设置页面添加 SSH 公钥:
ssh-keygen -t ed25519 -C "Gitee User A" -f ~/.ssh/gitee_user_a_ed255192.生成帐号 B 的 SSH-Key,并在帐号 B 的 Gitee 设置页面添加 SSH 公钥:
ssh-keygen -t ed25519 -C "Gitee User B" -f ~/.ssh/gitee_user_b_ed255193.创建或者修改文件 ~/.ssh/config,添加如下内容:
Host gt_a
User git
Hostname gitee.com
Port 22
IdentityFile ~/.ssh/gitee_user_a_ed25519
Host gt_b
User git
Hostname gitee.com
Port 22
IdentityFile ~/.ssh/gitee_user_b_ed255194.用 ssh 命令分别测试两个 SSH Key:
ssh -T gt_a
Hi Gitee User A! You've successfully authenticated, but GITEE.COM does not provide shell access.
ssh -T gt_b
Hi Gitee User B! You've successfully authenticated, but GITEE.COM does not provide shell access.5.拉取代码:
将 [email protected] 替换为 SSH 配置文件中对应的 Host,如原仓库 SSH 链接为:
[email protected]:owner/repo.git使用帐号 A 推拉仓库时,需要将连接修改为:
gt_a:owner/repo.git
评论区