git 杂记

git 是个难缠的 VCS,这里也就简单记录一些东西。很多东西可能都有一些具体的环境,所以看起来非常零散。推荐两本网上都能找到的书 Git Community BookProGit,感觉前者更翔实一些。这个基本是一个还债贴

一些基本的概念

最常见的几个列在这里,别的看文档或者书籍吧!

  • bare repository 和 non-bare 的区别:前者不关联文件系统,因此不涉及“改动”一说,一般用于分享给他人,接受自己的 push,而不接受他人的 push,一般不在里面 fetch(主要是因为没文件出现 conflict 了无法 merge);后者一方面是用来工作,一方面是用来 track 其他 repository/branch 的进展,方便 merge 他人的工作;
  • push 的反义词并不是 pull,而是 fetch,因为 push 仅仅更新 meta data,对文件并不做更新,而 pull 本质是 fetch 之后 merge 的结果;
  • 通过 git remote add 将常用的几个 remote 记录下来方便以后 tracking,同时 git branch -a 可以察看本地的 branch 以及 tracking remote 的 branch。
  • 使用 merge 的 case 一般是将分支产生的新功能并入主线,常用 master 作为主线,另外开一个 dev 之类的作为新 feature 开发,这样 merge 的时候会找到两者的 LCA,然后将支线行为并入主线,对应 log 也进行合并,此后一般就可以 branch -d 支线。但是有时候支线进行缓慢,主线已经不断进行 commit,支线迫切希望能跟进主线的一些新功能或者修复的一些 bug,这个时候支线可以进行 rebase,这时将支线的修改试图并入主线更新流程,但是可能在中间某些地方卡壳(出现 conflict),这时就需要 resolve conflict 并 add/commit 并继续 rebase –continue 或者停止 –abort。

少数人协同策略

其实协同由于分布式变得非常的 tricky,很多时候多人的合作还是要 centralized server,如 github 等。少数几个人常见的 pattern 如下:

少数开发者情况下 git 的 workflow

这个看起来挺复杂的,主要原因是需要 bare repository 进行 share,这样方便每个人离线编辑,编辑结束后 push 到各自的 public respoitory 这样别人就可以 pull 回来进行 merge。如果几个人做不同的部分可能还好。如果有所重合就可能产生很麻烦的 conflict(每个人都得去 resolve)。人少可能这种情况不大会出现,一旦出现也比较方便找到人商量怎么 resolve,谁来 resolve 什么的。

如果这个时候还引入了一个 production 就更加悲摧,因为存在 production 的时候一般要保证对应环境正常,有专门账户人员来 pull 一个 staging repository 里面的代码。这个 repository 只 pull 代码,并不做别的事情。而 staging respository 专门负责去掉各种 conflict 保证业务畅通。

subtree 用例

subtree 用例

subtree 一个典型的用法是一段时间之后自己的某个 repository 里面一部分代码比较成熟或者需要额外人员参与进来,但是并不需要将自己整个项目共享出去,这时候用 subtree split 将这个可分离出去的目录切换到一个独立的分支里面,该分支理论上只含有这个目录里面的 log,然后我们可以建立一个 bare repository,比如就叫 lib.git,我们一次性 push/fetch 将原 repository 里面的对应 branch,即 lib-split 下载到 lib.git 的 master branch,这样我们其他人就能开始从这个 repository 同步了。这时我们一般为了维护这个 repository,另外 clone 出来一个 non-bare 的,为了 track 其他协同工作者的贡献,我们可以让它建立对应的 track remote,这样一旦协作 a 或者 b 觉得某个 commit 可以使用了,就能 fetch 并且 merge,在解除了各种 conflict 之后就能 push 到 lib.git 让大家更新了。同时我们还可以在原项目中 track lib.git,适时的时候 subtree merge 回原先的目录就能看到更新。同时原项目关于 lib 的更新可以再通过 subtree split 进行更新对应的 lib-split branch,这样在 lib 里面也可以 fetch/merge。

另一个用法是我们一开始是一个独立的 lib,已经存在了 lib.git,这个时候需要用 subtree add 将这个 remote/branch 添加到本地某个目录,之后通过 subtree merge 可以从 lib.git 继续更新,同时还可以通过 subtree split 产生分支供原先的 lib.git 的 pusher 进行 tracking。

git subtree 也有另外的“指代”,比如 community book 里面搞得。现在暂时用这个,觉得还不错。

——————
And the angel of the LORD said to her, I will multiply your seed exceedingly, that it shall not be numbered for multitude.

Advertisements
git 杂记

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s