一、在GitHub上创建一个远程仓库 

仓库不从远程下载_仓库不从远程下载

 


 二、两种方式上传项目到 GitHub

仓库不从远程下载_推送_02

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

仓库不从远程下载_仓库不从远程下载_03

git bash 执行命令,生命公钥和私钥

$ cd ~
yuanyu@DESKTOP-0354J7H MINGW64 ~
$ pwd
/c/Users/yuanyu

ssh-keygen -t rsa

ssh-keygen命令解释:https://www.jianshu.com/p/d863d4e8f308 

如何在同一台电脑上使用两个github账户:



注:输入命名后 敲 三个回车,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

执行命令完成后,在window本地用户.ssh目录 C:\Users\用户名\.ssh 下面生成如下名称的公钥和私钥:

$ cd ~/.ssh/

仓库不从远程下载_git_04

这里的私钥,我们要保存好。公钥我们等会需要复制到 GitHub 中。

 1.3. 复制公钥到 GitHub 上,实现免密传输

仓库不从远程下载_git_05

这里的 Key是我们前面生成(ssh-keygen -t rsa)的公钥,我们用记事本打开复制到GitHub中即可。

 

仓库不从远程下载_git_06

1.4. 执行命令

创建远程库地址别名

  • git remote -v
  • git remote add[别名][远程地址]

git remote add origin git@github.com:yuanyu1997/test.git

推送

git push[别名][分支名]

git push -u

注:-f 参数是强制推送的意思 

仓库不从远程下载_推送_07

 

 

origin 是我们远程仓库的代号(https://github.com/yuanyu1997/test.git)这个相当于为我么的远程仓库取一个别名(仓库代号不好记),请看下面的演示

 

仓库不从远程下载_远程仓库_08

我们也可以删除这个 origin

仓库不从远程下载_推送_09

 所以我们完全可以这样执行命令

  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

仓库不从远程下载_仓库不从远程下载_10


三、克隆远程仓库的项目

命令

  • git clone[远程地址]

 效果

  1. 完整的把远程库下载到本地
  2. 创建 origin 远程地址别名
  3. 初始化本地库

四、团队成员邀请

仓库不从远程下载_git_11

如果是同一个电脑,如果需要切换账号,我们需要手动清除Windows记住的密码

仓库不从远程下载_远程仓库_12

没有加入团队,克隆代码然后修改代码,提交到远程仓库中

仓库不从远程下载_git_13

 

仓库不从远程下载_推送_14

被邀请的成员就会收到邀请信息,点击同意即可

仓库不从远程下载_git_15

加入团队后就可以正常的push项目了 


五、拉取操作 pull

现在有两个开发者,开发者(yuanyu1997)创建了项目,并且把项目push到了GitHub上了,然后也邀请另一个开发者(xiaohao1997)加入了团队,xiaohao1997克隆了yuanyu1997上传的项目,这个时候修改了代码在提交到远程仓库这个是没有问题的,应为我是在最新的基础上进行修改,然后在提交的。

仓库不从远程下载_远程仓库_16

拉取

  • pull=fetch+merge
  • git fetch[远程库地址别名][远程分支名]
  • git merge[远程库地址别名/远程分支名]
  • git pull[远程库地址别名][远程分支名]

由于另外一个开发者(xiaohao1997),修改并提交项目到GitHub上了,这个时候另外一个开发者(yuanyu1997)就需要拉取项目到本地

抓取和合并分开来操作,这样当我们操作很复杂的时候,我们可以暂时不对本地文件进行合并,等我们看好(重远程库下载的东西)了再去合并

当我们所做的修改不太容易产生冲突的时候直接使用 git pull 一键合并即可

git fetch origin master

仓库不从远程下载_推送_17

查看我们下载的文件

 git checkout origin/master

仓库不从远程下载_推送_18

切换回去 git checkout master

仓库不从远程下载_远程仓库_19

 把远程的 master 合并到本地的 master

git merge origin/master

仓库不从远程下载_推送_20

 


七、解决冲突

要点

  • 如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
  • 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。 

前面的例子,yuanyu1997 和 xiaohao1997 修改同一个文件同一个位置,两个都推送到远程仓库,这个时候只有先推送的人才能推送成功,失败的那个人必须先拉取下来然后才能够推送,这个时候拉取下来的文件既有自己的类容,也有推送成功的那个开发者修改的类容,这个时候 Git 就不能给我们做决定了,需要我们手动合并。

yuanyu1997  修改文件并且推送到GitHub 上

仓库不从远程下载_远程仓库_21

xiaohao1997  同样修改类容并推送到GitHub

xiaohao1997  这个时候已经比我们的远程库落后一个版本了,应为yuanyu1997  已经做了修改并提交到GitHub上了,但是xiaohao1997  还不知道,还是在旧版本的继承上做的修改

仓库不从远程下载_远程仓库_22

这个时候我们必须先拉取项目到本地

我们这个时候需要手动解决冲突,删除特殊符号,把文件改成我们需要的样子

仓库不从远程下载_仓库不从远程下载_23

 我这里就直接删除特殊符号

仓库不从远程下载_远程仓库_24

再次推送到远程仓库 

 注意:解决冲突以后,提交文件到本地库的时候不能带上文件名

仓库不从远程下载_仓库不从远程下载_25

 

仓库不从远程下载_git_26

为什么不是最新版就不能够接受推送呢?

类比

  • 债权人:老王
  • 债务人:小刘

 小刘就相当于GitHub

  • 老王说:10 天后归还。小刘接受,双方达成一致。
  • 老王媳妇说:5 天后归还。小刘不能接受。老王媳妇需要找老王确认后再 执行。

 八、跨团队的合作

我们有一个 huashan 项目,里面有一个项目经理 岳不群,和一个码农,现在项目经理该给码农一个任务,可是这个任务码农干不了,这个时候他就去找他的好基友东方不败帮忙

仓库不从远程下载_推送_27

1. fork

仓库不从远程下载_远程仓库_28

仓库不从远程下载_推送_29

 fork 成功后“东方不败就可以随便的修改这个fork的仓库了”

仓库不从远程下载_推送_30

仓库不从远程下载_git_31

2. 克隆到本地,修改后提交到自己Fork的GitHub上 

“东方不败”Fork项目后,把项目克隆到本地,修改并提交到自己的远程仓库中 

 

仓库不从远程下载_git_32

 

仓库不从远程下载_推送_33

仓库不从远程下载_仓库不从远程下载_34

 这个时候的修改还只是 “东方不败” Fork的项目

3. 发起 pull request 请求

仓库不从远程下载_远程仓库_35

 

 

仓库不从远程下载_仓库不从远程下载_36

 

 

仓库不从远程下载_git_37

这个时候“东方不败”就要发消息给自己基友的项目经理

 

仓库不从远程下载_远程仓库_38

 

仓库不从远程下载_git_39

仓库不从远程下载_推送_40

 

点击回复消息,这个时候这两个人就可以隔空对话了

仓库不从远程下载_仓库不从远程下载_41

仓库不从远程下载_远程仓库_42

这个时候项目经理“岳不群”就可以审核文件

仓库不从远程下载_仓库不从远程下载_43

如果项目经理决定代码没有问题这个时候就可以进行合并

切回到 Conversation

仓库不从远程下载_仓库不从远程下载_44

 

仓库不从远程下载_远程仓库_45

 这个时候项目经理就可以把远程仓库的代码拉取到本地了

仓库不从远程下载_git_46