本文是翻译的https://help.github.com/articles/using-pull-requests/ 。旨在帮助大家了解GitHub上面如何给别人的仓库提交变更,英文好的同学可以查看上述网址,获取最新的内容

Pull Request可以让你通知别人,你已经推送了一个修改到GitHub的版本库。在pull request被发送之后,感兴趣的成员可以review这些代码变动,讨论可能需要的修改,甚至在必要的时候在这之后push一些commits

本指南详细描述了从发送一个pull request(假设的),使用各种代码审查工具和管理工具,到最后完成变更的过程。

协同开发模式的快速笔记

在GitHub上面有两种流行的协同开发模式:

Fork & Pull

Fork & Pull模式让任何人都可以fork(复制的意思)一个已经存在的版本库并且提交变更到他们自己fork出来的版本库上,而不需要获得源版本库的访问权限。变更必须通过项目维护者才能放入源版本库。这种模式降低了给新贡献者带来的麻烦,在开源项目非常流行,因为它使人们能够独立工作而不需要前期的协调。

共享版本库模式

共享版本库模式在小团队和组织合作的私人项目中更为普遍。每个人都有push到单一共享版本库或者用来隔离变更的顶级分支的权限。

Pull requests 在 Fork & Pull 模式 中更加有用,因为它提供了一种方法去提醒项目维护者,在他的fork里面有变更. 但是,在共享版本库模式中,他们同样有用,当人们启动代码审查或者在合并到主分支之前讨论所有变更的时候

开始之前

本指南假设您有一个GitHub的帐户 ,你已经Fork了一个的现有版本,并push了您的更改。想要获得关于Fork和推送变更的帮助,请参阅文章——Forking a Repo

启动Pull Request

在下面的例子中,codercat在Fork自Octocat的Spoon-Knife版本库中完成了一些工作,在他的Fork中push了一个commit,并希望有人来审查和合并。

进入到你希望别人Pull变更的版本库中,点击Pull Request按钮。

  1. 切换到您的分支 分支选择下拉
  2. 点击Compare & review按钮 Pull Request 按钮

Pull request可以基于任何分支或者commit发送,但是推荐是从一个顶级分支。这样,在必要的时候,一些跟随的commit可以被push,去更新这个Pull Request。

审查要提交的Pull Request

开始审查之后,你将会进入一个审查页面,在这里你可以概览到所有在你的分支和源版本库的master分支之间的变动。你可以审查在所有commit中的注释,明白哪些文件发生了变动,看到所有在你的分支中的贡献者。
Pull Request 复审页

改变分支范围和目标版本库

默认情况下,Pull Request被认为是基于父版本库的默认分支 。在这种情况下, hubot/Spoon-Knife是contoctocat/Spoon-Knife中Fork出来的。所以这次的Pull Request被假定为基于octocat/Spoon-Knife版本库的master分支。

在绝大多数情况下,默认值将是正确的,但是,如果有任何信息不正确,您可以从下拉列表中更改父版本库和分支。点击顶部的Edit按钮,可以让你换你的头和底座,以及建立各种参考点之间的差别。这里引用可以包括:

  • 添加了tag的release
  • commit的SHA值
  • 分支名称
  • Git的历史标志(如HEAD^1 )
  • 有效的时间引用(如master@{1day} )

欲了解更多信息,请查看our help article on setting up comparisons
Pull Request 选择比较的分支

理解分支范围的最简单的方法是这样的: 基础分支( base branch )是你认为变更应该应用的分支,而头部分支( head branch )是你想被人应用的分支 。

改变基础版本库会导致Pull Request发生时候的通知名单发送变动。所有对基础版本库有push权限的人都会在新的Pull Request产生的时候收到邮件,并且在他们下次登录的时候能够在他们的仪表盘查看该Pull Request。

当您更改分支范围内的任何信息,commit和文件改动的预览区域将更新以显示新的范围。

发送Pull Request

当你准备好提交您的Pull Request,点击Create pull request按钮:
Pull Request 提交

你会被带到一个讨论页面,在这里你可以输入一个标题和说明(可选)。你仍然可以看到,当Pull Request发送时哪些commit将包括在内。

当你你输入好标题和描述,针对commit范围做了必要的自定义,审查了要发送的commit和修改的文件,按Send pull request按钮。
Pull Request 发送按钮

Pull Request会被立即发送。你会被带往一个Pull Request讨论和审核的主页。

在你的Pull Request发送之后,任何push到你的分支的commit会被自动更新上去。如果您需要更多的改变,这尤其有用。

管理Pull Request

所有经由你发送或者审核的Pull Request都可以通过仪表盘的pull request 查看。给自定版本库的Pull Request,对于所有能够访问对应Pull Request页面的人来说,也是可见的。
已有的Pull Request 列表

Pull Request仪表板和版本库的Pull Request列表支持多种筛选和排序控件。用它们来把列表缩小到你感兴趣的Pull Request

审查建议的更改

当您收到一个Pull Request,要做的第一件事就是审查这些建议的更改。Pull Request被紧密地与底层的git仓库集成,所以你可以看到如果Request被接受,哪些commit会被合并:
commit 审核页

您还可以了解所有提交,查看所有文件更改的累计差异。
差异审核页

讨论Pull Request

审查了基本说明,commit,和累积差异后,负责应用更改的人可能有问题或意见。也许是编码风格不匹配项目的指引,或变更缺少单元测试,或者也许一切看起来不错,所有事情都准备就绪。设计这种讨论会面,旨在鼓励和关注这种类型的讨论。
Pull Request 讨论

