月度归档:2013年09月

使用Github建立一个公共仓库

Github注册

Githut建立仓库

填写仓库名字,描述可以选填,然后选择Public(只能选Public,意思大家都可以看到,Private是收费版提供的功能)。

Initialize this repository with a README如果勾上,就相当于对仓库做了初始化操作。客户端设置时就需要先git clone下来。这里先不选。
Githut获取仓库地址
这里给出了SSH的地址。还给出了如何创建一个新的仓库的方法或推送一个已经存在的仓库到Github。

不过在操作之前需要先把公钥送到服务器,否则无法通信。

root@vfeelit:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

直接使用ssh-keygen生成秘钥对,提示密码是直接回车表示不使用密码。

把/root/.ssh/id_rsa.pub内容拷贝下来,然后到Github的你的账户设置中设置公钥:
Github添加SSH Key
把公钥贴进来。这样,客户端就可以和Github通信了。

root@vfeelit:~# cd ifeeline/
root@vfeelit:~/ifeeline# touch README.md
root@vfeelit:~/ifeeline# git init					##初始化,本地生成.git文件夹
Initialized empty Git repository in /root/ifeeline/.git/
root@vfeelit:~/ifeeline# git add README.md		##添加任务
root@vfeelit:~/ifeeline# git commit -m "first commit"	##添加到版本库
[master (root-commit) f75b3fc] first commit
 0 files changed
 create mode 100644 README.md

##以上操作在本地完成,然后把本地库和远程进行关联
root@vfeelit:~/ifeeline# git remote add origin git@github.com:vfeelit/ifeeline.git
root@vfeelit:~/ifeeline# git push -u origin master  	##把本地库进行推送
The authenticity of host 'github.com (192.30.252.129)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 203 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:vfeelit/ifeeline.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

实验:

##新建一个文件
root@vfeelit:~/ifeeline# vi index.php
root@vfeelit:~/ifeeline# ls
index.php  README.md

##添加新文件
root@vfeelit:~/ifeeline# git add index.php
root@vfeelit:~/ifeeline# git status -s
A  index.php

##提交新文件
root@vfeelit:~/ifeeline# git commit -m "add new file index.php"
[master 68a0842] add new file index.php
 1 file changed, 2 insertions(+)
 create mode 100644 index.php

##同步到Github
root@vfeelit:~/ifeeline# git push -u origin master
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
Counting objects: 8, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 512 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@github.com:vfeelit/ifeeline.git
   f75b3fc..68a0842  master -> master
Branch master set up to track remote branch master from origin.

从上面操作可知,Github上的是本地的一份镜像,本地修改完毕后需要推送过去。多人协作时可以先克隆下来,然后每人在本地都有一份完整拷贝,修改后进行推送。

永久链接:http://blog.ifeeline.com/999.html

使用Git创建第一个项目

例子来自 版本控制之道 – 使用Git,这个书对Git的介绍非常通俗易懂。仅做些笔记。

Git的安装这里就不做笔记了。

## Git安装好之后必须设置的有两项:
root@vfeelit:~# git config --global user.name "Jerry Sha"
root@vfeelit:~# git config --global user.email "vfeelit@qq.com"

##查看设置是否成功
root@vfeelit:~# git config --global --list
user.name=Jerry Sha
user.email=vfeelit@qq.com

所有可设置的值超过130个。其中大部分很少用得上。不过有一个例外:关于用不同颜色显示Git命令的输出。

如想在命令行窗口中使用不同的颜色显示不同类型的内容,需要将color.ui的值设为auto或always。

root@vfeelit:~# git config --global color.ui "always"

root@vfeelit:~# git config --list
color.ui=always
user.name=Jerry Sha
user.email=vfeelit@qq.com

1 创建版本库
Git中,版本库(.git目录)与工作目录并排放在同一个目录中。创建版本库,进入任意目录(存放源代码的目录),运行git init:

root@vfeelit:~# mkdir mysite
root@vfeelit:~# cd mysite
root@vfeelit:~/mysite# git init
Initialized empty Git repository in /root/mysite/.git/

