git下的团队合作模型及git基础知识汇集
Syncing
svn使用单个中央库来作为开发者之间沟通的桥梁,而协同合作是通过在开发者和中央库之间传递changeset来实现的。这种情况对于GIT的协同模型是有区别的,在git下每一个开发者都拥有他们自己的整库copy。取而代之于从working copy来提交变更集到一个中央库中,git允许你在不同的repo之间分享整个分支。
下面的命令允许你管理你和其他repo之间的连接,通过push 一个分支到其他的repo你实现发布本地history,通过pull一个branch到你自己的repo来获取他人的contribution.
Git remote
git remote命令允许你来create,view和delete和其他repo的connections. Remote connections可以这样来理解: 他们更像是bookmarks,而不是其他repo的直接连接。
例如,下面的图显示两个remote connections,一个是从你的repo到central repo,而另一个则是你和John的repo的连接
常用命令: git remote -v/git remote add <name> <url>/git remote rm <name>/git remote rename <old-name> <new-name>
注意:
git设计的目标是它会给每一个开发者一个完全独立的开发环境。这意味着信息并不会自动地在repo之间自动流转。相反地,开发人员需要手工的pull upstream commits来获取到local repo中,或者手工地push local commits到central repo.这个git remote命令实际上仅仅是一种传递URL的方便方法到这些sharing目的的commands.
Origin Remote
当你通过git clone来clone一个repo时,git会自动地创建一个被称为origin的remote connection指向到被cloned的repo.这对于开发者创建central repo的一份拷贝是非常方便的,因为这为开发者提供一种便捷pull upstream changes或者publish local commits的方法。这种行为也是为什么大多数git-based项目称他们的中央库为origin的原因。
Repository URLs
Git提供很多种方法去引用一个remote repo.两种最简单的方式是HTTP或者SSH.
HTTP方法是一种非常简单的允许匿名只读访问repo的方式,比如
http://host/path/to/repo.git
但是,通常是不允许push commit到一个http地址url上面的。需要读写一个repo,你必须使用ssh方式:
ssh://user@host/path/to/repo.git
你必须要有一个在host machine上的合法ssh帐号。
除了origin,创建一个连接到你的同事的repo上去的连接也是非常必要和方便的。比如,如果你的搭档John,维护了一个可以公开访问的repo在dev.example.com/john.git这个url的话,你可以通过过下面的命令增加一个connection
git remote add john http://dev.example.com/john.git
有了上面这种访问其他开发者的repo的简单方式后,这就允许人们绕开central repo来私下协同。这种模式对于小团队做大项目时是非常有用和高效的!!
git fetch
git fetch这个命令从一个remote repo来向你的local repo导入commits。这些commits导入后的结果是他们被保存在一个remote branch,而不是local branch上。这种模式就让你在集成remote commit之前来评审这些变更有了机会!
git fetch <remote> <branch>
Fetching这个动作完成的是当你希望查看其他人的工作时需要做的工作。既然被fetched的content是以一个remote branch来呈现的,那么这个动作对于你的local dev是没有任何影响的。这也就是说fetching是一个在外部变更落地前来review评审的安全的方法。
Remote branch
Remote branch和local branch是类似的,不过remote branch是代表着是来自于其他人的repo的commit。你可以像checkout一个local branch一样来checkout一个remote branch,但是这样做你将被置入detached HEAD state(就像checkout一个old commit一样的效果)。你可以把他们想象成一个read-only的分支。要想查看有哪些remote branches,只需要git branch -r命令参数即可。remote branch总是冠之以remote connection name,所以你永远不会和本地branch搞混淆。比如,下面的代码片段展示了remote branch的情况:
git branch -r # origin/master # origin/develop # origin/some-feature
你可以通过git checkout origin/develop;git log来查看这些remote分支上有了哪些commit改动。如果你确认这些commit可以进到你的local branch上的话,你只需要git merge即可。
所以,对于git来说,你需要本地和远程的remo同步的话,你需要有两步:1.fetch,2.merge
而git pull则一步完成了上面的两个工作。