外观
用 SSH 打通本地和 GitHub
刚开始学 Git 和 GitHub 的时候,最容易绕晕人的不是命令本身,而是几件事总缠在一起:本地仓库、远程仓库、账号认证、SSH key、clone、commit、push。看起来每一步都不难,但顺序一乱,就很容易卡在“明明 GitHub 都登录了,为什么还是推不上去”。
首先要把分工搞清楚:Git 管的是你本地的历史,GitHub 管的是远程仓库,SSH 管的是身份认证。可以把 SSH 理解成“给 GitHub 看的一把钥匙”:私钥留在自己电脑上,公钥放到 GitHub 账号里。以后 clone、pull、push 的时候,GitHub 就靠这把钥匙认机器。
这里还有一个很容易混淆的点。GitHub 现在不再接受“账号密码”直接用于 Git 操作,推荐做法有两种:一种是 SSH,另一种是 HTTPS + personal access token (PAT)。如果只是想稳定省心地用下去,SSH 往往更合适。
先看本机上有没有现成的 SSH key:
ls -al ~/.ssh如果能看到 id_ed25519.pub、id_rsa.pub 这类文件,说明机器上可能已经有密钥。.pub 是公钥,对应的无后缀文件是私钥。如果目录不存在,或者里面没有这些文件,就直接生成一套新的。现在一般推荐用 ed25519:
ssh-keygen -t ed25519 -C "your_email@example.com"这里的邮箱通常填自己的 GitHub 邮箱,主要是备注。路径没特殊需求就一路回车,passphrase 想更安全就设,不想折腾也可以先留空。
生成完之后,可以把它交给 ssh-agent 管理:
eval "$(ssh-agent -s)"这条命令的作用,是启动一个专门代管 SSH 私钥的后台进程,并让当前终端知道以后该去哪里找它。
然后准备一下 ~/.ssh/config。这个文件默认不一定存在;如果没有,可以自己创建,用来告诉 SSH 默认该用哪把私钥:
touch ~/.ssh/configUbuntu 上,~/.ssh/config 一般会写成这样:
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519然后执行:
ssh-add ~/.ssh/id_ed25519这样以后 SSH 连接 GitHub 时,就会优先用这把私钥。
接下来还要把公钥贴到 GitHub,不然 GitHub 不认识这台机器。公钥内容可以这样看:
cat ~/.ssh/id_ed25519.pub然后去 GitHub 的 Settings -> SSH and GPG keys,点 New SSH key,把这段公钥贴进去。到这一步,GitHub 才真正认识你这台机器。
比较有用的一个习惯,是不要一上来就急着 clone 或 push,而是先测一下 SSH 通不通:
ssh -T git@github.com如果第一次连接 GitHub,终端可能会让你确认主机指纹,输入 yes 就行。只要这里能过,后面的事通常就简单很多。如果过不去,可以先回头检查三件事:本机是不是在用刚生成的私钥,GitHub 账号里是不是已经加了对应的公钥,以及当前仓库是不是还在走 HTTPS。
后面就分情况了。如果这是你自己的仓库,直接用 SSH 地址 clone 就行:
git clone git@github.com:your-name/repo-name.git如果这是别人的仓库,而你只是想提改动,那通常是先 fork,再 clone 自己 fork 出来的那份。刚开始接触开源协作时,这个区别很重要,不然很容易在 GitHub 页面和本地仓库之间绕来绕去。
另外,SSH 解决的是“这台机器能不能访问 GitHub”,但 git commit 还需要知道“这次提交是谁做的”。所以最好顺手把 Git 身份也配好:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"这一步也只需要做一次。
真正开始改代码之后,常见流程其实很简单:
git status
git add <file>
git commit -m "写清楚这次改了什么"
git pushgit status 看状态,git add 把改动放进暂存区,git commit 生成一个历史节点,git push 把本地提交送到远程。这里我不太建议一上来就养成 git add . 的习惯,因为它太容易把编译产物、缓存文件、临时笔记一起带上。刚开始的时候,按文件 git add 更稳一点。
这也是 .gitignore 有用的地方。它是 Git 用来忽略文件的配置文件,通常放在仓库根目录里。像编译产物、缓存目录、日志文件、本地环境文件这类本来就不该进版本库的东西,都可以提前写进 .gitignore,这样 git status 和 git add . 时就不容易把它们一起带上。
一个很常见的 .gitignore 片段大概是这样:
node_modules/
dist/
.env
*.log第一次推送时,最好把远程和分支名都写完整:
git push -u origin main如果不确定当前分支叫什么,可以先看一下:
git branch --show-current如果默认分支叫 master 或别的名字,就把 main 换成对应分支即可。-u 的作用是建立跟踪关系,后面通常就可以直接:
git push回头看,刚开始总卡住,其实不是因为命令难,而是因为顺序没理顺。比较顺的路线一直都是:先证明“这台机器是谁”,再建立“这台机器能访问哪个 GitHub 账号”,最后再去谈 clone、commit 和 push。只要把这条线走通一次,后面再看 Git 的日常操作,心里会清楚很多。
参考资料:
版权所有
版权归属:Guisong Wu