Github
Github是最大的Git版本库托管商,平台上有着成千上万的开发者,涉及个人以及团体的项目,大量开源项目使用GIthub托管。最主要的是Github可以给用户提供免费的托管服务。
之前配置过这里就简单介绍下,首先打开Github官网httsp://github.com
点击注册,需要用户名,邮箱和密码。然后配置本地SSH连接Github。前边使用过所以这里就简单说一下:鼠标右键Git Bash Here,需要配置ssh密钥,输入下面命令根据提示输入两次github账户密码,生成ssh密钥,没有修改路径情况下密钥保存在C:\Users\用户名.ssh。
ssh-keygen -t rsa -C "邮箱地址"
生成SSH密钥
打开id_ras.pub文件,复制里面的内容。然后登陆GitHub,进入settings界面
配置完ssh密钥后在Bash窗口中输入ssh -T git@github.com,验证是否配置成功,通过配置可以通过Git Bash
访问GIthub中的仓库。
参与项目
拉取请求
当我们想要参与Github上某个项目,但是没有推送权限
,这个时候可以对这个项目进行“Fork”(派生)。通过Fork在个人Github中创建一个完全属于自己的项目副本,然后对其有推送权限,通过创建拉取请求(Pull Request,简称PR
)来将改动添加到原项目版本。*在我们创建拉取请求后,就会开启一个可供审查代码的板块,项目的拥有者和贡献者可以在此讨论相关修改,直到项目拥有者对其感到满意,并且认为这些修改可以合并到版本库中。
当我们对项目有写
的权限时候,可以推送分支到版本库,并在main
分支提交一个拉取请求,并在此进行代码审查和讨论,不需要Fork。
完整流程
- Fork一个项目
- 从
main/master
分支创建一个新的分支 - 提交一些修改来改进项目
- 将这个分支推送到Github上
- 创建一个拉取请求
- 在开启的项目审查代码板块中讨论,继续改进等
- 项目的拥有者将修改合并到项目原版本中并关闭拉取请求
- 将更新后的的版本同步到自己Github的Fork中
拉取制成补丁
当我们的拉取请求过时或其他原因不能干净地合并,需要进行修复才能让项目拥有者对其进行合并。有两种方法进行修复,一种可以将分支变量到目标分支中,但是上一节中我们讲到变量无法在版本历史中留下痕迹,会造成混乱。另一种方法是使用git remote add 仓库名 URL
将远程项目仓库添加到本地,从远端抓取内容,合并主分支内容到本地我们修改的分支中,修复所哟问题然后重新推送到拉取请求使用的分支。
完整流程
- 将原版本库添加到本地
- 从远成仓库抓取最新内容,这里注意使用
git fetch
不自动合并 - 将仓库主分支内容合并到我们本地分支
- 修复产生的冲突
- 推送回同一个分支
详细内容参考Git官网-Github对项目做出贡献
维护项目
新建仓库
打开Github然后点击头像左侧+New repository
创建新仓库
托管在Github上的公开(public)项目,可以通过HTTPS或SSH访问,HTTPS:https://github.com/username/projectname
,SSH:git@github.com:username/projectname
,因为使用协议不同用户访问的权限也不一样使用SSH协议的时候用户必须有一个账号而且上传SSH密钥才能访问项目。
添加合作者
如果项目想要其他也参与,他们提交代码需要权限,在设置中添加为合作者,然后他们对项目和Git版本库都有读写的权限。
管理合并请求
和并请求可以来自Fork的一个分支,或者同一仓库的另一个分支。唯一的区别是fork过来的通常对我们的项目没有权限的,而内部推送通常都可以互相访问。
设置邮件通知,有人对我们项目修改然后发了一个和并请求,会收到平台发送关于和并请求的提醒邮件。
给我们所发送的邮件中包含:修改的统计结果,包含修改的文件以及改变了多少列表。还包含进行和并请求操作的链接。或者把代码拉取下来在本地进行合并,使用git pull url patch-l
合并远程分支。或者也可以将fork地址添加为一个remote
进行抓取和合并。Github网站上还有一个Merge
按钮,它会进行"non-fast-forward’合并,并产生一个合并提交记录。
和并多个请求
当我们正在处理多个和并请求的时候,不可能像上面的将他们全部拉取下来或者添加到remote中去。实际上Github在服务器上把和并请求分支视为一种“假分支”,默认情况下克隆到本地的时候不会克隆他们,但还是隐式存在,通过git ls-remote 原项目仓库地址/远程版本库在本地名称
就可以看到所有分支,标签以及其他引用。当项目有和并请求的时候,会看到refs/pull
开头的引用。他们实际上是分支,但因为他们不在refs/heads
中,所以正常情况下克隆的时候不会抓取下来。
每个合并请求有两个引用——其中以 /head 结尾的引用指向的提交记录与合并请求分支中的最后一个提交记录是同一个。 所以如果有人在我们的版本库中开启了一个合并请求,他们的分支叫做 bug-fix, 指向 a5a775 这个提交记录,那么在 我们的 版本库中我们没有 bug-fix 分支(因为那是在他们的 fork 中), 但我们 可以 有一个 pull/<pr#>/head 指向 a5a775。 这意味着我们可以很容易地拉取每一个合并请求分支而不用添加一堆远程仓库。
$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
* branch refs/pull/958/head -> FETCH_HEAD
连接到 origin 这个 remote,下载名字为 refs/pull/958/head 的引用,燃火把指针指向.git/FeTCH_HEAD
下面想要的提交记录,然后使用git merge FETCH_HEAD
合并到我们的分支中。
滑油一种方法合并所有的请求,并且连接到远程仓库的时候保持更新。打开.git/config
查找origin
远程仓库。
url = https://github.com/libgit2/libgit2
fetch = +refs/heads/*:refs/remotes/origin/*
以 fetch = 开头的行是一个 “refspec.” 它是一种把 remote 的名称映射到你本地 .git 目录的方法。 这一条(就是上面的这一条)告诉 Git,“remote 上refs/heads
下面的内容在我本地版本库中都放在refs/remotes/origin
。” 你可以把这一段修改一下,添加另一个 refspec:
[remote "origin"]
url = https://github.com/libgit2/libgit2.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
添加的这行告诉Git所有像refs/pull/*/head
的引用应该在本地版本库像refs/remotes/origin/pr/*
一样存储在。保存完后,使用git fetch
所有和并请求在本地像分支一样都展现,但他们是只读的,执行抓取他们都会更新。