之前在公司使用过SVN(无甚感觉)和ClearCase(把人恶心死的东西)两种版本控制工具,都不满意。后来想自己写点东西玩,就发现了这个在国内人气还不怎么高的Git,这个由Linus实现的灵活小巧的VCS。对它的印象差不多可以这么说:“我被萌到了”。
通过采用不同类型的工作流,Git可以适用于各种大小规模的项目。这里介绍一下针对最简单的集中式工作流的配置方式,适合个人和小型团队使用。
注:本文只是一个快速流程,要详细了解Git使用方法的话,强烈推荐阅读《Pro Git》这本书(见本文末尾的参考)。流程中需要一台服务器或VPS(越来越感受到VPS这东西对程序员真有用啊)。

安装Git

Git是跨平台的,在Linux/Mac/Windows上都可以使用,它的分布式特性也使得个人可以在多种平台下方便地进行开发。
Linux
作为桌面系统用的Linux大多是Debian系的,安装很方便,执行下面命令即可:

$ sudo apt-get install git-core

Mac OS X
如果安装了Xcode 4的,里面就已经包含了Git。也可以从这里单独安装:
http://code.google.com/p/git-osx-installer/downloads/list?can=3
Windows
window平台可以安装msysgit:
http://code.google.com/p/msysgit/downloads/list?can=3
喜欢图形界面的可以再加上TortoiseGit:
http://code.google.com/p/tortoisegit/downloads/list

初次配置

执行下面两条命令来配置用户信息,他们会用于Git提交时的签名:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
建立本地Git仓库

在你的项目目录下执行:

$ git init

这会在你的项目目录下建立一个.git目录,存储所有Git所需的资源。
然后我们该往项目中添加文件了。不过在这之前,最好先建立一个名为.gitignore的文件,来把一些不需要的文件或文件夹排除掉。比如在Mac下有时会在当前目录下产生一个.DS_Store的文件,这对我们的项目是无用的,我们就可以把它排除掉,而一些文本编辑器会使用以~结尾的备份文件,也要排除掉:

.DS_Store
*~

《Pro Git》的2.2节对此规则有更详细的介绍。
然后我们就可以进行文档的添加了,如果是按照上面把忽略规则设定好了的话,可以简单地执行:

$ git add .

这会把忽略规则以外的所有文件都添加进来,也可以这样:

$ git add *.c

来添加部分文件。Git还可能会忽略.gitignore文件,需要手工添加:

$ git add .gitignore

添加好文件后,就进行第一次提交:

$ git commit -m 'initial project version'

Git要求所有地提交都要包含说明文字,-m后面地即为说明,这是一种快捷地做法,也可以只用git commit,然后在切换到的界面中编辑说明文字。

建立服务器端

Git是分布式的版本管理软件,不需要服务器端也可以使用,但若要进行多人/多设备协同开发,还是要架设一个服务器端。
首先把刚才建好的本地仓库导出为裸仓库,在项目的上级目录执行:

$ git clone --bare my_project my_project.git

这会新建一个my_project.git文件夹,差不多和项目目录.git文件夹中的内容一样。
使用scp命令(或其他方式)把它上传到你的服务器上:

$ scp -r my_project.git user@git.example.com:/var/git

服务器上存放的目录可以是任意位置,目录的访问权限其实就和通过Git访问的权限相同(使用ssh协议来访问代码),比如你的项目是私人的,就可以放在你的home目录中。
上传之后本地的my_project.git就可以删掉了。
如果你的服务器端还没有安装git的话,这时是无法通过Git获取代码的,很简单,还是通过

$ sudo apt-get install git-core

命令,在服务器端安装Git。
现在就可以在本地通过Git来获取这个项目了:

$ git clone user@git.example.com:/var/git/my_project.git

这会在当前目录下建立一个my_project文件夹,里面包含项目源码和git仓库。也可以在上面的命令后再添加一个参数,来制定这个文件夹的位置和名称。

本地仓库和服务器端的关联

我们通过git clone命令抓下来的项目会自动和抓取的服务器端关联好,这样如果你确保前面添加到库中的文件没有遗漏,就可以把它删掉,再新clone下来的项目目录下进行开发(这样最简单最懒)。
也可以手工为原项目建立关联,在最初的项目目录中执行:

$ git remote add origin user@git.example.com:/var/git/my_project.git

