-
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