在安装VIM插件的时候,总是遇到GitHub,虽然很早就注册了Github的账号,一直没有使用。实际上,不知道如何使用。在看到网友Ruchee 用GitHub做备份之后,才想到,自己也要学着如何去使用GitHub。
Git是2005年Linus Torvalds 为了帮助管理 Linux(R) 内核开发而开发的一个开放源码的版本控制软件,正如所提供的文档中说的一样,”Git 是一个快速、可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。”
安装
系统平台:Ubuntu 12.04 LTS
命令: sudo apt-get install git-core git-gui git-doc
备注:git-core是必须安装的,git-gui是使用tcl/tk构建的GUI程序,git-doc就是git的文档
github是一个基于git的代码托管平台,付费用户可以建私人仓库,一般的免费用户只能使用公共仓库,也就是代码要公开。对于一般人来说公共仓库就已经足够了。
如果只是需要将github上感兴趣的代码拷贝到本地,自己进行修改使用,而不打算共享发布的话,其实不申请帐号也没有关系,只需要git clone https://xxx.git,将代码到复制本地就可以了,前提是别人的代码库是公共的。
首先去github.com上注册一个帐号,具体的注册流程就不赘述了。
然后,进行全局配置,设置用户名和email。git使用这个来验证每个提交者。除此之外github会使用这些信息来与你的github账号相联系。下面的名字应该是你真实的名字,而不是要GitHub的用户名。
git config --global user.name "Your True Name"
git config --global user.email "Your Email Address"
备注:这里的邮件地址必须是GitHub中设置的主邮件地址,和下面使用ssh-keygen中使用的地址一致。
然后,设置SSH Keys
github使用ssh keys来确保你的电脑与github的连接有安全性,所以需要在本地创建验证用的秘钥,设置过程很简单,步骤如下:
步骤一:检查已有的ssh keys。即$HOME/.ssh/文件下是否存在xxrsa这样的文件
如果没有这样的文件或者目录。(No such file or directory)则跳到步骤三。否则继续。
步骤二:备份已有的ssh keys。
步骤三:产生一个新的 ssh key(ssh-keygen -t rsa -C '[email protected]')。注意邮箱的地址根据个人的情况而定。生成过程中需要输入passphrase(用来验证授权),生成结束后,终端输出key fingerprint和key's randomart image,也不知道有什么作用。
最后,会在$HOME/.ssh/生成这样的两个文件(如果生成使用的默认的文件名,当然可以修改为其他):id_rsa,id_rsa.pub(公钥)
步骤四:在gitHub里单击账户设置(Account Settings)。点击SSH 公钥(SSH Keys),点击添加另一个公钥。打开前面生成的id_rsa.pub 文件。(注意不要编辑,添加空格或者换行。)然后把里面的内容复制粘贴到下面的key输入栏中。备注:复制的时候要一点不差,一个符号一个空格都可能会导致密钥不能使用,其中
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
就是因为不能识别密钥而没有权限导致的。
步骤五:测试连接是否畅通,可以使用如下的命令:ssh -T [email protected] 或者ssh -V [email protected]
此时,出现如下的问题(Ubuntu中):
ssh: connect to host github.com port 22: Connection timed out
在google上搜”使用ssh连接github时,出现timeout“,找到了答案,ssh阻塞了22端口。解决方案也很简单,修改ssh的配置文件。关于修改配置,存在两种解决方法,一种是/etc/ssh/ssh_config中修改全局配置,一种是在用户主目录下.ssh/中添加配置文件,这里我选择的后者。
cd ~/.ssh/
touch config
将如下内容添加到config中(当然,在全局文件中也是添加相同的内容):
Host github.com User git Hostname ssh.github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa Port 443
备注:参考[4]介绍防火墙和ISP不会阻塞443端口。
在修改ssh的配置文件(config或ssh_config)之后,键入ssh -T github.com,可需要输入步骤三中创建的passphrase。注意:在输入passphrase的时候,不要使用外接键盘中小键盘上数字健,我试了好几次,就是不识别。
在看到如下的输出则说明连接成功了:
Hi yourname! You've successfully authenticated, but GitHub does not provide shell access.
此时已经将Git和GitHub设置完成了。
备注:在参考[1]中看到一个设置GitHub的指令环,Account Settings->Account Admin,这里在我GitHub上没有看到Account Admin,所有就没做任何处理。
利用github来管理自己的项目和参与开源工作了,大体上使用git分为三种方式,介绍如下。
这种情况是自己在本地有一些代码,需要利用 github 来管理自己的项目,可以按照下面的步骤进行。
1、建立仓库
在需要建立项目的文件夹中,使用git init 进行仓库的建立。完成后,可以看到文件家中多了一个 .git 隐藏目录。
2、添加文件
使用 git add . 来进行初始文件的添加。这里 . 表示将文件夹下所有的文件都添加进去,我们也可以指定文件进行添加。
3、提交文件
使用 git -m commit -m 'comment' 提交,可以将编辑的内容进行提交。
通过 git show 可以看到项目的一些状态。
这是代码已经在本地管理了,但是本地管理完全体现不出git的优势。
1、如果需要将自己的项目托管在github.com上,首先需要创建项目。登录后进入github.com首页,在 Dashboard 中选择 Create New Repository,填入相关信息后,项目就创建成功了。
2、创建后之后.会跳转到一个页面.其中有指示接下来该怎么做的。
有些时候你发现自己想要为别人的项目做贡献.或者希望来使用别人的项目做为自己的起点.也就称之为Fork。
在你想fork的项目的首页.找到fork按钮,点击然后等待.
接下来设置本地仓库,首先cd本地的工作目录下。
A . 克隆项目.
$ git clone [email protected]:username/projectname.git
B. 远程配置.
当你克隆了一个项目之后.它的remote选项默认origin,指的是在github上fork的.而不是在原本项目的仓库.为了跟踪原本的仓库,需要添加upstream的选项.
$cd projectname
$git remote add upstream git://github.com/username/projectname.git
$git fetch upstream
接下来.你要做的就是.
A.推送提交.
一旦做出某些提交,可能想要将其推送到github上fork的项目库.这和平常的项目一样。
$git push origin master
接收upstream 变更.
如果fork的原项目的代码库变更了,可以使用如下命令来更新本地的仓库.
$ git fetch upstream
$ git merge upstream/master
关于Git的命令具体请参见Git手册,就个人使用并搭建了SVN服务器的简单经历而言,版本控制库之间的命令,有些命令是相似的。对于命令行的学习,个人认为没什么捷径,多用用,不记得的就man git 查看一下,常用命令选项就是init,add,commit, push,pull,log这类的,用熟了就记得了。
git init # 初始化本地Git版本库
git add # 暂存文件,如果使用.表示当前目录及其子目录
git commit -m “first commit” # 提交,-m选项后跟内容为提交所用的注释
git commit -a -m "concerate message" #将git add与git commit用一个指令完成
git remote -v # 查看当前项目远程连接的是哪个版本库地址
git push # 将本地修该同步到github(远程)上的代码库中
git push origin master # 将本地项目提交到远程版本库
git fetch origin # 取得远程更新(到origin/master),但还没有合并
git merge origin/master # 把更新的内容(origin/master)合并到本地分支(master)
git pull #更新本地的代码库,pull指令其实包含了fetch(將变更复制回來)以及merge(合并)操作例如,git pull git://github.com/tom/test.git
git pull origin master # 相当于fetch和merge的合并,但分步操作更保险
# 另外版本控制系統的branch功能也很有意思,若同时修改bug,又要加入新功能,可以fork出一个branch:一个专门修bug,一个专门加入新功能,等到稳定后再merge(合并)
git branch bug_fix # 建立branch,名为bug_fix
git checkout bug_fix # 切换到bug_fix
git checkout master #切换到主要的repo
git log #可以查看每次commit的改变
git diff #可以查看最近一次改变的內容,加上参数可以看其它的改变并互相比较
git show #可以看某次的变更
git status # 查看目前工作树的状态
.gitignore文件
.gitignore,顾名思义,就是git需要忽略的文件,该文件很重要并且很实用。一般,写完代码后会执行编译、调试等操作,这期间会产生很多中间文件和可执行文件,这些都不是代码文件,是不需要git来管理的,用git add -A就会把他们都加进去,而手动添加又太麻烦了,此时就需要编写.gitignore设置忽略的文件。例如,c#的项目中.gitignore:
bin
*.suo
obj
bin和obj是编译目录,里面都不是源代码,忽略;suo文件是vs2010的配置文件,不需要。这样就可以放心的git add -A了。
tag
可以创建一个tag来设定软件开发中的关键时期,比如版本号更新的时候可以建一个“v2.0”、“v3.1”之类的标签,这样在以后回顾的时候会比较方便。tag的使用很简单,主要操作有:查看tag、创建tag、验证tag以及共享tag。
列出所有tag :git tag
列出的tag是按字母排序的,和创建时间没关系。通过添加限定查看某些tag:
git tag -l v1.*
这样就只会列出1.几的版本。
创建轻量级tag: git tag v1.0
这样创建的tag没有附带其他信息,与之相应的是带信息的tag:
git tag -a v1.0 -m 'first version'
根据名称删除tag:git tag -d v1.0
很简单,知道tag名称后:
在执行git push的时候,tag是不会上传到服务器的,共享这些tag需要添加--tags选项
花了好长时间来处理这篇文档,在处理ssh time out的问题上,别人的些github的使用居然都忽略了这个问题,话说,为什么我就遇到了这个问题,回想起来,我总能遇到一些奇怪的问题,不知为何。
[1] GitHub使用指南!(ubuntu)
[2] git与github在ubuntu下的使用
[3] Ubuntu下GitHub的使用
[4] linux解决ssh time out 问题