这条命令就是把刚才做好的服务器端仓库添加为远程仓库,名字叫origin。
这时已经可以通过git fetch origin和git push origin master命令来抓取和推送代码了,但这样会比较麻烦(git fetch不会自动将远端分支合并到当前工作的分支)。
为了之后的使用方便,要设置本地的master分支跟踪远程仓库的master分支:

$ git checkout --track origin/master
$ git checkout --set-upstream master origin/master

这条命令即让本地master分支跟踪远程仓库origin中的master分支。
设置好更总后如果我们需要从远程仓库抓取数据,只需要运行

$ git pull

即可。而本地数据变动后,要提交到远程仓库,则执行:

$ git push
使用git部署网站

以前写好了网页就用ftp工具上传到服务器上,这样子没有版本控制的发布行为可能会导致很多问题。既然现在我们用git来管理项目,那也可以用它来发布网站。
假设刚才我们的my_project是为sojingle.net做的网站,要放在服务器的/var/www/sojingle.net/htdocs/www目录下,则可以在服务器端执行

$ git clone user@git.example.com:/var/git/my_project.git /var/www/sojingle.net/htdocs/www

如果网站和git服务器在同一个主机的话,也可以使用本地文件协议来抓取:

$ git clone /var/git/my_project.git /var/www/sojingle.net/htdocs/www

不止是网站,有些软件也是通过这种方式来发布。比如HomebrewRVM,在更新本地软件时,就是利用git来更新。

新建develop分支

Git除了分布式这一大特性外,还大大强化了分支的使用。我们日常的开发工作一般不在master分支上进行,而是最好建立一个develop分支:

$ git checkout -b develop

开发时,最好基于develop分支再新建一个特性分支,比如我们要为网站添加一个新功能“标签支持”,就为其新建一个分支tag_support,新功能开发完成之后,将其合并到develop分支上:

$ git checkout develop
$ git merge tag_support

这就将新功能的代码合并到了开发主分支上,合并过程没有冲突的话,就可以删掉这个分支:

$ git branch -d tag_support

当做好了一组新功能,决定要发版本了,就用可以把develop分支合并到master分支上,git push推送到远程仓库。在服务器端的www目录中,再来执行git pull,即可把网站更新到最新版本。

推荐及参考

《Pro Git》 http://progit.org/book/zh/
这本书的作者是GitHub的员工,写得非常棒,大量的配图把Git的分支管理讲得非常清楚。而且非纸质书是免费的,已经有了中文版翻译,可以直接在线阅读。
《Git开发管理之道》 http://blog.leezhong.com/translate/2010/10/30/a-successful-git-branch.html
这篇文章主要讲的是软件开发中的分支管理模型,很值得一读。


第一个Git管理的项目

  一个很小的HTML项目,使用。Git来记录和跟踪这个项目。包括以下内容:

  创建版本库。

  添加与修改文件。

  创建新分支。

  打标签并整理版本库。

  克隆版本库。

 

创建版本库 Creating a Repository

  在Git中,版本库(.git目录)是与工作目录树并排放在同一个目录中的。

  本例中,要创建一个HTML页面,给这个项目取名为mysite。

  首先创建一个同名目录“mysite”,并进入到这个目录,然后输入命令git init。

  prompt> mkdir mysite

  prompt> cd mysite

  prompt> git init

  创建完成。

 

代码修改

  往空版本库里面添加文件:

  创建一个名为index.html的文件,并添加文本:

复制代码
<html>
<body>
<h1>Hello World</h1>
<p>My first paragraph.</p>
</body>
</html>
复制代码

 

  创建了一个简单的HTML文件后(把它放在mysite路径下),就可以开始跟踪版本了。

  要想让Git跟踪这个文件,须先让它知道这个文件,要分两步走:

  首先使用git add命令把该文件添加到版本库的索引(index);然后使用git commit命令提交。

  prompt> git add index.html

  prompt>git commit –m "add in hello world HTML"

  文件或文件列表可以作为git add命令的参数。

  git commit命令创建一个提交记录

  提交记录是存储在版本中的历史记录,每提交一次创建一个记录,并标记出代码的演进。

  Git把提交者的姓名和邮件地址,以及提交留言,都添加到提交记录中。

  参数-m,告诉Git本次提交的留言为"add in hello world HTML"。

  运行命令git log可以看到这个提交相关的信息:

  prompt> git log

  输出的第一行显示提交名称,是Git自动产生的SHA-1码。Git通过它来跟踪提交,使用该哈希码可以保证每个提交的名称都是独一无二的。

 

