«

»

Dec 25 2015

我再讲讲GitHub

我再讲讲GitHub

GitHub简介

GitHub是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目。你可以认为GitHub就是一个公共的、免费的、开放的Git服务器。

github.png

GitHub,免去了开发者自行维护Git服务器的麻烦,并且多了fork和Pull Request两个功能来鼓励开发者参与项目。并提供了项目wiki和issue功能,方便开发者对项目进行维护。

实战Git与GitHub

准备工作

下载 Git 和 TortoiseGit

这里以 TortoiseGit 1.8.16.0 为例

下载地址:

下载Git

下载TortoiseGit

TortoiseGit是一个Git版本控制客户端,作为Windows的外壳扩展实现。同类产品有TortoiseSVN。

tortoisegit_win_shell_interface.png

安装Git:

Windows下Git安装界面。

setup_git_1.png

Select Components界面。因为我们接下来要使用TortoiseGit作为客户端,所以不需要安装Git自带的Git Bash和Git GUI。

setup_git_2.png

环境变量设置界面。因为我们没有安装Git Bash,所以如果需要在命令行之下使用Git时就需要写Git安装目录的全路径。选择第二个选项可以将Git的安装路径加入到系统变量,就可以直接使用了。

setup_git_3.png

文本换行符设置。因为我们现在在多个平台进行工作的,所以这里建议选择第三个,即 传啥是啥 ,本地自己维护文本换行符,转码工作交给ftp或者BCompare等工具完成。

setup_git_4.png

Git Bash客户端设置,我们没有安装,不用管。

setup_git_5.png

安装TortoiseGit:

Windows下TortoiseGit安装界面。

setup_github_1.png

客户端模式选择界面,这里建议选第一项,使用基于Putty的SSH客户端

setup_github_2.png

功能选择界面,默认即可

setup_github_3.png

注册GitHub

按照网站的提示按部就班注册即可 https://github.com/join

Join_GitHub.png

生成证书

Git和GitHub均建议使用ssh证书认证,一方面比较安全,另一方面也比较便利,只要有个证书文件,就不用每次输密码。

使用TortoiseGit自带的工具PuTTYgen生成钥匙对

ssh_key.png

注意: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为例

github_fork.png

Fork & Clone

到项目页面上,点击Fork,我们就会将这个项目派生到自己的仓库中。

github_forked.png

本地运行Pageant,导入我们的私钥。注意这里要导入putty格式的私钥。(每次Pageant退出后都会清空已导入的私钥,所以每次开机都要手动运行)

Pageant.png

复制远端版本库页面中的clone地址。

clone_URL.png

在自己的本地clone项目。

Git_clone.png

这样我们就得到了本地仓库。

git_clone_result.png

Create Branch & Switch

使用Create Branch生成新的分支hello_git并切换过去

create_new_branch.png

Commit & Rebase

我们进行多次commit:

commit_log.png

因为这些commit有很多对单一功能的反复修改,并且并没有保存commit信息的价值。对这些多次的commit且没有必要分开保存各个commit信息的commit,我们用rebase将多个commit进行合并。

我们这里基于master进行rebase,注意这里需要勾选Force Rebase。

右键点击我们的commit,会弹出菜单:

rebase.png

解释一下

  • pick:保留此commit,不做更改
  • squash:将此commit与上一个commit合并,并可以修改合并后的commit
  • edit:保留此commit,但可以更改此commit的信息
  • skip: 忽略这个commit,此次commit的修改均被忽略(建议不使用)

注:Git的rebase要比TortoiseGit的rebase强大且复杂得多,TortoiseGit只是使用了一部分Git的功能。

我们将前三个commit进行合并,忽略第四个commit,更改第五个commit的commit信息,将第六个和第七个commit合并。如图:

rebase2.png

进行rebase,根据提示更新commit信息。最终我们的多个commit信息就会重建为这三个commit:

commit_log_2.png

Merge

我们将现在的分支hello_git与master合并。

首先先使用switch切换回master:

git_switch.png

在切换完成后,面板上就有Merge按钮,我们先不使用这个按钮。

git_switch_result.png

进入Merge,From中选择Branch hello_git,点击ok,TortoiseGit就会自动完成Merge。

git_merge.png

git_merge_result.png

如果在switch时使用Merge按钮,那么在自动完成Merge成功后,面板上还会有Remove branch,表示可以安全删除分支。此刻点击Remove branch就会删除hello_git分支。

Push & Pull request

现在我们将master分支的代码推送到GitHub上的仓库中

git_push.png

成功后我们进入我们的GitHub上的网页中。远端仓库中的代码已经更新了。

github_page.png

注意这个时候我们的代码仍然是保存在我们自己的仓库中的,而非我们Fork的原仓库。对于开源项目,我们需要提交将自己的代码提交到项目负责人的仓库进行合并,但项目负责人并不会注意到我们的修改,所以我们需要发起Pull request请求。

github_page_pull_request.png

请求发送后,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

  1. 且听风吟

    今天是2016年第一天,愿博主新年快乐!同时也欢迎博主光临我的小站!

  2. 慕若曦

    那天折腾ACE和GIT折腾到想吐……至今没看懂ACE用GIT托管是怎么玩的……

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据