Git 的使用:创建 SSH key、多账号共存、提交代码及进阶使用

创建 SSH key

创建密钥

在 Windows 下,使用 Git bash,创建秘钥。

1
ssh-keygen -t rsa

在这一步可以使用-C 'comment'对秘钥进行注释。一些教程中要求在-C后写邮箱,其实写什么都可以,不写也行,注释而已。

1
ssh-keygen -t rsa -C 'comment'

默认的密钥为 2048 位,可以使用-b指定密钥位数。

1
ssh-keygen -t rsa -b 4096 -C 'comment'

之后会确认密钥文件的存放位置和文件名,如下。

1
Enter file in which to save the key (/c/Users/UserName/.ssh/id_rsa):

回车即使用括号内的默认位置和名称,如果有多个密钥文件,注意修改文件名。如果不更改存放位置,只修改文件名,直接输入想要的文件名即可。密钥的私钥文件无后缀,公钥文件无需命名,与私钥一致,以.pub为后缀。

之后会要求设置密码,回车则密码留空。

看到The key's randomart image is:和创建密钥时的随机图像,即为创建成功。

添加密钥

添加私钥至 ssh-agent,Windows 下私钥的路径为C:\Users\UserName\.ssh\id_rsa。当然在 Git Bash 里要加上引号,或这么写/c/Users/UserName/.ssh/id_rsa,或者直接~/.ssh/id_rsa

1
ssh-add ~/.ssh/id_rsa

如果上述命令无法执行,则

1
ssh-agent bash

然后在 Github 或 Gitlab 的网页端添加公钥(公钥文件为C:\Users\UserName\.ssh\id_rsa.pub)。

顺带一提,如果在创建时添加了注释,则公钥会以“空格+注释内容”结尾。

多个 Git 账号共存

创建多个 ssh-key

如果需要同时使用 Github 和 Gitlab,并同时使用ssh连接,则需创建两个密钥,如

1
2
ssh-keygen -t rsa -C 'github'
ssh-keygen -t rsa -C 'gitlab'

重复上一节的内容,添加私钥至 ssh-agent,分别添加公钥至 Github 和 Gitlab。

为不同网站配置 ssh-key

进入密钥所在的.ssh文件夹,创建配置文件。

1
2
cd ~/.ssh
touch config

config文件中写入如下内容,注意将 Github 部分的User UserName修改为实际用户名。

1
2
3
4
5
6
7
8
9
10
11
12
13
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitlab

# github
Host github.com
User UserName
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
Port 443

测试 ssh-key 的配置情况

使用ssh -T命令测试密钥配置情况。

1
2
ssh -T git@github.com
ssh -T git@gitlab.com

如果是使用该密钥,会询问是否与远程服务器建立连接,输入yes确认即可。之后会在~/.ssh文件夹下生成known_hosts文件,用以记录相应信息。

对于 Github,测试成功的信息为

1
Hi UserName! You've successfully authenticated, but GitHub does not provide shell access.

对于 Gitlab,测试成功的信息为

1
Welcome to GitLab, @UserName!

至此,密钥的创建与配置工作完成。

设置 Git 账户信息

一般将常用的 Git 账户设置为全局(global)账户,为需要使用其他账户的仓库设置局域(local)账户。

设置全局账户。

1
2
git config --global user.name 'name'
git config --global user.email 'email'

为特定仓库设置局域账户。

1
2
3
cd /Path/To/Repository
git config --local user.name 'name'
git config --local user.email 'email'

检查账户配置情况。

1
git config -l
1
git config --global -l
1
git config --local -l

GPG 签名相关

需要注意的是,这里只涉及 ssh 密钥和 Git 账户的配置,未涉及 GPG 签名的配置。如果创建了 GPG 签名,也要分账户进行类似 Git 的配置。

例如,为全局账户配置 GPG 签名。

1
git config --global commit.gpgsign true

不常用账户不使用 GPG 签名。

1
git config --local commit.gpgsign false

上述设置结果均可使用git config -l命令进行检查。

在 Git 上提交代码

基本

拉取代码到本地。

1
git pull origin master

写完代码后,在 Git bash 中进入代码文件夹下,将代码写入缓存。

1
git add .

写 commit message。

1
git commit -m "commit message"

提交至 master 分支。

1
git push origin master

进阶

给 commit 写注释

在 Github/Gitlab 网页版或者 Github 桌面版,每次提交,除了给 commit 写标题,还可以写比较详尽的注释;在命令行中,写两次-m,分别写标题和注释即可。

1
git commit -m "Title" -m "Description"
撤回本地提交

当 commit 已在本地提交,但尚未 push 至远程仓库时,若想撤回本地提交,则需使用git reset

进一步地

撤回本地提交但不撤回已修改的代码,使用git reset

撤回本地提交且撤回已修改的代码,使用git reset --hard

具体操作

首先获取 commit id(即数字+不区分大小写字母组成的 40 位字符串,或者用前 6 位也可)。

1
git log

会打印出包括仅本地提交在内的提交记录,找到想要撤回的 commit 的前一个 commit id,例如前一个 commit id为666666,则

1
git reset 666666

之后可按正常流程再次提交代码。

应用场景
  1. 单纯想撤回某次本地提交

  2. 本地仓库与远程仓库冲突,在未拉取远程仓库更新的情况下,向本地仓库进行了提交。
    即使在远程更新与本地提交未涉及相同文件时,强行拉取远程仓库,仍会产生不必要的”Merge …”提交。
    此时可以撤回本地提交,先拉取远程更新,假装无事发生。