这种讨论会面从Pull Request的原始标题和描述开始,然后从那里按时间顺序显示额外的活动。任何以下类型的活动,当发生的时候将会被关注:

  • 在Pull Request中的评论。
  • 在Pull Request分支中新提交的commit。
  • 在Pull Request范围内的commit中的存在的文件和行注释。

Pull Request的评论是Markdown语法兼容的,所以你可以嵌入图像,使用预格式化文本块,或者其他Markdown支持的格式。

查看长时间存留的Pull Request

当一个功能或bug修正去了几个月,但从来没有通过或者丢弃,你经常想要仔细看看,是什么阻止这个Pull Request被解决。查看旧的但仍然活跃的Pull Request,可以使得这个工作简化。

您可以从您的版本库的Pull Request页面查看和排序长时间存在的Pull Request。
排序Pull Request

长期存在的Pull Request是至少已经存在了一个多月,并已在过去一个月内有可见活动的。该过滤器将按这样一个排序方式显示那些长期运行的Pull Request:从创作到最新的活动的时间。(完)

方法一: git-credential-winstore

今天在做一个兼容且可跨越的localStorage的实施方案,打算使用github进行项目的代码管理和版本控制。工作环境是Windows,用的git工具是msysgit。

git clone,git commit,git push。这一套下来工作的很流畅,很正常,可是有一点比较麻烦,就是每次push的时候,总是要输入一次在github上面的帐号和密码。就想着能不能在本地存储这个帐号和密码,每次push的时候就自动提交这个去验证。

Google了一下,在一个github的帮助教程的快照上面看到了详细的关于如何在push到远程仓库时,不同系统下面如何去保存验证信息。其中提到了一个软件:git-credential-winstore,这个是专门在Windows下面用来管理git的验证信息的。然后在github的官方帮助文档:上面,找到了软件的官方地址(其实上面那个快照对应的就是下面那个地址的,可能是github更新了,所以内容有些不同,过段时间,Google那边更新快照之后应该就相同了)

可是在安装git-credential-winstore.exe的时候出了问题,会提示无法识别git,软件里面给的解决方式有两种:

  1. 在系统的环境变量PATH里面加上git的安装目录
  2. 通过cmd进行安装 安装使用如下命令行

明确的指定git所在位置

git-credential-winstore.exe -i C:Program Files(x86)Gitcmdgit.exe

可惜这两种方式我试过了都失败了。最后在这个文章上才找到解决方式:git-credential-winstore.exe必须放到git的安装目录里面,在bin/文件夹下。

安装这篇文章里面指示的放置文件之后,双击安装,还是报之前的错误。不过幸运的是,通过cmd的方式进行安装成功了。

原因应该是我的环境变量设定有问题吧,不清楚C:Program Files(x86)Gitcmd和C:Program Files(x86)Gitbin应该使用哪一个,这两个目录下面都是有git.exe的。

安装完成之后,就是如何在git里面配置和使用了。

在最开始看的那篇文章里面,说的配置是这样的

git config --global credential.helper cache

作用是启用验证信息缓存功能

可是我按上面的配置之后,在push的时候,却提示:‘credential-cache’ is not a git command

很明显,配置有问题的,可是git实在是新手,只好再次Google之,然后在Stack Overflow上面看到了这个帖子
说在Windows下面,那个配置中的cache应该改成winstore,正确的命令应该是这样的:

git config --global credential.helper winstore

按照这个命令重新执行了下,果然可以,在第一次push的时候,会有个弹窗,让你输入在github上面的帐号和密码,然后再次push的时候,就不必再输入帐号和密码了。

估计那篇文章里面使用cache,是指的在Linux下的吧,而在Windows下面使用git-credential-winstore来管理验证信息,所以credential.helper就应该是winstore

方法二: _netrc

昨天(20150310),有个同事介绍了一个我认为使用上虽然啰嗦一点但是更便捷的方法,虽然在安全性上,有点无法保障。在这里跟大家介绍一下,也可以看这里原文地址

直接进入正题,步骤如下:
1. Windows中添加一个用户变量(开始-系统-高级系统设置-环境变量),名称为:HOME,值为%USERPROFILE%
设置用户变量
2. 在“开始-运行”中输入%Home%后确定,在打开的文件夹下新建一个名为_netrc的文件。
运行%Home%
新建_netrc文件
3. 用记事本打开_netrc文件,输入Git服务器名、用户名、密码,并保存,例如:

machine git.yourserver.org ---- git服务器名称
login yourlogin@email.com ---- git用户名
password yourpassword123 ---- git账号密码

不过这样有一个缺点就是你的帐号和密码会以明文的方式存储了

方法三: Git Credential Manager for Windows

这个是今天(20180530)在自己的新windows设备上尝试提交代码,一直需要帐号密码,前面两个方法都觉得麻烦,所以重新搜索了新的在windows下git凭据本地存储的方法。

Git Credential Manager for Windows这个管理器在2.11.0版本开始就已经在git的安装包里面了,不过前提是你安装的时候有勾选(默认没勾选)

如上图所示,安装的时候,对应勾选即可。

在安装成功之后,打开Git Bash,然后输入命令git config --global credential.helper manager

完事!它会自动的在你需要的时候提供相关的凭据来跟远端服务器做校验

我认为第三个方法是相对而言最方便和安全的方案,推荐大家使用

转眼间,这个文章已经五年了,哈哈