创建完成(建立了一个空版本库)。git init会创建一个.git目录。这个目录用来存放版本库的全部元数据。mysite目录作为工作目录树,存放从版本库中检出的代码。

2 代码修改
创建一个叫index.html的文件,内容如下:

vi index.html
<html>
<body>
        <h1>Hello World!</h1>
</body>
</html> 

要想让Git跟踪这个文件,须先使用git add命令把该文件添加到版本库的索引(index),然后使用git commit命令提交到版本库。

root@vfeelit:~/mysite# git add index.html
root@vfeelit:~/mysite# git commit -m "1. add in hello world HTML"
[master (root-commit) 8785596] 1. add in hello world HTML
 1 file changed, 5 insertions(+)
 create mode 100644 index.html

git commit命令创建一个提交记录。提交记录是存储在版本中的历史记录,每提交一次创建一个记录,并标记出代码的演进。Git把提交者的姓名和邮件地址,已经提交留言,都添加到提交记录中。

命令中参数-m的所用是,告诉Git本次提交的提交的留言。运行命令git log可以看到这个提交的信息:

root@vfeelit:~/mysite# git log
commit 8785596828af89582dfd15bef15832818200cbc4
Author: Jerry Sha <vfeelit@qq.com>
Date:   Wed Sep 11 01:30:21 2013 +0800

    1. add in hello world HTML

3 在项目中工作
编辑index.html,添加head标签

vi index.html
<html>
<head>
        <title>Hello World in Git</title>
</head>
<body>
        <h1>Hello World!</h1>
</body>
</html>

Git可以检查到文件被修改。命令git status会显示工作目录树的状态。

root@vfeelit:~/mysite# git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   index.html
#
no changes added to commit (use "git add" and/or "git commit -a")

输出结果表明Git检测到了修改。修改过的文件在Changed but not updated下列出来,如果要提交,需要先使用git add或git commit –a。

Git中有三个存放文件的地方,第一是工作目录,第二是暂存区(index),第三是版本库。暂存区存放的是打算要提交到版本库的修改。一般,先在工作区修改文件,然后使用git add同步到暂存区,然后使用git commit提交的版本库。

root@vfeelit:~/mysite# git add index.html
root@vfeelit:~/mysite# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   index.html
#

git add之后,执行git status可以看到,输出信息变成了Changes to be committed。

使用命令git commit时,不要忘记带-m参数:

##可以多次使用m参数写多条留言
root@vfeelit:~/mysite# git commit -m "2. add <head> and <title> to index" -m "This allows for a more semantic document."
[master 8b79b15] 2. add <head> and <title> to index
 1 file changed, 3 insertions(+)

##参看日志,后面的-1表示显示最近的1条日志
root@vfeelit:~/mysite# git log -1
commit 8b79b151f02b89a12e4f5006d49ec2cbe1e80cad
Author: Jerry Sha <vfeelit@qq.com>
Date:   Wed Sep 11 01:51:37 2013 +0800

    2. add <head> and <title> to index
    
    This allows for a more semantic document.

4 理解并使用分支
用两种分支比较有用:用来支持项目的不同发布版本的分支,已经用来支持一个特定功能的开发的分支。

分支可以为要发布的代码保留一份拷贝,所以无须停止正在开发的工作。创建分支的命令是git branch,该命令需要两个参数:新分支名称和父分支名称。

root@vfeelit:~/mysite# git branch RB_1.0 master

该命令从主分支上创建一个叫RB_1.0的分支。分支名称中的RB代表发布分支(release branch)。该前缀可以让人快速分辨出哪些分支是发布分支。

注意:这个时候master 和 RB_1.0指向同一个提交,分支实际上是.git/refs/heads下的一个引用文件:

root@vfeelit:~/mysite/.git/refs/heads# ls
master  RB_1.0
root@vfeelit:~/mysite/.git/refs/heads# cat master 
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad
root@vfeelit:~/mysite/.git/refs/heads# cat RB_1.0 
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad

master和RB_1.0都可以基于这个提交继续开发,但是master和RB_1.0都会指向它们最新的提交,如果一个分支没有类似的master和RB_1.0的引用(或叫指针),那么该分支就叫端头分支。可以把分支进行合并,分支合并后分支的引用是可以删除的(实际仅仅是一个引用文件而已),当然,分支合并可能会有冲突。