在项目中工作

  修改HTML文件如下:

复制代码
<html>
<head>
<title>Hello World in Git</title>
</head>
<body>
<h1>Hello World</h1>
<p>My first paragraph.</p>
</body>
</html>
复制代码

 

  修改完毕,Git可以检测到文件被修改。

  命令git status会显示工作目录树的状态,即当前的视图状态。

  prompt> git status

                    

  上面的结果表明Git监测到了修改,但还不知道如何处理它们。

  如果要提交,需要暂存(stage)修改,以准备把修改提交到版本库。

 

  Git有三个地方可以存放代码。

  第一个地方是工作目录树,编辑文件时可以直接在这里操作;

  第二个是索引(index),也就是暂存区(staging area)。暂存区是工作目录树和版本库之间的缓冲区。

  第三个,也就是最终的一个,是版本库。

 

  命令git add,可以暂存对文件刚做的修改。它跟前面添加一个新文件时使用的是同一个命令,只不过,这次它告诉Git要跟踪的是一个新的修改而非新的文件。

  prompt> git add index.html

  prompt> git status

 

  暂存修改过的index.html之后,执行命令git status可以看到,信息变为了Changes to be commited,index.html这行由红色变为了绿色。

  使用命令git commit时,不要忘记使用带-m的参数,并在参数后面加上提交留言,以解释修改的原因,如下:

  prompt> git commit –m "add <head> and <title> to index"

  git log可以快速浏览提交留言:

  prompt> git log

  prompt> git log -1

  命令中加入参数:-1可以限制命令输出的提交条目的个数。

 

理解并使用分支

  比如mysite项目的代码现在几乎可以发布了,但是还需要进行测试等工作,直到确认它达到了预期的功能和质量,而与此同时,借助分支,可以开始下一个版本的新功能的开发了。

 

  创建分支的命令是git branch,该命令需要两个参数:新分支名称和父分支名称。新创建的分支基于已经存在的父分支。

  prompt> git branch RB_1.0 master

  该命令从主分支(master branch)上创建一个叫RB_1.0的分支。

  主分支master是Git的默认分支。分支名称中的RB代表发布分支(release branch)。该前缀可以让人快速分辨出哪些分支是发布分支。

 

  现在来做一些新的改动。这些改动不影响准备发布的代码。

  在</body>之前增加如下代码:

复制代码
<ul>
<li><a href="bio.html">Biography</a></li>
</ul>
复制代码

 

  用如下命令提交这些修改:

  prompt> git commit –a

  参数-a告诉Git提交全部修改过的文件。

  (这时弹出了一个文本文件,输入的信息是提交留言)。

  现在主分支上有最新的修改,而发布分支上还是原来的代码。

  

  请切换到发布分支,做发布前的最后修改。切换分支的命令是git checkout。

  prompt> git checkout RB_1.0

  转换分支后,所使用的打开文件的编辑器会提醒文件已经被修改,重新载入文件,会发现刚才在主分支上做过的修改消失了。

  可以用git status命令来查看自己在哪一个分支上:

  prompt> git status

  

  做发布前的最后修改:在<head>标记块中添加一些描述性的元标签:

复制代码
<head>
<title>Hello World in Git</title>
<meta name="description" content="hello world in Git"/>
</head>
复制代码

 

  保存并修改该提交:

  prompt> git commit –a

 

处理发布

添加标签

  现在是发布的时候了,要给版本打个标签。

  给Git中的代码打标签,意味着在版本库的历史中标记出特定的点,这样将来就容易找到相应版本的代码。

  prompt> git tag 1.0 RB_1.0

  以上命令中的两个参数分别指明了标签的名称(1.0)和希望打标签的点(RB_1.0分支的末梢(所对应的版本或者说所对应的提交))。

  用不带参数的命令git tag可以查看版本库中的标签列表:

  prompt> git tag

 

变基

  想把RB_1.0分支上所做的修改合并到主分支上来,变基命令git rebase可以完成这项工作。

  变基是把一条分支上的修改在另一条分支的末梢重现。

  先回到主分支:

  prompt> git checkout master

  接着运行命令git rebase,后面跟一个参数:希望变基到哪条分支的末梢,就使用哪条分支名称做参数。

  prompt> git rebase RB_1.0

  变基前和变基后的版本库如下面两个图:

 

 

