我再讲讲GitHub
GitHub简介
GitHub是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目。你可以认为GitHub就是一个公共的、免费的、开放的Git服务器。
GitHub,免去了开发者自行维护Git服务器的麻烦,并且多了fork和Pull Request两个功能来鼓励开发者参与项目。并提供了项目wiki和issue功能,方便开发者对项目进行维护。
实战Git与GitHub
准备工作
下载 Git 和 TortoiseGit
这里以 TortoiseGit 1.8.16.0 为例
下载地址:
TortoiseGit是一个Git版本控制客户端,作为Windows的外壳扩展实现。同类产品有TortoiseSVN。
安装Git:
Windows下Git安装界面。
Select Components界面。因为我们接下来要使用TortoiseGit作为客户端,所以不需要安装Git自带的Git Bash和Git GUI。
环境变量设置界面。因为我们没有安装Git Bash,所以如果需要在命令行之下使用Git时就需要写Git安装目录的全路径。选择第二个选项可以将Git的安装路径加入到系统变量,就可以直接使用了。
文本换行符设置。因为我们现在在多个平台进行工作的,所以这里建议选择第三个,即 传啥是啥 ,本地自己维护文本换行符,转码工作交给ftp或者BCompare等工具完成。
Git Bash客户端设置,我们没有安装,不用管。
安装TortoiseGit:
Windows下TortoiseGit安装界面。
客户端模式选择界面,这里建议选第一项,使用基于Putty的SSH客户端
功能选择界面,默认即可
注册GitHub
按照网站的提示按部就班注册即可 https://github.com/join
生成证书
Git和GitHub均建议使用ssh证书认证,一方面比较安全,另一方面也比较便利,只要有个证书文件,就不用每次输密码。
使用TortoiseGit自带的工具PuTTYgen生成钥匙对
注意:TortoiseGit的PuTTY Key Generator生成的是putty格式的钥匙对,而Git客户端和GitHub使用的是openssh格式的钥匙对,所以这里要使用的是PuTTY Key Generator界面上的公钥。
再点击Save private key保存私钥。
将公钥保存到GitHub中的SSH keys中。
证书相关的工作就完成了。
GitHub概念:Fork + Pull
GitHub有一个Fork功能,用于开源项目的”Fork + Pull”模式。
将现有项目进行Fork(派生),可以生成一个属于自己的版本库,除了没有缺陷跟踪(Issue),以及标识了该项目派生之前的原路径等。
开发者可以更改自己版本库中的代码,并向原开发者/版本库发起Pull Request,原开发者就可以收到代码合并请求。
动手
接下来我们就使用TortoiseGit和GitHub完成一次Git的实际使用
关键那几步
我们复习下Git的使用步骤,并将GitHub上的Fork + Pull加入进去
- 在GitHub上新建仓库,或使用Fork派生一个项目(GitHub)
- 使用clone(或者create)创建本地仓库
- 使用commit将修改提交到本地仓库
- 使用rebase将多个commit合并为一个commit,便于记录和后期维护
- 使用Push提交本地仓库的更改至远端仓库
- 使用Pull或Fetch+Merge将远端仓库的更改同步到本地仓库
- 使用tag打标签,生成发布版本
- 使用Pull Request向原仓库发起合并请求(GitHub)
我们以项目hello_git为例
Fork & Clone
到项目页面上,点击Fork,我们就会将这个项目派生到自己的仓库中。
本地运行Pageant,导入我们的私钥。注意这里要导入putty格式的私钥。(每次Pageant退出后都会清空已导入的私钥,所以每次开机都要手动运行)
复制远端版本库页面中的clone地址。
在自己的本地clone项目。
这样我们就得到了本地仓库。
Create Branch & Switch
使用Create Branch生成新的分支hello_git并切换过去
Commit & Rebase
我们进行多次commit:
因为这些commit有很多对单一功能的反复修改,并且并没有保存commit信息的价值。对这些多次的commit且没有必要分开保存各个commit信息的commit,我们用rebase将多个commit进行合并。
我们这里基于master进行rebase,注意这里需要勾选Force Rebase。
右键点击我们的commit,会弹出菜单:
解释一下
- pick:保留此commit,不做更改
- squash:将此commit与上一个commit合并,并可以修改合并后的commit
- edit:保留此commit,但可以更改此commit的信息
- skip: 忽略这个commit,此次commit的修改均被忽略(建议不使用)
注:Git的rebase要比TortoiseGit的rebase强大且复杂得多,TortoiseGit只是使用了一部分Git的功能。
我们将前三个commit进行合并,忽略第四个commit,更改第五个commit的commit信息,将第六个和第七个commit合并。如图:
进行rebase,根据提示更新commit信息。最终我们的多个commit信息就会重建为这三个commit:
Merge
我们将现在的分支hello_git与master合并。
首先先使用switch切换回master:
在切换完成后,面板上就有Merge按钮,我们先不使用这个按钮。
进入Merge,From中选择Branch hello_git
,点击ok,TortoiseGit就会自动完成Merge。
如果在switch时使用Merge按钮,那么在自动完成Merge成功后,面板上还会有Remove branch,表示可以安全删除分支。此刻点击Remove branch就会删除hello_git
分支。
Push & Pull request
现在我们将master分支的代码推送到GitHub上的仓库中
成功后我们进入我们的GitHub上的网页中。远端仓库中的代码已经更新了。
注意这个时候我们的代码仍然是保存在我们自己的仓库中的,而非我们Fork的原仓库。对于开源项目,我们需要提交将自己的代码提交到项目负责人的仓库进行合并,但项目负责人并不会注意到我们的修改,所以我们需要发起Pull request请求。
请求发送后,GitHub会通知原项目负责人,在其收到请求后就可以进行Merge pull request,将我们的代码合并到原仓库中。合并成功后,GitHub同样也会通知Pull request的发起方(我们),通知合并成功。
而对于原仓库中的其他修改,我们也需要向自己发起Pull request(而非再次fork),方法相同。
至此,我们完成了一次对Git和Github的操作。
最后
本文只是用于Git和GitHub入门学习用的敲门砖、垫脚石,并不能成为通往熟练阶梯。关于Git和GitHub的很多经常要用到的功能(如diff、stash、merge conflict等)均没有讲,也没有提到git客户端和Merge pull request的,这些功能希望大家能自己去探索和学习。
参考资料
GotGitHub : http://www.worldhello.net/gotgithub/index.html
Git 使用规范流程 : http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
2 comments
且听风吟
2016 年 1 月 1 日 在 下午 2:49 (UTC 8) Link to this comment
今天是2016年第一天,愿博主新年快乐!同时也欢迎博主光临我的小站!
慕若曦
2016 年 2 月 16 日 在 下午 7:46 (UTC 8) Link to this comment
那天折腾ACE和GIT折腾到想吐……至今没看懂ACE用GIT托管是怎么玩的……