接下来继续在主分支上修改代码(它不影响发布分支):

##在index.html的</body>前添加:
        <ul>
                <li><a href="bio.html">Biography</a></li>
        </ul>

##提交
git commit -a

命令git commit带了a参数,告诉Git提交全部修过过的文件。此时主分支上有3个提交。发布分支上还是原来的代码(两个分支),切换到发布分支:

root@vfeelit:~/mysite# git checkout RB_1.0
Switched to branch 'RB_1.0'
root@vfeelit:~/mysite# cat index.html 
<html>
<head>
	<title>Hello World in Git</title>
</head>
<body>
	<h1>Hello World!</h1>
</body>
</html>

##在发布分支上做发布前最后修过,在head中添加meta
vi index.html
<head>
        <title>Hello World in Git</title>
        <meta name="description" content="hello world in Git" />
</head>

##然后提交
root@vfeelit:~/mysite# git commit -a -m "3 at branch."
[RB_1.0 973ec20] 3 at branch.
 1 file changed, 1 insertion(+)

这个时候两个分支都有三个提交。这个时候需要发布了。为此要给这个版本打个标签。

5 处理发布
给Git中的代码打标签,意味着在版本库的历史中标记出特定的点,这样将来就容易找到相应的代码。因为要做1.0版的发布,所以打一个名为1.0的标签:

root@vfeelit:~/mysite# git tag 1.0 RB_1.0

命令的两个参数指明了标签的名称和希望打标签的点,分别是1.0和RB_1.0分支的最新指向。用不带参数的git tag可以查看标签列表:

root@vfeelit:~/mysite# git tag
1.0

Git分支

master分支继续作为2.0的开发。现在要把RB_1.0分支上所做的修改合并到主分支上来。变基命令git rebase可以完成这项工作。变基是把一条分支上的修改在另一条分支末重现。

##切换回到主分支
root@vfeelit:~/mysite# git checkout master
Switched to branch 'master'

##接着运行命令git rebase,后跟一个参数,表示主分支变基到哪条分支(就是父节点是哪个点)
root@vfeelit:~/mysite# git rebase RB_1.0
First, rewinding head to replay your work on top of it...
Applying: 3. Maste to branch.

Git分支 变基
这里发生的事情是,master分支的最新提交的父亲改为了RB_1.0分支的最后提交,并且把它们的差异进行了合并(可能发生冲突,这里没有)并提交,当前master指向了这个最新的提交,可以通过git log查看主分支现在有四个提交。注意看虚线部分,这个对象此时并没有被删除,只是没有了引用指向它。

此时,RB_1.0这个分支是没有用了的(已经打了标签),可以删除(实际就一个引用文件)。

root@vfeelit:~/mysite# git branch -d RB_1.0
Deleted branch RB_1.0 (was 973ec20).

如果将来要给1.0.x分支打补丁,只需要从打标签的地方再创建一条分支即可。

root@vfeelit:~/mysite# git branch RB_1.0.1 1.0
root@vfeelit:~/mysite# git checkout RB_1.0.1
Switched to branch 'RB_1.0.1'

运行命令git log快速查看历史记录,可以看到RB_1.0.1分支上只有3个提交(不包含主分支上的最新提交):

root@vfeelit:~/mysite# git log --pretty=oneline
973ec20246a45fa863d7017e35386aef7a5b1d7e 3 at branch.
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad 2. add <head> and <title> to index
8785596828af89582dfd15bef15832818200cbc4 1. add in hello world HTML

归档打包:

root@vfeelit:~/mysite# git archive --format=tar \
> --prefix=mysite-1.0 1.0 \
> | gzip > mysite-1.0.tar.gz

第一个参数format指明要产生tar格式的输出,第二个,prefix指明包中所有东西都放到mysite-1.0目录下。最后,1.0指明需要归档的标签名称。

6 克隆远程版本库

git clone git://github.com………  本地名称

永久链接:http://blog.ifeeline.com/993.html