前言
写给自己防遗忘,也留给学弟学妹学习。
vscode的SSH直接编辑远程服务器很方便,但也因此少了本地备份,由于在几个服务器上都有同名的项目,我删错了,extundelete也没恢复过来也,很后悔。本来在本地备份也不难,但是项目里有模型存档的时候,从服务器下载将很麻烦。传一份git还是保险,也确保多个节点的版本同步。通过gitignore设定需要维护的东西,还是很方便的。
1. 创建一个仓库
在github的个人主页里面→New→该填的填一填,README.md和.gitignore和license我建议都不要勾选,这些都可以以后自己传,初学者早建立容易给自己找麻烦。
2.使用SSH key登录
在个人头像点击setting,找到SSH and GPG keys,将公钥的内容放进去,本地留一个私钥文件,保持同名。
生成密钥的指令:ssh-keygen -t rsa
# 回车保存在默认的位置/home/你的的目录/.ssh/id_rsa, cd .ssh 可以进入这个文件,里面有id_rsa和id_rsa.pub两个文件。
测试是否能连接到github:ssh -T git@github.com
为了避免每次登录bash都要激活ssh,可以在根目录下建立一个.gitconfig文件,里面输入内容
[user]
name = xxx
email = xxx@xxx.edu.cn
新机器上弄环境发现又忘了RSAkey怎么弄,想起来以前是通过ssh-add file把密钥加入ssh-agent中去,但这样需要每次都要先启动ssh-agent bash,而把这些命令加入bashrc中去又莫名的影响了我的bash和sftp的启动。最后最有效的方法,是在.ssh目录下建一个config,内容如下。
Host github.com
User username
IdentityFile ~/.ssh/ras_file_name
有了这个,每次登录都可以直接访问仓库了,不用再搞ssh-agent,非常有效,。
在连接远程仓库的时候需要使用SSH地址,否则HTTP每次都会要求输入账号和密码。
3. 关联远程仓库
很多博客就只贴指令,没讲指令各个参数的含义,很不方便,尤其是微软把远程默认分支从master改成了main以后,因此这里写一些踩过的坑。
首先需要初始化本地仓库, 输入 cd [项目名] 进入我们的项目,然后输入:git init
这样就完成了初始化,会建立一个.git的文件,也同时建立了一个本地分支,名字叫master,可以通过git branch 查看现有分支。
(1) 添加远程仓库:git remote add [远程名] [远程地址],举个栗子
git remote add origin git@github.com:xxxxx.git
这里origin是大家习惯的名字(虽然我感觉叫github更好),然后可以通过 git remote -v 来查看现有远程仓库。
然后有两个比较重要的命令,一个是git pull,从远程拉取,和远程保持同步,一个是git push,推送到远程。想要push,必须先和远程保持同步,也就是说一般先pull了再push。我们远程创建的分支里有license之类的东西的时候,就开始把小白搞的难受了。
(2) 所以先从远程把东西pull回来:
git pull [远程主机名] [远程仓库名]:[本地仓库名]
举个栗子:git pull origin main:master
好多博客不讲冒号的用法,因为有的项目是先整包传了远程或者有过fork,再git clone回来的,自然关联好了,而我们现在的逻辑是,把本地的项目传到远程仓库并关联,冒号用法比较重要。
(3)接下来先在本地仓库提交
git add .
git commit -m [一些注释]
这里add .的意思是将当前目录全部内容都选中(注意那个点不要漏,和add直接有空格),commit是提交修改的意思,-m 后面加一些本次提交修改的说明,例如'init commit' 'update' 'fix a bug',-m不能省略,不然会有一堆很麻烦的东西要填。引号是要的哦,表示是字符串。
(4)上传远程主机
git push [远程主机名] [本地仓库名]:[远程仓库名]
可以发现都是冒号左侧是source,冒号右侧是target。
举个栗子:git push origin master:main
第一次上传的时候,可以是用 git push -u origin master:main
这里 -u 的意思是upstream,会使本地仓库与远程仓库构建关联,以后可以省略只写
git push 和 git pull 而不需要后面的东西了。
4.进阶的学习
可以进一步学习 fetch, merge, 之类的操作,如下图所示,菜鸟的教程也不错:
另外,单人开发,处理冲突我还比较喜欢用stash。