GitHub概念与常用命令
A.为什么GitHub需要SSH Key?
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
SSH(SecureShell)是目前比较可靠的为远程登录会话和其他网络服务提供安全性的协议。
SSH协议可以有效防止远程管理过程中的信息泄露问题,通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
传统的网络服务程序,如FTP、Pop和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据 传给真正的服务器。
SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的”通道”。
B.私钥和公钥到底是什么概念?
简单说,公钥就是你的银行帐户,这个可能别人也知道,但只有手上有信用卡或是存折才能有资格去试帐户密码。所以这个信用卡和存折就是你的私钥。所以这个私钥得保存好。
也就是说,那个id_rsa文件你得保存好,可以弄到U盘上,随身带着。而id_rsa.pub得改成系统默认识别的authorized_keys并保存在.ssh文件夹下
C.Clone与Download区别
在github上找到感兴趣的项目,可以fork也可以clone进行代码学习和修改,clone可以直接Download。
-
fork和clone在自己的Github复制一个在线项目,拥有完全的权限,可以push。
-
Download只是本地一个复制版本,无法对其进行push(clone缺少.git文件夹信息)。可复制.git文件夹到Download文件夹中,可进行操作。
D.添加Github密钥
1.安装Git
sudo apt install git
2.注册账号
Github 注册账号为:YourAccount@email.com
3.生成密钥
在本地ubuntu电脑操作:
$ ssh-keygen -C "YourAccount@email@git.com" -f ~/.ssh/github
-C 设置注释文字,比如你的邮箱
-f 指定密钥存储文件名,会生成 github 和 github.pub 两个密钥
回车后,遇到提示输入 yes 即可,剩下一路回车,密钥文件就在指定路径下生成了。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/wingbot/.ssh/github.
Your public key has been saved in /home/wingbot/.ssh/github.pub.
The key fingerprint is:
c3:88:fa:1b:84:ff:66:f3:67:b4:90:d8:67:fa:98:80 YourAccount@email@git.com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . o |
| . o .oS. |
| + .. +.+ |
| . E . * . |
| . o+..o+ |
| o+.o++. |
+-----------------+
4.确保ssh-agent使能
$ eval "$(ssh-agent -s)"
Agent pid 21030
5.添加SSH密钥
添加SSH密钥到SSH-AGENT:
$ ssh-add ~/.ssh/github
Identity added: /home/wingbot/.ssh/github (/home/wingbot/.ssh/github)
6.复制密钥
打开文件并复制。
$ gedit ~/.ssh/github.pub
7.在Github上添加SSH密钥:
账号头像 → Settings → SSH and GPG keys → New SSH key → 将复制密钥粘贴到key窗口中 → Add SSH key。
- Title 随便填写
- Key 为 ~/.ssh/id_rsa.pub的内容
8.测试密钥是否成功
$ ssh -T git@github.com
Hi YourAccount! You've successfully authenticated, but GitHub does not provide shell access.
成功!!!
E.设置本地与远程Github的第一个仓库
1.设置个人信息
下面的名字是github注册时仓库owner名字
$ git config --global user.name "John Doe"
$ git config --global user.email "YourAccount@email.com"
2.在Github创建仓库(repository)
3.在本地创建仓库文件夹
$ mkdir -p %folder%
$ cd %folder%
4. 初始化git仓库
$ git init
Github会自动读取你的README内容并显示在项目简介中,因此先创建README.md
$ touch README.md
$ gedit README.md
F.多人协作时的Github流程
每天开始工作前
执行以下步骤:
1.查看远程仓库
进入本地仓库工作区,查看远程仓库
$ cd %folder%
$ git remote -v
举例:
$ git remote -v
origin https://github.com/WingBot/Aruco_move_ros_pkg.git (fetch)
origin https://github.com/WingBot/Aruco_move_ros_pkg.git (push)
2.同步代码
拉取远程最新的代码
$ git pull
举例(远程仓库增加了devel分支):
$ git pull
From https://github.com/WingBot/Aruco_move_ros_pkg
[new branch] devel -> origin/devel
3.创建并切换分支
$ git checkout -b dev
第3步可分两步:
$ git branch dev
$ git checkout dev
举例:
$ git checkout -b dev
Switched to a new branch 'dev'
此时可以在本地仓库文件夹开发自己的代码,一顿增删改查骚操作。
![](https://i-blog.csdnimg.cn/blog_migrate/702ccd3aa279aaa7ac2a80b5a0c41e4b.gif)
每天结束工作前
完成开发之后,准备下班,该提交项目了。
4.确保所在分支
在本地仓库工作区进入命令行,确保自己开发的分支(dev),而不是Master
$ git branch -a
举例:
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
5.查看更改情况
提交前可查看自己的更改情况:
$ git status
举例(修改了dev分支下的README.md文件):
$ git status
On branch dev
Your branch is up-to-date with 'origin/dev'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/aruco_ros/README.md
6.提交到缓存区
核实确认修改文件,提交到缓存区
$ git add .
7.添加备注信息
$ git commit -m "xxxxx"
举例:
$ git commit -m "add notes"
[dev 6b16325] add notes
1 file changed, 1 insertion(+), 1 deletion(-)
8.切换到主干支
(个人使用,可简化跳到11)
代码在哪个分支增删,最好完全commit了,再切换到主干支(master)。
$ git checkout master
9.再次拉取代码
再次拉取远程最新代码(此时路径应在master)
$ git pull
为什么要切换到主分支并且重新拉取代码?
因为多人写作时,在编写自己的代码期间,别人可能已经上传、更新版了,这时候项目的源代码或许已经改变,因此需要重新拉取。
重新拉取的代码会重新下载到你的项目目录中,之前dev分支改变的内容会保存在你电脑的缓存区
10.本地分支合并
在自己的主干支(master)下进行分支合并
$ git merge dev
此操作仅在本地合并分支。
11.推送远程仓库
将本地合并后主干支master上传(push)到远程仓库的master
$ git push https://github.com/xxx(仓库名) master:master
$ git push origin master:master 可简写为 git push orgin A
$ git push origin xxx-dev(个人使用)
可在网页查看远程仓库是否修改成功。
12.删除本地分支
确认修改完成了,则可删除本地自己的分支dev
$ git branch -d dev (git branch -D dev 强制删除)
流程总结
我们项目中的每个人每天需要做的事情是什么呢?
项目开发过程中,每天每个成员都需要进行一次流程。大致归为:远端获取最新代码-----新建并切换到分支—(开始编写当天的代码)-----提交修改到本地(add、commit)-------切换到主干重新拉取同步代码(git pull)------本地分支合并(git merge)------推送至远端(git push)-------删除本地分支