与远程仓库进行共同作业
本地仓库的操作已经基本掌握,下面就将介绍与远程仓库进行共同作业的方法。
这里将按照一般开发者进行Linux内核上游开发时的流程来说明。大致流程如下。
·将上游的仓库复制到本地。
·不断追踪上游仓库的最新状态,同时在本地仓库进行开发。
·以补丁的形式将开发成果提交维护人员及开发邮件列表。
复制仓库
当进行上游开发时,首先要复制各维护人员所管理的开发仓库(远程仓库),建立本地仓库。在Git中将这一步称为“复制”。复制是通过git clone命令来进行的。例如,复制Linus树的仓库的命令为:
$git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
复制Linus树时要下载1GB以上的数据,因此需要花费很长时间,仅在必要时再进行这个操作。这里将之前生成的hello仓库当做远程仓库,将其复制到其他位置。
$cd
$git clone hello local
生成local目录后,里面包含的文件就与hello目录完全相同。进入local目录,使用git log确认记录,就可以发现至今为止的记录已完全复制过来。
建立本地分支
请在本地仓库执行git branch命令。在这一阶段只有master分支。这个master分支是在远程仓库(即hello仓库)的master分支关联的基础上,在本地仓库生成的分支。关联,就是指此后与远程仓库进行同步时,hello仓库在master分支下所作的改动会合并到这个分支。因此,如果在master分支中进行开发,进行同步时两个仓库所作的更改就有可能发生冲突。为了避免发生这种情况,就要事先从master分支中分出一个用于在本地进行开发的分支work。
$git checkout-b work
git checkout-b命令将在创建分支的同时进行检查(针对当前分支的最新修改)。
追踪分支
为了便于说明,上文的描述比较简单,可能会让人认为本地仓库的master分支是hello仓库master分支的副本,而其实并不是这样。hello仓库的master分支,在本地仓库是以origin/master的标题出现的。这个分支才完全是hello仓库master分支的副本,这种分支称为“追踪分支”。在使用git pull对仓库进行同步时,首先同步的就是这个追踪分支。然后,把追踪分支的提交合并到追踪分支所关联的本地分支中。
通过执行git branch-r命令,可以显示追踪分支的列表。下方显示的就是在本地仓库中执行这一命令的输出结果(见图1-9)。
$git branch-r
origin/HEAD->origin/master
origin/master
origin/ver1x
远程仓库的相关信息可以使用git remote show命令来确认。虽然可以设置多个远程仓库,但仅设置一个时其默认名称为origin,因此执行该命令时可以指定origin。
图 1-9 本地分支的建立
$git remote show origin
*remote origin
URL:/home/munehiro/hello
Remote branch merged with'git pull'while on branch master
master
Tracked remote branches
master
ver1x
这里的输出具有下列含义。
·远程仓库origin的URL:/home/munehiro/hello
·在本地分支master上执行git pull时合并的远程分支:master
·追踪分支:master, ver1x
这些信息是通过.git/config文件设置的。相关各部分的内容(section)如下所示。[remote"origin"]部分规定了远程仓库的URL、远程仓库上的分支、追踪分支之间的关系。[branch"master"]部分规定了合并到本地分支master的远程分支为origin仓库(即hello仓库)的master分支。
$cat.git/confg
……
[remote"origin"]
fetch=+refs/heads/:refs/remotes/origin/
url=/home/munehiro/hello
[branch"master"]
remote=origin
merge=refs/heads/master
……
追踪分支是为了追踪远程仓库而存在的,因此不能在这个分支上进行本地修改(从技术上是可以的,但并不推荐)。
以追踪分支为起点建立本地分支后,本地分支就被追踪分支关联。例如,可以通过下列命令,建立与master分支的追踪分支相关联的本地分支master2。
$git branch master2 origin/master
本地分支master及master2虽然被关联,但二者完全是本地分支。因此也可以直接在上面进行本地开发。但是,由于需要通过git pull进行合并,因此如果发生了冲突,就必须在这时候解决。
与远程仓库同步
想要看到在远程仓库上不断进行的开发,可以在hello仓库的master分支下对thanks.c进行如下修改并提交(将负(-)的行改为正(+)的行)。
-return 0;
+return 2;
$git commit-a
将Modify return value of thanks.c into 2作为提交信息。
使用git pull命令可以让本地仓库与远程仓库的最新状态保持同步。在本地仓库执行下列命令后,在hello仓库的master分支下进行的修改就会全部整合到本地仓库的master分支。
$git checkout master
$git pull
这时使用git log查看记录,可以发现hello仓库的提交Modify return value of thanks.c into 2已经整合并完成同步。