-
git简介
git源于linux,前期linux内核维护都有linus手工合并,随着代码库的增加,手工管理渐渐不和实际。 而CVS和SVN都是商用的版本控制系统,与linux的开源精神不符,而且集中式的版本控制 不但速度慢,而且必须联网才能使用。 开始项目组启用了分布式版本控制系统BitKeeper,后被BitMover公司收回了Linux社区的免费使用权。迫使linux社区开发一套属于自己的分布式版本控制系统git。
到2008年 GitHub网站上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
-
集中式的版本控制系统与分布式版本控制系统
集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
-
开始使用git
-
gti配置
使用Git的第一件事就是设置你的name
和email
,这些就是你在提交commit
时的签名,每次提交记录里都会包含这些信息。使用git config
命令进行配置:
1
2
|
git config --global user.name
"yangszz"
git config --global user.email
"yangszz@foxmail.com"
|
使用 cat ~/.gitconfig
查看配置文件
1
2
3
4
|
$
cat
~/.gitconfig
[user]
name = yangszz
email = yangszz@foxmail.com
|
.gitconfig是git的配置文件,使用 git config --global <配置名称> <配置的值>
后会生成在用户主目录下面
-
clone或者新建
获得git仓库有两种方式,clone一个已存在的仓库和新建一个仓库
clone
1
|
git clone https:
//github
.com
/yangszz/TEST
.git
|
新建
1.创建一个目录
1
|
mkdir
test
|
2.初始化该仓库
1
|
git init
|
init之后会在当前目录下面生成一个.git文件,使用ls -la查看
-
添加、提交和备注
现在来创建一个README文件
1
|
echo
"git test"
> README.me
|
添加到本地缓存区
1
|
git add README.me
|
提交到本地仓库代码库
1
|
git commit -m
"first commit"
|
到这里就已经完成了本地代码库的提交.下面需要同步到远程代码库
-
push同步
同步之前要先添加远程仓库的地址指向
1
|
git remote add origin https:
//github
.com
/yangszz/TEST
.git
|
推送代码到远程仓库
1
|
git push -u origin master
|
这里第一次提交,之后再有修改直接使用git push
命令就可以提交
提交会提示输入github的用户名和密码
1
2
3
4
5
|
Username
for
'https://github.com'
: yangszz
Password
for
'https://yangszz@github.com'
:
No refs
in
common and none specified; doing nothing.
Perhaps you should specify a branch such as
'master'
.
Everything up-to-
date
|
-
分支与合并
版本管理系统非常重要的一个功能就是分支与合并,它使得我们能够和谐的分工合作,大幅度提高项目开发速度.
首先,来添加一个分支
1
|
git branch branch1
|
查看分支列表,带星号的是当前选择的分支
1
2
3
|
$ git branch
branch1
* master
|
切换分支
1
|
git checkout branch1
|
切换之后再次查看分支列表,星号到了分支1前面
1
2
3
|
$ git branch
* branch1
master
|
在分支1下创建一个文件,并提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$
echo
"create file "
> file1
$ git add file1
$ git status
# On branch branch1
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: file1
#
$ git commit -m
'branch1 commit'
[branch1 1f5ea41] branch1 commit
1
file
changed, 1 insertion(+)
create mode 100644 file1
|
切换到主分支master,合并刚刚创建file1
1
|
git checkout master
|
使用ls -la
发现没有file1文件,现在我们使用git merge
命令合并分支
1
2
3
4
5
6
|
$ git merge -m
'merge branch1'
branch1
Updating 0430e70..1f5ea41
Fast-forward (no commit created; -m option ignored)
file1 | 1 +
1
file
changed, 1 insertion(+)
create mode 100644 file1
|
使用ls -la
查看file1 ,使用cat file1
查看里面内容, 就是我们在分支1创建的那个文件,合并完成.
冲突修改
合并的过程难免碰到有冲突的文件,执行合并后冲突文件需要手工修改冲突后再提交
1
2
3
4
5
6
|
test
<<<<<<<
master: update file2
=======
experimental: update file2
>>>>>>> branch1
|
使用vim
编辑文件,去掉其中冲突的内容,再提交
git commit -m ‘merge update’
-
git日志
1.查看日志
git log命令可以显示所有的提交(commit):
1
|
$ git log
|
如果提交的历史纪录很长,回车会逐步显示,输入q
可以退出。
git log
有很多选项,可以使用git help log
查看,例如下面的命令就是找出所有从”v2.5“开始在fs目录下的所有Makefile的修改:
1
|
$ git log v2.5.. Makefile fs/
|
Git会根据git log命令的参数,按时间顺序显示相关的提交(commit)。
2.日志统计
如果用–stat选项使用’git log’,它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:
1
|
$ git log --stat
|
3.格式化日志
你可以按你的要求来格式化日志输出。--pretty
参数可以使用若干表现格式,如oneline
:
1
|
$ git log --pretty=oneline
|
或者你也可以使用 short
格式:
1
|
$ git log --pretty=short
|
你也可用medium
,full
,fuller
,email
或raw
。 如果这些格式不完全符合你的相求, 你也可以用--pretty=format
参数定义格式。
--graph
选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:
1
|
$ git log --graph --pretty=oneline
|
4.日志排序
日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log
命令添加顺序参数。
按默认情况,提交会按逆时间顺序显示,可以指定--topo-order
参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示):
1
|
$ git log --pretty=
format
:
'%h : %s'
--topo-order --graph
|
你也可以用 --reverse
参数来逆向显示所有提交日志。
-
git参考文档
原文 : http://www.vogella.com/tutorials/Git/article.html
译文 : http://www.cnblogs.com/zhangjing230/archive/2012/05/09/2489745.html