上一篇Git教学介绍了基本的Git操作,如果是一人开发还好,要是多人开发,那要怎么一起play呢?
如果要跟其他人一起开发项目,就需要架Git server,让多位开发者可以透过存取远程Server的Repo来进行协同开发,共同维护同一个项目。
顺带一提,每位老手大大都建议先去Github.com开一个免费帐号练习一下。Github提供Git server,也就是远程的Repo,但是免费的限制是你的Repo都是开放的,如果不想让他人看到你的代码,就必须付费。
你也许会因为工作的关系,所以不能公开项目的代码,若是一个人开发那还好,多人开发的情况下也许又觉得要自架Git server有点麻烦,有没有经济简单的解决方案呢?
在此提供一个简单的方式,就是使用Dropbox作为Git server。
什么是Dropbox?
先在此大致简介一下Dropbox:Dropbox是一个非常棒的云端文件储存服务,把它安装好后,你就可以指定本地的任一目录 (预设名叫My Dropbox)成为有云端储存功能的目录,从此就可以在任何有安装Dropbox的电脑存取该目录内的文件 (当然你要先登入自己的帐密),所以如果你有一台以上的电脑,或有iphone、android手机等(皆有dropbox app可下载),共享文件就变得非常方便。
除此之外,你还可以在dropbox的目录里开设公开分享的目录,邀请其他朋友共同使用该目录。(还没有dropbox帐号?按此申请dropbox帐号)
到底Git+Dropbox要怎么玩?
因为dropbox可以开公用目录,因此我们可以开一个共用的目录并邀请开发团队所有成员一起共用此目录,然后把git server放在这个目录。在此假设这个共用的目录叫OurProject。
说是git server,其实就只是一个共用的Repo存在这里。为OurPeoject目录建立一个repo,请注意,记得使用加上bare参数:
git init --bare
如此这个目录就会变成Repo了,而因为加了bare,这个目录不会有.git目录,而是把原先.git目录中的东西都放进来,而且你日后在这个目录中不会看到你的程序文件。
对,不会看到你项目的程序文件哦,就是大家把最新进度从远程Repo拿下来、更新、放回去,这个目录里都看不到项目的程序文件。但是其实它已经记录了最新进度,只是需要你「拿回家」才看得到。
好,所以现在你的状况应该是:项目的代码已经先放在一个Repo了(内有程序文件),而dropbox也有一个Repo,但是用bare的方式建立的(只有git相关文件,没有你的程序文件),dropbox的Repo我们就先称之为「远程Repo」。
在dropbox目录建好远程Repo后(说是远程,但其实位在我们本机的dropbox目录,但也能说是远程,因为跟其他人同步共用中),进入你项目所在的Repo目录,并执行:
git remote add origin Dropbox的目录/OurProject
如此就会在你项目Repo中建立一个远程Repo的位址,然后把这个位址取名为origin,日后就可以把你的进度放进远程Repo了。(通常本地端的Repo预设名是master,而远程的Repo预设名就是origin)
接着要把你项目Repo的进度放进远程Repo中,供其他人取用,所以要在项目Repo目录执行Push的指令:
git push origin master
如果push有成功,你在远程Repo (dropbox目录里的OurProject目录) 看不到你的程序文件(刚刚有提过),要确定是不是真的有push进最新进度,我们需要再Pull回来看看,看现在远程Repo里是不是最新进度:
git pull origin master
一下本机一下远程,操作很复杂?
简单来说,add、commit、branch、checkout等这些都是你自己在本机跟自己玩,都是操作本机的Repo,当你要跟其他人一起玩时,你就要用push、pull,把别人的成果从远程Repo拿下来(pull),自己玩一玩(先commit进自己的Repo,再修改、再commit…),再丢上远程Repo(push),让其他人也能抓最新进度去玩。
通常我们从远程Repo拿东西下来,可以用Clone、Pull、Fetch等方法,其差异 (就我的理解) 说明如下:
Clone: 会把远程的repo整个项目抓下来,放在目前路径下的新目录中。(所以不需要先把新目录建立成Repo,就可以整包抓下来,随包附上.git目录)
Pull: 会把远程的repo整个项目抓下来,跟你目前所在的Repo及所用的Branch作合并(Merge),此指令等同Fetch+Merge。
Fetch: 会把远程的repo整个项目抓下来,但不跟你目前所用的branch合并,而是放在本地中的另一个Brance(remoteBranch)。
别人的code跟我写的冲突了!!!!!!!!!
在teamwork中一「推」一「拉」很有趣,尤其第一次在Pull别人的成果回来跟自己的成果merge时,有点怕怕的,但当你发现它自动merge作得很棒时,心情也跟着很兴奋。但冲突就这么发生了! 故事是这样的…
- 假设程序文件Sample.php本来的code是:AA
- 小明加上BB后,Pull server的code下来,跟自己的code完美的合并了(AA+BB没冲突)
- 小明commit到自己本地端Repo后,再Push回Server,目前Server最新版是:AABB
- 你现在的code是之前Pull的,也就是:AA,现在你删一个A,加一个C,成为了:AC
- 接着你先commit到本地端,然后执行Pull,要合并别人的进度,但挫屎了,产生冲突!!
冲突的原因是,Git不晓得第二个A是否要删除 (有人要删,有人要留),所以它会把这个冲突反应在Sample.php这个文件中。
开启Sample.php,你会看到类似这样的标记:
第一个A的内容 <<<<<<< 你加的C内容 ======= 第二个A的内容 后面BB的内容 >>>>>>>
<<<<<<<
跟 >>>>>>>
标记描述了产生冲突的代码,其间以=======作为区隔,第一个部份就是你新加的内容,第二个是远程的内容,你一看就会知道这边有冲突,于是你要决定怎么合并它们,手动更改文件,处理好冲突,先Commit接着Pull再看看有没有冲突发生,若还有冲突发生,就要再手动去检查产生冲突的文件,再Commit,然后再Pull看看。
直到Pull成功后,就可以Push回Server,享受整并最新进度的快感。