删除分支

  作为整理工作的一部分,删除发布分支RB_1.0。

  只要标签还在,从标签到版本树起点的一连串提交记录就都在。

  这时候删除分支只是删除了分支的名字,并不会删除分支上的任何实际内容。

  prompt> git branch –d RB_1.0

 

打补丁

  如果没有了发布分支,如何给1.0.x分支打补丁呢?很简单,只需要在打标签的地方再创建一条分支即可。

  前面创建分支的时候,命令的最后一个参数是新分支的父分支名称,现在只须把父分支名称改成发布标签名即可。命令如下:

  prompt> git branch RB_1.0.1 1.0

  prompt> git checkout RB_1.0.1

  运行命令git log快速查看历史记录:

  prompt> git log --pretty=oneline

 

为代码发布创建归档文件

  没有必要总是把历史记录(也就是Git版本库)一起发布,通常情况下,将标签对应的版本内容打包成一个tar包或者zip包就足够了。

  Git提供了git archive命令来做归档处理。

  prompt> git archive --format=tar --prefix=mysite-1.0/ 1.0 |gzip > mysite-1.0.tar.gz

  该命令中有三个参数:

  --format指明要产生tar格式的输出。

  --prefix指明包中所有东西都放到mysite-1.0/目录下。

  1.0指明要归档的标签的名称。

  最后一段命令把git archive产生的tar文件用管道输出的方法传递给命令gzip进行压缩,而压缩结果则重定向到mysite-1.0.tar.gz压缩包里。

  创建zip文件:

  prompt> git archive --format=zip –prefix=mysite-1.0/ 1.0 >mysite-1.0.zip

  生成zip格式和tar格式的命令参数几乎一样,只是改变了传递给--format的参数,而且无需通过命令gzip管道输出,直接把归档内容保存到归档文件中。

 

克隆远程版本库

  git clone带有两个参数:远程版本库的位置和存放该版本库的本地目录。

  第二个参数是可选的。

 

参考资料

  《版本控制之道——使用Git》(Pragmatic Version Control Using Git)

git config -global user.name "Your name"

git config -global user.email "you@example.com"



建立一个存放工程的文件夹


git init命令用于初始化当前所在目录的这个项目


会创建一个隐藏文件  .git

创建 main.c 文件



创建  .gitignore文件,忽略该文件里面有的项目文件

git status 查看项目状态

git add .. 

给我目前的这个项目制作一个快照snapshot(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)

git commit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。

要说一句:切记写开发日志的时候,第一行一定要是少于50字的开发概括信息,而且第二行务必是空行第三行开始才可以开始细致描述开发信息。这是因为很多版本服务系统中的email机制都会选取log中的第一行为邮件题目。


git commit -a这个命令可以直接提交所有修改,省去了你git add和git diff和git commit的工序

注意:无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文件夹,那么就要老老实实的先git add .,再git commit


git log -p


如果你觉得git log给出的信息太单薄了,可以使用git log -p,这样git不但会给出开发日志,而且会显示每个开发版本的代码区别所在。

总结:先git add你修改过的文件,再git diffgit status查看确认,然后git commit提交,然后输入你的开发日志,最后git log再次确认。

创建分支

git branch experiment 创建一个分支

直接输入git branch,不加任何后续参数,就表示让git列出所有已存在的分支。

前面带星号的分支表示当前所在的分支

切换分支到experiment

git checkout experiment

分支程序OK


git commit -a

在分支上提交工作




切换住干道

git checkout master




git commit -a


git merge experiment 

合并分支到主干道


提示合并失败

查看源文件


git迷惑之处在于它不知道是把hello world这行放在前面还是把报时功能这段放在前面。

修改冲突


重新提交

git commit -a


gitk 图形化的git管理界面


合并完分支后,对分支进行删除

git branch -d experiment 


-d,表示“在分支已经合并到主干后删除分支”。如果使用大写的 -D的话,则表示“不论如何都删除分支”,


from : http://www.cnblogs.com/mengdd/archive/2013/04/09/3009402.html

http://blog.csdn.net/wfdtxz/article/details/7973608

http://www.360doc.com/content/11/1114/13/1016783_164233224.shtml