一、在GitHub上创建一个远程仓库
二、两种方式上传项目到 GitHub
Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。如果使用ssh方式就需要客户端先生成一个密钥对,即一个公钥一个私钥。然后还需要把公钥放到githib的服务器上。这两种方式在实际开发中都用应用,所以我们都需要掌握。
1. 通过 ssh 上传项目
缺点:只能为一个账号设置
ssh协议
什么是ssh?
SSH 为 Secure Shell(安全外壳协议)的缩写,由 IETF 的网络小组(Network Working Group)所制定。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
基于密匙的安全验证
使用ssh协议通信时,推荐使用基于密钥的验证方式。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
1.2. ssh密钥生成
在windows下我们可以使用 Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash
git bash 执行命令,生命公钥和私钥
$ cd ~
yuanyu@DESKTOP-0354J7H MINGW64 ~
$ pwd
/c/Users/yuanyussh-keygen -t rsa
ssh-keygen命令解释:https://www.jianshu.com/p/d863d4e8f308
如何在同一台电脑上使用两个github账户:
注:输入命名后 敲 三个回车,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
执行命令完成后,在window本地用户.ssh目录 C:\Users\用户名\.ssh 下面生成如下名称的公钥和私钥:
$ cd ~/.ssh/
这里的私钥,我们要保存好。公钥我们等会需要复制到 GitHub 中。
1.3. 复制公钥到 GitHub 上,实现免密传输
这里的 Key是我们前面生成(ssh-keygen -t rsa)的公钥,我们用记事本打开复制到GitHub中即可。
1.4. 执行命令
创建远程库地址别名
- git remote -v
- git remote add[别名][远程地址]
git remote add origin git@github.com:yuanyu1997/test.git
推送
git push[别名][分支名]
git push -u
注:-f 参数是强制推送的意思
origin 是我们远程仓库的代号(https://github.com/yuanyu1997/test.git)这个相当于为我么的远程仓库取一个别名(仓库代号不好记),请看下面的演示
我们也可以删除这个 origin
所以我们完全可以这样执行命令
git push -u git@github.com:yuanyu1997/test.git
git push -u origin master 意思是把本地这个仓库推送到主分支(master )上,-u 可以不要
2. 通过 Https上传项目
直接在命令行中执行命令即可,中间会叫你输入用户名和密码
git remote add origin https://github.com/yuanyu1997/test.git
git push -u origin master
三、克隆远程仓库的项目
命令
- git clone[远程地址]
效果
- 完整的把远程库下载到本地
- 创建 origin 远程地址别名
- 初始化本地库
四、团队成员邀请
如果是同一个电脑,如果需要切换账号,我们需要手动清除Windows记住的密码
没有加入团队,克隆代码然后修改代码,提交到远程仓库中
被邀请的成员就会收到邀请信息,点击同意即可
加入团队后就可以正常的push项目了
五、拉取操作 pull
现在有两个开发者,开发者(yuanyu1997)创建了项目,并且把项目push到了GitHub上了,然后也邀请另一个开发者(xiaohao1997)加入了团队,xiaohao1997克隆了yuanyu1997上传的项目,这个时候修改了代码在提交到远程仓库这个是没有问题的,应为我是在最新的基础上进行修改,然后在提交的。
拉取
- pull=fetch+merge
- git fetch[远程库地址别名][远程分支名]
- git merge[远程库地址别名/远程分支名]
- git pull[远程库地址别名][远程分支名]
由于另外一个开发者(xiaohao1997),修改并提交项目到GitHub上了,这个时候另外一个开发者(yuanyu1997)就需要拉取项目到本地
抓取和合并分开来操作,这样当我们操作很复杂的时候,我们可以暂时不对本地文件进行合并,等我们看好(重远程库下载的东西)了再去合并
当我们所做的修改不太容易产生冲突的时候直接使用 git pull 一键合并即可
git fetch origin master
查看我们下载的文件
git checkout origin/master
切换回去 git checkout master
把远程的 master 合并到本地的 master
git merge origin/master
七、解决冲突
要点
- 如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
前面的例子,yuanyu1997 和 xiaohao1997 修改同一个文件同一个位置,两个都推送到远程仓库,这个时候只有先推送的人才能推送成功,失败的那个人必须先拉取下来然后才能够推送,这个时候拉取下来的文件既有自己的类容,也有推送成功的那个开发者修改的类容,这个时候 Git 就不能给我们做决定了,需要我们手动合并。
yuanyu1997 修改文件并且推送到GitHub 上
xiaohao1997 同样修改类容并推送到GitHub
xiaohao1997 这个时候已经比我们的远程库落后一个版本了,应为yuanyu1997 已经做了修改并提交到GitHub上了,但是xiaohao1997 还不知道,还是在旧版本的继承上做的修改
这个时候我们必须先拉取项目到本地
我们这个时候需要手动解决冲突,删除特殊符号,把文件改成我们需要的样子
我这里就直接删除特殊符号
再次推送到远程仓库
注意:解决冲突以后,提交文件到本地库的时候不能带上文件名
为什么不是最新版就不能够接受推送呢?
类比
- 债权人:老王
- 债务人:小刘
小刘就相当于GitHub
- 老王说:10 天后归还。小刘接受,双方达成一致。
- 老王媳妇说:5 天后归还。小刘不能接受。老王媳妇需要找老王确认后再 执行。
八、跨团队的合作
我们有一个 huashan 项目,里面有一个项目经理 岳不群,和一个码农,现在项目经理该给码农一个任务,可是这个任务码农干不了,这个时候他就去找他的好基友东方不败帮忙
1. fork
fork 成功后“东方不败就可以随便的修改这个fork的仓库了”
2. 克隆到本地,修改后提交到自己Fork的GitHub上
“东方不败”Fork项目后,把项目克隆到本地,修改并提交到自己的远程仓库中
这个时候的修改还只是 “东方不败” Fork的项目
3. 发起 pull request 请求
这个时候“东方不败”就要发消息给自己基友的项目经理
点击回复消息,这个时候这两个人就可以隔空对话了
这个时候项目经理“岳不群”就可以审核文件
如果项目经理决定代码没有问题这个时候就可以进行合并
切回到 Conversation
这个时候项目经理就可以把远程仓库的代码拉取到本地了